ArrayRepository::remove()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2.032

Importance

Changes 2
Bugs 0 Features 1
Metric Value
cc 2
eloc 4
c 2
b 0
f 1
nc 2
nop 1
dl 0
loc 7
ccs 4
cts 5
cp 0.8
crap 2.032
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace midorikocak\nanodb;
6
7
use Exception;
8
use midorikocak\arraytools\ArrayValidator;
9
use midorikocak\querymaker\QueryInterface;
10
11
use function array_key_exists;
12
13
/**
14
 * Repository is a class that receives arrays as input data and returns array of arrays
15
 */
16
class ArrayRepository implements RepositoryInterface
17
{
18
    private DatabaseInterface $db;
19
    private ?ArrayValidator $validator;
20
    private $tableName;
21
22 6
    public function __construct(
23
        string $tableName,
24
        DatabaseInterface $db,
25
        ?array $schema = null,
26
        ?ArrayValidator $validator = null
27
    ) {
28 6
        $this->db = $db;
29 6
        $this->tableName = $tableName;
30 6
        $this->validator = $validator ?? new ArrayValidator();
31 6
        if ($schema) {
32
            $this->validator->schema($schema);
33
        }
34 6
    }
35
36 2
    private function checkData($data): void
37
    {
38 2
        if (!$this->validator->validate($data)) {
0 ignored issues
show
Bug introduced by
The method validate() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

38
        if (!$this->validator->/** @scrutinizer ignore-call */ validate($data)) {

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
39
            throw new Exception('Invalid data');
40
        }
41 2
    }
42
43
    /**
44
     * @inheritDoc
45
     */
46 2
    public function save($data): array
47
    {
48 2
        if (array_key_exists('id', $data)) {
49 1
            $this->checkData($data);
50
51 1
            $id = $data['id'];
52
53 1
            unset($data['id']);
54
55 1
            $this->db->update($this->tableName, $data)->where('id', $id)->execute();
56
57 1
            return $this->read($id);
58
        }
59
60 1
        $this->checkData($data);
61 1
        $this->db->insert($this->tableName, $data)->execute();
62
63 1
        $lastInsertId = $this->db->lastInsertId();
64 1
        return $this->db->select('users')->where('id', $lastInsertId)->fetch();
65
    }
66
67
    /**
68
     * @inheritDoc
69
     */
70 5
    public function read(?string $id = null): array
71
    {
72 5
        if ($id) {
73 5
            $this->db->select($this->tableName)->where('id', $id)->execute();
74
        } else {
75
            $this->db->select($this->tableName)->execute();
76
        }
77 5
        return $this->db->fetch();
78
    }
79
80 1
    public function readAll(?QueryInterface $query = null): array
81
    {
82 1
        if ($query !== null) {
83
            $db = $this->db->query($query);
84
        } else {
85 1
            $db = $this->db->select($this->tableName);
86
        }
87 1
        $db->execute();
88 1
        return $db->fetchAll();
89
    }
90
91
    /**
92
     * @inheritDoc
93
     */
94 1
    public function remove($data): int
95
    {
96 1
        if (array_key_exists('id', $data)) {
97 1
            $this->db->delete($this->tableName)->where('id', $data['id'])->execute();
98 1
            return $this->db->rowCount();
99
        }
100
        return 0;
101
    }
102
}
103