Completed
Pull Request — master (#384)
by Kristof
03:59
created

DBALLookupService   A

Complexity

Total Complexity 2

Size/Duplication

Total Lines 73
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Importance

Changes 0
Metric Value
wmc 2
lcom 1
cbo 8
dl 0
loc 73
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A itemsOwnedByUser() 0 46 1
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
            ->setMaxResults($limit->toNative())
54
            ->setFirstResult($start->toNative());
55
56
        $queryBuilder->setParameter(Columns::UID, $userId);
57
58
        $parameters = $queryBuilder->getParameters();
59
60
        $results = $queryBuilder->execute();
61
62
        // @todo transform @id here to an object that has a full URL
63
        // when json-encoded
64
        $organizers = array_map(
65
            function ($resultRow) {
66
                return [
67
                    '@id' => $this->iriGenerator->iri($resultRow[Columns::ID]),
68
                    '@type' => 'Organizer',
69
                ];
70
            },
71
            $results->fetchAll(PDO::FETCH_ASSOC)
72
        );
73
74
        $q = $this->connection->createQueryBuilder();
75
76
        $totalItems = $q->resetQueryParts()->select('COUNT(*) AS total')
77
            ->from($this->tableName->toNative())
78
            ->where($itemIsOwnedByUser)
79
            ->setParameters($parameters)
80
            ->execute()
81
            ->fetchColumn(0);
82
83
        return new PartOfCollection($organizers, new Natural($totalItems));
84
    }
85
}
86