gestione gare pubbliche
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 

272 righe
10 KiB

<?
class apiAdvancedManager {
public $query;
public $method;
public $spec;
public $errorCode;
public $errorDescription;
public $errorHeader;
public $endPoint;
public $codiceLog;
public $debug;
private $utente;
private $ente;
private $db;
private $config;
public static function getAPISpecs() {
global $root;
$_apiSpecsGenerator = true;
$api = json_decode(file_get_contents(__DIR__."/apiBase.json"),true);
$moduli = Ente::getModuli($_SESSION["ente"]->codice);
if (!empty($moduli)) {
foreach($moduli AS $id_modulo) {
$path = $root."/backend/$id_modulo/api/definitions.";
$ext = false;
if (file_exists($path."php")) {
$ext = include($path."php");
} else {
if (file_exists($path."json")) {
$ext = jsonToArray($path."json");
}
}
if (!empty($ext)) {
unset($ext["openapi"]);
$api = array_merge_recursive($api,$ext);
}
}
}
return $api;
}
public function __construct()
{
global $pdo;
global $config;
$this->spec = self::getAPISpecs();
$this->errorCode = "500";
$this->errorDescription = "Errore generico";
$this->errorHeader = "500";
$this->endPoint = "/api/v1/service.php";
$this->debug = false;
if (!empty($_SESSION["utente"] && is_a($_SESSION["utente"],"Utente")) && (!empty($_SESSION["ente"]) && is_a($_SESSION["ente"],"Ente")) && !empty($pdo)) {
$this->utente = $_SESSION["utente"];
$this->ente = $_SESSION["ente"];
$this->db = $pdo;
$this->config = $config;
} else {
return false;
}
}
public static function validateRequest($parameters,$values, $required = null) {
$return = false;
if (!empty($parameters)) {
$errors = [];
$found = 0;
$countRequired = 0;
foreach($parameters AS $pKey => $parametro) {
if (!empty($parametro["name"]) && is_numeric($pKey)) {
$pKey = $parametro["name"];
}
if (isset($values[$pKey])) {
$found++;
}
$valore = $values[$pKey] ?? "";
if (!empty($required)) {
if (is_array($required)) {
if (in_array($pKey,$required)) {
$parametro["required"] = true;
}
} else if ($required === true) {
$parametro["required"] = true;
}
}
if (!empty($parametro["required"])) {
$countRequired++;
}
if (!empty($parametro["required"]) && empty($valore) && $valore != "0" && $parametro["type"] != "array" && $parametro["type"] != "object") {
$errors[$pKey] = "Obbligatorio";
} else {
if (isset($parametro["type"]) && ($parametro["type"] == "array" || $parametro["type"] == "object")) {
if ($parametro["type"] == "array" && !isset($parametro["properties"])) {
if (isset($parametro["items"][0]["properties"])) {
$innerPar = $parametro["items"][0]["properties"];
}
} else if (isset($parametro["properties"])) {
$innerPar = $parametro["properties"];
}
if (isset($innerPar)) {
$keys = array_keys($innerPar);
$required = (!empty($parametro["required"])) ? $parametro["required"] : null;
if (!empty($values[$pKey])) {
if (is_array($values[$pKey]) && isset($values[$pKey][$keys[0]])) {
$values[$pKey] = [$values[$pKey]];
}
foreach($values[$pKey] AS $subValues) {
$result = SELF::validateRequest($innerPar,$subValues,$required);
if ($result !== true) {
$errors = array_merge($errors,$result);
}
}
}
}
}
if (isset($parametro["type"])) {
if ($parametro["type"]=="number" && !is_numeric($valore) && !empty($valore)) {
$errors[$pKey] = "Formato errato";
}
}
// TODO: CONTROLLARE $ref
if ((!empty($parametro["schema"]["pattern"]) || !empty($parametro["pattern"])) && !empty($valore)) {
$pattern = $parametro["schema"]["pattern"] ?? $parametro["pattern"];
if (!preg_match("/".$pattern."/",$valore)) {
$errors[$pKey] = "Formato errato";
}
}
if (!empty($parametro["schema"]["enum"]) || !empty($parametro["enum"]) && !empty($valore)) {
$enum = $parametro["schema"]["enum"] ?? $parametro["enum"];
$chiavi = array_keys($enum);
foreach($chiavi AS $chiave) {
if (!is_numeric($chiave)) {
$enum = $chiavi; break;
}
}
if (in_array($valore,$enum) === false) {
var_dump($enum);
$errors[$pKey] = "Valore non previsto";
}
}
}
}
if ($found == 0 && count($errors) == 0 && $countRequired > 0) {
$errors = "Richiesta errata";
}
if (count($errors) == 0) {
$return = true;
} else {
$return = $errors;
}
}
return $return;
}
public function handleRequest() {
$return = false;
$log = [];
$log["endPoint"] = $this->endPoint;
$log["codice_ente"] = $_SESSION["ente"]->codice;
$log["method"] = $this->method;
$log["request"] = json_encode($this->query,true);
$log["timestamp_creazione"] = date('Y-m-d H:i:s');
$salva = new salva();
$salva->debug = false;
$salva->nome_tabella = "b_log_api";
$salva->operazione = 'INSERT';
$salva->oggetto = $log;
$log["codice"] = $salva->save();
$this->codiceLog = $log["codice"];
$metodi = get_class_methods("apiAdvancedManager");
if (in_array($this->method,$metodi)!==false) {
$return = $this->{$this->method}();
} else {
$this->errorCode = "404";
$this->errorDescription = "Metodo sconosciuto";
$this->errorHeader = "404";
}
$log["header"] = 200;
if ($return === false) {
$error = ["errorHeader" => $this->errorHeader,"errorCode"=>$this->errorCode,"errorDescription"=>$this->errorDescription];
$log["header"] = $this->errorHeader;
$log["errors"] = json_encode($error,true);
}
$salva->operazione = 'UPDATE';
$salva->oggetto = $log;
$codice_log = $salva->save();
return $return;
}
private function ContrattiStore() {
$element = $this->query;
$parametri = $this->spec["components"]["schemas"]["contratto"]["properties"];
$validation = $this->validateRequest($parametri,$element,$this->spec["components"]["schemas"]["contratto"]["required"]);
if ($validation === true) {
if (empty($element["codice_ente"])) {
$element["codice_ente"] = $_SESSION["ente"]->codice;
}
if (!empty($element["data_inizio"])) {
$element["data_inizio"] = mysql2date($element["data_inizio"]);
}
if (!empty($element["data_fine"])) {
$element["data_fine"] = mysql2date($element["data_fine"]);
}
if (empty($element["codice"]) && !empty($element["riferimento_esterno"])) {
$codice = stipula::getIdFromExternal($element["riferimento_esterno"]);
if (!empty($codice)) {
$element["codice"] = $codice;
}
}
$codiceContratto = stipula::saveContratto($element);
if (!empty($codiceContratto)) {
return [["codice"=>$codiceContratto,"note"=>""]];
} else {
$this->errorCode = 500;
$this->errorHeader = 500;
$this->errorDescription = ["Errore nella creazione del contratto"];
}
} else {
return [$validation];
}
}
private function ContrattiBindfornitore() {
$element = $this->query;
$schema = $this->spec["paths"]["/contratti/bindFornitore"]["post"]["requestBody"]["content"]["application/json"]["schema"];
$validation = $this->validateRequest($schema["properties"],$element,$schema["required"]);
if ($validation === true) {
$keyContratto = "codiceContratto";
if (empty($element["codiceContratto"]) && !empty($element["riferimento_esterno"])) {
$keyContratto = "riferimento_esterno";
$codice = stipula::getIdFromExternal($element["riferimento_esterno"]);
if (!empty($codice)) {
$element["codiceContratto"] = $codice;
}
}
$contratto = stipula::init($element["codiceContratto"]);
if (is_a($contratto,"stipula")) {
$checkOE = $this->db->go("SELECT codice FROM b_operatori_economici WHERE codice_fiscale_impresa = :codice_fiscale ",[":codice_fiscale"=>$element["codiceFiscaleFornitore"]]);
$checkRelazione = $this->db->prepare("SELECT codice FROM r_enti_operatori WHERE cod_ente = :ente AND codice_operatore = :oe");
$checkRelazione->bindValue(":ente",$_SESSION["ente"]->codice);
if ($checkOE->rowCount() > 0) {
while($oe = $checkOE->fetch(PDO::FETCH_COLUMN)) {
$checkRelazione->bindValue(":oe",$oe);
$checkRelazione->execute();
if ($checkRelazione->rowCount() > 0) {
$contratto->createContraenteFromOE($oe);
return [["codice"=>$oe,"note"=>""]];
}
}
$contratto->createContraenteFromOE($oe);
return [["codice"=>$oe,"note"=>""]];
} else {
$this->errorCode = 404;
$this->errorHeader = 404;
$this->errorDescription = [["codiceFiscaleFornitore"=>"Fornitore sconosciuto"]];
return $this->errorDescription;
}
} else {
$this->errorCode = 404;
$this->errorHeader = 404;
$this->errorDescription = [[$keyContratto => "Contratto sconosciuto"]];
return $this->errorDescription;
}
}else {
$this->errorCode = 404;
$this->errorHeader = 404;
return [$validation];
}
}
}
?>