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]; } } } ?>