ApiClient::__construct()   A
last analyzed

Complexity

Conditions 5
Paths 2

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 7
c 1
b 0
f 0
dl 0
loc 11
ccs 0
cts 9
cp 0
rs 9.6111
cc 5
nc 2
nop 2
crap 30
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * LibreDTE: Cliente de API en PHP.
7
 * Copyright (C) LibreDTE <https://www.libredte.cl>
8
 *
9
 * Este programa es software libre: usted puede redistribuirlo y/o modificarlo
10
 * bajo los términos de la GNU Lesser General Public License (LGPL) publicada
11
 * por la Fundación para el Software Libre, ya sea la versión 3 de la Licencia,
12
 * o (a su elección) cualquier versión posterior de la misma.
13
 *
14
 * Este programa se distribuye con la esperanza de que sea útil, pero SIN
15
 * GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD
16
 * PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la GNU Lesser General
17
 * Public License (LGPL) para obtener una información más detallada.
18
 *
19
 * Debería haber recibido una copia de la GNU Lesser General Public License
20
 * (LGPL) junto a este programa. En caso contrario, consulte
21
 * <http://www.gnu.org/licenses/lgpl.html>.
22
 */
23
24
namespace libredte\api_client;
25
26
/**
27
 * Clase ApiClient para la integración con la API de LibreDTE.
28
 *
29
 * Proporciona funcionalidades para realizar peticiones HTTP a la API de
30
 * LibreDTE, incluyendo métodos para realizar solicitudes GET y POST.
31
 */
32
class ApiClient
33
{
34
    /**
35
     * La URL base de la API de LibreDTE.
36
     *
37
     * @var string
38
     */
39
    private $api_url = 'https://libredte.cl';
40
41
    /**
42
     * El prefijo para las rutas de la API.
43
     *
44
     * @var string
45
     */
46
    private $api_prefix = '/api';
47
48
    /**
49
     * Valores por defecto de la cabecera que se pasarán a cURL.
50
     *
51
     * @var array
52
     */
53
    private $headers = [
54
        'User-Agent' => 'LibreDTE: Cliente de API en PHP.',
55
        'Content-Type' => 'application/json',
56
        'Accept' => 'application/json',
57
    ];
58
59
    /**
60
     * Objeto para manejar las conexiones HTTP mediante cURL.
61
     *
62
     * @var HttpCurlClient
63
     */
64
    private $client;
65
66
    /**
67
     * Constructor de la clase ApiClient.
68
     *
69
     * Inicializa el cliente con las credenciales y la URL de la API. Si no se
70
     * proporcionan, se intentará obtener desde las variables de entorno.
71
     *
72
     * @param string|null $hash Hash de autenticación del usuario en LibreDTE.
73
     * @param string|null $url URL base de la API de LibreDTE.
74
     * @throws ApiException si el hash de autenticación no está presente.
75
     */
76
    public function __construct(string $hash = null, string $url = null)
77
    {
78
        $hash = $hash ?: $this->env('LIBREDTE_HASH');
79
        if (!$hash) {
80
            throw new ApiException(message: 'LIBREDTE_HASH missing');
81
        }
82
        $this->headers['Authorization'] = 'Basic ' . base64_encode(
83
            $hash . ':X'
84
        );
85
        $this->api_url = $url ?: $this->env('LIBREDTE_URL') ?: $this->api_url;
86
        $this->client = new HttpCurlClient();
87
    }
88
89
    /**
90
     * Establece una cabecera para las solicitudes HTTP.
91
     *
92
     * Permite definir un valor para una cabecera específica que se incluirá en
93
     * todas las solicitudes HTTP realizadas por la instancia del cliente.
94
     *
95
     * @param string $name Nombre de la cabecera.
96
     * @param mixed $value Valor de la cabecera.
97
     * @return void
98
     */
99
    public function setHeader(string $name, mixed $value): void
100
    {
101
        $this->headers[$name] = $value;
102
    }
103
104
    /**
105
     * Configura las opciones de SSL para las conexiones HTTP.
106
     *
107
     * Este método permite activar o desactivar la verificación del certificado
108
     * SSL del servidor.
109
     *
110
     * @param boolean $sslcheck Activar o desactivar la verificación del
111
     * certificado SSL.
112
     * @return void
113
     */
114
    public function setSSL($sslcheck = true): void
115
    {
116
        $this->client->setSSL($sslcheck);
117
    }
118
119
    /**
120
     * Realiza una solicitud POST a la API de LibreDTE.
121
     *
122
     * Envia datos a un recurso específico de la API utilizando el método POST.
123
     *
124
     * @param string $resource El recurso de la API a solicitar.
125
     * @param mixed|null $data Los datos a enviar en la solicitud POST.
126
     * @param array $headers Encabezados adicionales para la solicitud.
127
     * @return array Respuesta de la API.
128
     */
129
    public function post(string $resource, mixed $data = null, array $headers = []): array|bool
130
    {
131
        $headers = array_merge($this->headers, $headers);
132
        return $this->client->query(
133
            method: 'POST',
134
            url: $this->api_url . $this->api_prefix . $resource,
135
            data: $data,
136
            headers: $headers
137
        );
138
    }
139
140
    /**
141
     * Realiza una solicitud GET a la API de LibreDTE.
142
     *
143
     * Recupera datos de un recurso específico de la API utilizando el método
144
     * GET.
145
     *
146
     * @param string $resource El recurso de la API a solicitar.
147
     * @param mixed|null $data Los datos a enviar en la solicitud GET.
148
     * @param array $headers Encabezados adicionales para la solicitud.
149
     * @return array Respuesta de la API.
150
     */
151
    public function get(string $resource, mixed $data = null, array $headers = []): array|bool
152
    {
153
        $headers = array_merge($this->headers, $headers);
154
        return $this->client->query(
155
            method: 'GET',
156
            url: $this->api_url . $this->api_prefix . $resource,
157
            data: $data,
158
            headers: $headers
159
        );
160
    }
161
162
    /**
163
     * Obtiene el valor de una variable de entorno.
164
     *
165
     * Este método es utilizado internamente para obtener configuraciones
166
     * como el hash de autenticación o la URL base de la API.
167
     *
168
     * @param string $name Nombre de la variable de entorno.
169
     * @return mixed|null Valor de la variable de entorno o null si no está
170
     * definida.
171
     */
172
    private function env($name): mixed
173
    {
174
        return function_exists('env') ? env($name) : getenv($name);
175
    }
176
}
177