Test Setup Failed
Push — master ( 948172...201d68 )
by Fernando
05:02
created

TaskRepository::search()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 18
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 4.0466

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 13
c 1
b 0
f 0
nc 4
nop 3
dl 0
loc 18
ccs 12
cts 14
cp 0.8571
crap 4.0466
rs 9.8333
1
<?php
2
3
declare(strict_types=1);
4
5
namespace App\Repository;
6
7
use App\Exception\TaskException;
8
use App\Entity\Task;
9
10
final class TaskRepository extends BaseRepository
11
{
12 8
    public function checkAndGetTask(int $taskId, int $userId): Task
13
    {
14 8
        $query = '
15
            SELECT * FROM `tasks` 
16
            WHERE `id` = :id AND `userId` = :userId
17
        ';
18 8
        $statement = $this->getDb()->prepare($query);
19 8
        $statement->bindParam('id', $taskId);
20 8
        $statement->bindParam('userId', $userId);
21 8
        $statement->execute();
22 8
        $task = $statement->fetchObject(Task::class);
23 8
        if (!$task) {
24 4
            throw new TaskException('Task not found.', 404);
25
        }
26
27 4
        return $task;
28
    }
29
30 1
    public function getAllTasks(): array
31
    {
32 1
        $query = 'SELECT * FROM `tasks` ORDER BY `id`';
33 1
        $statement = $this->getDb()->prepare($query);
34 1
        $statement->execute();
35
36 1
        return (array) $statement->fetchAll();
37
    }
38
39 1
    public function getTasksByUserId(int $userId): array
40
    {
41 1
        $query = 'SELECT * FROM `tasks` WHERE `userId` = :userId ORDER BY `id`';
42 1
        $statement = $this->getDb()->prepare($query);
43 1
        $statement->bindParam('userId', $userId);
44 1
        $statement->execute();
45
46 1
        return (array) $statement->fetchAll();
47
    }
48
49
    public function getQueryTasksByPage(): string
50
    {
51
        return "
52
            SELECT *
53
            FROM `tasks`
54
            WHERE `userId` = :userId
55
            AND `name` LIKE CONCAT('%', :name, '%')
56
            AND `description` LIKE CONCAT('%', :description, '%')
57
            AND `status` LIKE CONCAT('%', :status, '%')
58
            ORDER BY `id`
59
        ";
60
    }
61
62
    public function getTasksByPage(
63
        int $userId,
64
        int $page,
65
        int $perPage,
66
        ?string $name,
67
        ?string $description,
68
        ?string $status
69
    ): array {
70
        $params = [
71
            'userId' => $userId,
72
            'name' => is_null($name) ? '' : $name,
73
            'description' => is_null($description) ? '' : $description,
74
            'status' => is_null($status) ? '' : $status,
75
        ];
76
        $query = $this->getQueryTasksByPage();
77
        $statement = $this->getDb()->prepare($query);
78
        $statement->bindParam('userId', $params['userId']);
79
        $statement->bindParam('name', $params['name']);
80
        $statement->bindParam('description', $params['description']);
81
        $statement->bindParam('status', $params['status']);
82
        $statement->execute();
83
        $total = $statement->rowCount();
84
85
        return $this->getResultsWithPagination(
86
            $query,
87
            $page,
88
            $perPage,
89
            $params,
90
            $total
91
        );
92
    }
93
94 4
    private function getSearchTasksQuery(?int $status): string
95
    {
96 4
        $statusQuery = '';
97 4
        if ($status === 0 || $status === 1) {
98 2
            $statusQuery = 'AND `status` = :status';
99
        }
100
101 4
        return "
102
            SELECT * FROM `tasks`
103 4
            WHERE `name` LIKE :name AND `userId` = :userId ${statusQuery}
104
            ORDER BY `id`
105
        ";
106
    }
107
108 4
    public function search(string $tasksName, int $userId, ?int $status): array
109
    {
110 4
        $query = $this->getSearchTasksQuery($status);
111 4
        $name = '%' . $tasksName . '%';
112 4
        $statement = $this->getDb()->prepare($query);
113 4
        $statement->bindParam('name', $name);
114 4
        $statement->bindParam('userId', $userId);
115 4
        if ($status === 0 || $status === 1) {
116 2
            $statement->bindParam('status', $status);
117
        }
118 4
        $statement->execute();
119 4
        $tasks = (array) $statement->fetchAll();
120 4
        if (!$tasks) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $tasks of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
121
            $message = 'No Tasks were found with that name.';
122
            throw new TaskException($message, 404);
123
        }
124
125 4
        return $tasks;
126
    }
127
128 1
    public function create(Task $task): Task
129
    {
130 1
        $query = '
131
            INSERT INTO `tasks`
132
                (`name`, `description`, `status`, `userId`, `createdAt`)
133
            VALUES
134
                (:name, :description, :status, :userId, :createdAt)
135
        ';
136 1
        $statement = $this->getDb()->prepare($query);
137 1
        $name = $task->getName();
138 1
        $desc = $task->getDescription();
139 1
        $status = $task->getStatus();
140 1
        $userId = $task->getUserId();
141 1
        $created = $task->getCreatedAt();
142 1
        $statement->bindParam('name', $name);
143 1
        $statement->bindParam('description', $desc);
144 1
        $statement->bindParam('status', $status);
145 1
        $statement->bindParam('userId', $userId);
146 1
        $statement->bindParam('createdAt', $created);
147 1
        $statement->execute();
148
149 1
        $taskId = (int) $this->getDb()->lastInsertId();
150
151 1
        return $this->checkAndGetTask((int) $taskId, (int) $userId);
152
    }
153
154 1
    public function update(Task $task): Task
155
    {
156 1
        $query = '
157
            UPDATE `tasks`
158
            SET 
159
                `name` = :name, 
160
                `description` = :description, 
161
                `status` = :status, 
162
                `updatedAt` = :updatedAt
163
            WHERE `id` = :id AND `userId` = :userId
164
        ';
165 1
        $statement = $this->getDb()->prepare($query);
166 1
        $id = $task->getId();
167 1
        $name = $task->getName();
168 1
        $desc = $task->getDescription();
169 1
        $status = $task->getStatus();
170 1
        $userId = $task->getUserId();
171 1
        $updated = $task->getUpdatedAt();
172 1
        $statement->bindParam('id', $id);
173 1
        $statement->bindParam('name', $name);
174 1
        $statement->bindParam('description', $desc);
175 1
        $statement->bindParam('status', $status);
176 1
        $statement->bindParam('userId', $userId);
177 1
        $statement->bindParam('updatedAt', $updated);
178 1
        $statement->execute();
179
180 1
        return $this->checkAndGetTask((int) $id, (int) $userId);
181
    }
182
183 1
    public function delete(int $taskId, int $userId): void
184
    {
185 1
        $query = 'DELETE FROM `tasks` WHERE `id` = :id AND `userId` = :userId';
186 1
        $statement = $this->getDb()->prepare($query);
187 1
        $statement->bindParam('id', $taskId);
188 1
        $statement->bindParam('userId', $userId);
189 1
        $statement->execute();
190 1
    }
191
}
192