Completed
Push — master ( 755bea...f3c405 )
by Andrés
03:44
created

BaseDataset::addMacroMethods()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.7333
c 0
b 0
f 0
cc 3
nc 2
nop 0
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
    public function __construct()
25
    {
26
        $this->sodaClient = new SodaClient(self::SOURCE_DOMAIN, config('datos-abiertos.token'));
27
28
        $this->sodaDataset = new SodaDataset($this->sodaClient, $this->getDatasetIdentifier());
29
30
        $this->addMacroMethods();
31
    }
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
    #endregion
52
53
    #region Funciones
54
55
    /**
56
     * Agrega métodos dinámicos para consultar un dataset (recurso) por cada columna que tenga.
57
     *
58
     * @return void
59
     */
60
    private function addMacroMethods()
61
    {
62
        $columns = $this->getColumns();
63
64
        foreach ($columns as $column) {
65
            static::macro(
66
                'getBy' . ucfirst(Str::camel($column['name'])),
67
                function ($value) use ($column) {
68
                    $data = $this->getData([$column['name']  => $value]);
69
70
                    return empty($column['unique'])
71
                        ? $data : ($data[0] ?? null);
72
                }
73
            );
74
        }
75
    }
76
77
    /**
78
     * Consulta el listado del recurso de acuerdo a los parámetros.
79
     * Si no se especifican, por defecto trae todos.
80
     * Para saber cómo usar los filtros, consultar en el siguiente enlace:
81
     * https://github.com/allejo/PhpSoda/wiki/Simple-Filters.
82
     *
83
     * @param array|string|\allejo\Socrata\SoqlQuery $filterOrSoqlQuery Los parámetros de la consulta.
84
     * @return array[]
85
     */
86
    public function getData($filterOrSoqlQuery = '')
87
    {
88
        $data = $this->sodaDataset->getData($filterOrSoqlQuery);
89
90
        return $data;
91
    }
92
93
    #endregion
94
}
95