1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-02-05 10:17:30 +01:00
openstamanager/src/API/Manager.php

310 lines
8.8 KiB
PHP
Raw Normal View History

2019-07-19 15:23:00 +02:00
<?php
2020-09-07 15:04:06 +02:00
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
2021-01-20 15:08:51 +01:00
* Copyright (C) DevCode s.r.l.
2020-09-07 15:04:06 +02:00
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
2019-07-19 15:23:00 +02:00
namespace API;
use API\Exceptions\InternalError;
use API\Exceptions\ResourceNotFound;
use Models\ApiResource as Resource;
/**
* Classe per la gestione delle API del progetto.
*
* @since 2.4.11
*/
class Manager
{
protected $resource;
protected $type;
/**
* @throws \InvalidArgumentException
2019-07-19 15:23:00 +02:00
*/
public function __construct($resource, $type, $version)
{
2019-07-22 09:52:27 +02:00
$object = Resource::where('version', $version)
2019-07-19 15:23:00 +02:00
->where('type', $type)
->where('resource', $resource)
->first();
2019-07-22 09:52:27 +02:00
if (empty($object)) {
throw new ResourceNotFound();
2019-07-22 09:52:27 +02:00
}
$this->resource = $object;
2019-07-19 15:23:00 +02:00
$this->type = $type;
}
public function manage($request)
{
$type = $this->type;
$response = $this->{$type}($request);
return $response;
}
/**
* Gestisce le richieste di informazioni riguardanti gli elementi esistenti.
*
* @param array $request
*
* @return string
*/
public function retrieve($request)
{
2024-01-15 15:30:45 +01:00
$user = \Auth::user();
2019-07-19 15:23:00 +02:00
$where = [];
$order = [];
2023-09-21 11:59:43 +02:00
$whereraw = [];
2023-09-15 18:06:15 +02:00
// Selezione campi personalizzati
// Esempio:
// display=[id,ragione_sociale,telefono]
2024-05-23 11:36:25 +02:00
$select = !empty($request['display']) ? explode(',', substr((string) $request['display'], 1, -1)) : null;
2019-07-19 15:23:00 +02:00
2023-09-15 18:06:15 +02:00
// Filtri personalizzati
// Esempio:
// filter[ragione_sociale]=[Mario Rossi]&filter[telefono]=[0429%]
2019-07-19 15:23:00 +02:00
$values = isset($request['filter']) ? (array) $request['filter'] : [];
foreach ($values as $key => $value) {
// Individuazione della tipologia (array o string)
2024-05-23 11:36:25 +02:00
$value = trim((string) $value, '[');
2023-09-15 18:06:15 +02:00
$value = trim($value, ']');
$values = explode(',', $value);
2023-09-21 17:34:30 +02:00
foreach ($values as $value) {
2023-09-15 18:06:15 +02:00
// Filtro per LIKE se il valore contiene %
if (string_contains($value, '%')) {
$where[] = [
$key,
'LIKE',
2023-09-21 17:34:30 +02:00
$value,
2023-09-15 18:06:15 +02:00
];
}
2023-09-21 17:34:30 +02:00
2023-09-15 18:06:15 +02:00
// Filtro preciso se il valore non contiene %
else {
$where[] = [
$key,
'=',
2023-09-21 17:34:30 +02:00
$value,
2023-09-15 18:06:15 +02:00
];
}
}
2019-07-19 15:23:00 +02:00
}
// Ordinamento personalizzato
2023-09-15 18:06:15 +02:00
// Esempi:
// order=[ragione_sociale]
// order=[ragione_sociale|asc]
// order=[ragione_sociale|desc]
// order=[ragione_sociale]&order=[telefono]
2019-07-19 15:23:00 +02:00
$values = isset($request['order']) ? (array) $request['order'] : [];
foreach ($values as $value) {
2024-05-23 11:36:25 +02:00
$value = trim((string) $value, '[');
2023-09-15 18:06:15 +02:00
$value = trim($value, ']');
2019-07-19 15:23:00 +02:00
$pieces = explode('|', $value);
2023-09-15 18:06:15 +02:00
$order = empty($pieces[1]) ? $pieces[0] : [$pieces[0] => $pieces[1]];
2019-07-19 15:23:00 +02:00
}
// Paginazione automatica dell'API
$page = isset($request['page']) ? (int) $request['page'] : 0;
$length = setting('Lunghezza pagine per API');
$data = array_merge($request, [
'user' => $user,
'select' => $select,
'where' => $where,
'order' => $order,
'page' => $page,
'length' => $length,
2023-09-21 17:34:30 +02:00
'whereraw' => $whereraw,
2019-07-19 15:23:00 +02:00
]);
$response = $this->getResponse($data);
$parameters = $response['parameters'];
2019-08-01 12:53:21 +02:00
2019-07-19 15:23:00 +02:00
$table = $response['table'];
2023-09-15 18:06:15 +02:00
$joins = $response['joins'];
2023-09-21 11:59:43 +02:00
$group = $response['group'];
2023-09-21 17:34:30 +02:00
if (!empty($response['where'])) {
2023-09-21 11:59:43 +02:00
$where = array_merge($where, $response['where']);
}
2023-09-21 17:34:30 +02:00
if (!empty($response['whereraw'])) {
2023-09-21 11:59:43 +02:00
$whereraw = $response['whereraw'];
}
2023-09-15 18:06:15 +02:00
if (empty($select)) {
$select = $response['select'] ?: $select;
$select = $select ?: '*';
}
2019-08-01 12:53:21 +02:00
2019-07-19 15:23:00 +02:00
$query = $response['query'];
try {
$database = database();
// Generazione automatica delle query
if (!empty($table)) {
// Date di interesse
if (!empty($request['upd'])) {
$where['#updated_at'] = 'updated_at >= '.prepare($request['upd']);
}
if (!empty($request['crd'])) {
$where['#created_at'] = 'created_at >= '.prepare($request['crd']);
}
2023-09-21 11:59:43 +02:00
$query = $database->table($table);
2019-07-19 15:23:00 +02:00
// Query per ottenere le informazioni
2023-09-21 11:59:43 +02:00
foreach ($select as $s) {
$query->selectRaw($s);
}
2023-09-21 17:34:30 +02:00
2023-09-15 18:06:15 +02:00
foreach ($joins as $join) {
if (count($join) >= 3) {
2024-07-29 11:49:00 +02:00
$query->leftJoin($join[0], function ($joinClause) use ($join) {
$joinClause->on($join[1], $join[2]);
2024-07-29 11:49:00 +02:00
// Aggiungi condizioni aggiuntive se ci sono abbastanza elementi in $join
if (isset($join[3])) {
2024-07-29 11:49:00 +02:00
$joinClause->whereRaw($join[3].' = ?', [$join[4]]);
}
});
}
2019-07-19 15:23:00 +02:00
}
2023-09-15 18:06:15 +02:00
2023-09-21 11:59:43 +02:00
if (!empty($where)) {
$query->where($where);
}
foreach ($whereraw as $w) {
$query->whereRaw($w);
}
if (!empty($group)) {
$query->groupBy($group);
}
2023-09-15 18:06:15 +02:00
$count = $query->count();
// Composizione query finale
$response = [];
2023-09-21 11:59:43 +02:00
$response['records'] = $database->select($table, $select, $joins, $where, $order, [$page * $length, $length], null, $group, $whereraw);
2023-09-15 18:06:15 +02:00
$response['total-count'] = $count;
2019-07-19 15:23:00 +02:00
}
2023-09-15 18:06:15 +02:00
// Query diretta
elseif (!empty($query)) {
2019-07-19 15:23:00 +02:00
$response = [];
2023-09-15 18:06:15 +02:00
$response['records'] = $database->fetchArray($query.' LIMIT '.($page * $length).', '.$length, [$parameters]);
$count = $database->fetchNum($query);
2019-07-19 15:23:00 +02:00
$response['total-count'] = $count;
}
if (empty($response['pages'])) {
$response['pages'] = intval(ceil($response['total-count'] / $length));
2019-07-19 15:23:00 +02:00
}
2024-01-15 15:30:45 +01:00
} catch (\PDOException $e) {
2019-07-19 15:23:00 +02:00
// Log dell'errore
$logger = logger();
$logger->addRecord(\Monolog\Logger::ERROR, $e);
throw new InternalError();
}
return $response;
}
/**
* Gestisce le richieste di creazione nuovi elementi.
*
* @param array $request
*
* @return string
*/
public function create($request)
{
return $this->getResponse($request);
}
/**
* Gestisce le richieste di aggiornamento di elementi esistenti.
*
* @param array $request
*
* @return string
*/
public function update($request)
{
return $this->getResponse($request);
}
/**
* Gestisce le richieste di eliminazione di elementi esistenti.
*
* @param array $request
*
* @return string
*/
public function delete($request)
{
return $this->getResponse($request);
}
public function getResponse($request)
{
$class = $this->resource->class;
if (!class_exists($class)) {
throw new ResourceNotFound();
}
$object = new $class();
$method = $this->type;
2019-07-19 17:21:27 +02:00
// Operazioni di inizializzazione
$block = $object->open($request);
if (!empty($block)) {
2019-07-19 18:01:48 +02:00
throw new ResourceNotFound();
2019-07-19 17:21:27 +02:00
}
2019-07-19 18:01:48 +02:00
$database = database();
$database->beginTransaction();
2019-07-19 17:21:27 +02:00
// Operazioni della risorsa
2019-07-19 15:23:00 +02:00
$response = $object->{$method}($request);
2019-07-19 17:21:27 +02:00
2023-10-27 10:35:05 +02:00
try {
2023-10-05 16:10:54 +02:00
$database->commitTransaction();
2024-05-23 11:36:25 +02:00
} catch (\PDOException) {
2023-10-05 16:10:54 +02:00
}
2019-07-19 18:01:48 +02:00
2019-07-19 17:21:27 +02:00
// Operazioni di completamento
2019-07-19 16:51:52 +02:00
$object->close($request, $response);
2019-07-19 15:23:00 +02:00
return $response;
}
}