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

BaseDataset   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 85
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 0
Metric Value
wmc 5
lcom 1
cbo 4
dl 0
loc 85
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
getColumns() 0 1 ?
getDatasetIdentifier() 0 1 ?
A addMacroMethods() 0 16 3
A getData() 0 6 1
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