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