Completed
Pull Request — master (#384)
by Kristof
08:53
created

DBALLookupService::itemsOwnedByUser()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 47

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 47
rs 9.1563
c 0
b 0
f 0
cc 1
nc 1
nop 3
1
<?php
2
3
namespace CultuurNet\UDB3\MyOrganizers\ReadModel\Doctrine;
4
5
use CultuurNet\UDB3\Iri\IriGeneratorInterface;
6
use CultuurNet\UDB3\MyOrganizers\MyOrganizersLookupServiceInterface;
7
use CultuurNet\UDB3\MyOrganizers\PartOfCollection;
8
use Doctrine\DBAL\Connection;
9
use PDO;
10
use ValueObjects\Number\Natural;
11
use ValueObjects\StringLiteral\StringLiteral;
12
13
class DBALLookupService implements MyOrganizersLookupServiceInterface
14
{
15
    use DBALHelperTrait;
16
17
    /** @var StringLiteral */
18
    private $tableName;
19
20
    /**
21
     * @var IriGeneratorInterface
22
     */
23
    private $iriGenerator;
24
25
    /**
26
     * @param Connection $connection
27
     * @param StringLiteral $tableName
28
     */
29
    public function __construct(
30
        Connection $connection,
31
        StringLiteral $tableName,
32
        IriGeneratorInterface $iriGenerator
33
    ) {
34
        $this->connection = $connection;
35
        $this->tableName = $tableName;
36
        $this->iriGenerator = $iriGenerator;
37
    }
38
39
    public function itemsOwnedByUser(
40
        string $userId,
41
        Natural $limit,
42
        Natural $start
43
    ): PartOfCollection {
44
        $queryBuilder = $this->connection->createQueryBuilder();
45
46
        $expr = $this->connection->getExpressionBuilder();
47
        $itemIsOwnedByUser = $expr->eq(Columns::UID, $this->parameter(Columns::UID));
48
49
        $queryBuilder->select(Columns::ID)
50
            ->from($this->tableName->toNative())
51
            ->where($itemIsOwnedByUser)
52
            ->orderBy(Columns::UPDATED, 'DESC')
53
            ->addOrderBy(Columns::ID, 'ASC')
54
            ->setMaxResults($limit->toNative())
55
            ->setFirstResult($start->toNative());
56
57
        $queryBuilder->setParameter(Columns::UID, $userId);
58
59
        $parameters = $queryBuilder->getParameters();
60
61
        $results = $queryBuilder->execute();
62
63
        // @todo transform @id here to an object that has a full URL
64
        // when json-encoded
65
        $organizers = array_map(
66
            function ($resultRow) {
67
                return [
68
                    '@id' => $this->iriGenerator->iri($resultRow[Columns::ID]),
69
                    '@type' => 'Organizer',
70
                ];
71
            },
72
            $results->fetchAll(PDO::FETCH_ASSOC)
73
        );
74
75
        $q = $this->connection->createQueryBuilder();
76
77
        $totalItems = $q->resetQueryParts()->select('COUNT(*) AS total')
78
            ->from($this->tableName->toNative())
79
            ->where($itemIsOwnedByUser)
80
            ->setParameters($parameters)
81
            ->execute()
82
            ->fetchColumn(0);
83
84
        return new PartOfCollection($organizers, new Natural($totalItems));
85
    }
86
}
87