BaseDataset::addMacroMethods()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 2.0078

Importance

Changes 0
Metric Value
dl 0
loc 13
ccs 7
cts 8
cp 0.875
rs 9.8333
c 0
b 0
f 0
cc 2
nc 2
nop 0
crap 2.0078
1
<?php
2
3
namespace Andreshg112\DatosAbiertos\Datasets;
4
5
use Illuminate\Support\Str;
6
use allejo\Socrata\SodaClient;
7
use allejo\Socrata\SodaDataset;
8
use Spatie\Macroable\Macroable;
9
10
abstract class BaseDataset
11
{
12
    use Macroable;
13
14
    const SOURCE_DOMAIN = 'datos.gov.co';
15
16
    /** @var SodaClient $sodaClient */
17
    protected $sodaClient;
18
19
    /** @var SodaDataset $sodaDataset */
20
    protected $sodaDataset;
21
22
    #region Funciones mágicas
23
24 6
    public function __construct()
25
    {
26 6
        $this->sodaClient = new SodaClient(self::SOURCE_DOMAIN, config('datos-abiertos.token'));
27
28 6
        $this->sodaDataset = new SodaDataset($this->sodaClient, $this->getDatasetIdentifier());
29
30 6
        $this->addMacroMethods();
31 6
    }
32
33
    #endregion
34
35
    #region Funciones abstractas
36
37
    /**
38
     * Retorna las columnas del dataset (recurso).
39
     *
40
     * @return string[]
41
     */
42
    abstract public function getColumns();
43
44
    /**
45
     * Retorna el identificador del dataset (recurso).
46
     *
47
     * @return string
48
     */
49
    abstract protected function getDatasetIdentifier();
50
51
    /**
52
     * Retorna la columna cuyo valor es único dentro del recurso (dataset).
53
     *
54
     * @return string
55
     */
56
    abstract protected function getUniqueColumn();
57
58
    #endregion
59
60
    #region Funciones
61
62
    /**
63
     * Agrega métodos dinámicos para consultar un dataset (recurso) por cada columna que tenga.
64
     *
65
     * @return void
66
     */
67 6
    private function addMacroMethods()
68
    {
69 6
        $columns = $this->getColumns();
70
71 6
        foreach ($columns as $column) {
72 6
            static::macro(
73 6
                'where' . ucfirst(Str::camel($column)),
74
                function ($value) use ($column) {
75
                    return $this->getData([$column  => $value]);
76 6
                }
77
            );
78
        }
79 6
    }
80
81
    /**
82
     * Undocumented function.
83
     *
84
     * @param int|string $uniqueValue
85
     * @return array
86
     */
87
    public function find($uniqueValue)
88
    {
89
        $data = $this->where($this->getUniqueColumn(), $uniqueValue);
90
91
        return $data[0] ?? null;
92
    }
93
94
    /**
95
     * Consulta el listado del recurso de acuerdo a los parámetros.
96
     * Si no se especifican, por defecto trae todos.
97
     * Para saber cómo usar los filtros, consultar en el siguiente enlace:
98
     * https://github.com/allejo/PhpSoda/wiki/Simple-Filters.
99
     *
100
     * @param array|string|\allejo\Socrata\SoqlQuery $filterOrSoqlQuery Los parámetros de la consulta.
101
     * @return array[]
102
     */
103
    public function getData($filterOrSoqlQuery = '')
104
    {
105
        $data = $this->sodaDataset->getData($filterOrSoqlQuery);
106
107
        return $data;
108
    }
109
110
    /**
111
     * Consulta registros del recurso por el valor de una columna.
112
     *
113
     * @param string $column
114
     * @param int|string $value
115
     * @return array[]
116
     */
117
    public function where(string $column, $value)
118
    {
119
        return $this->getData([$column => $value]);
120
    }
121
122
    #endregion
123
}
124