Miglioramento della documentazione

This commit is contained in:
Thomas Zilio 2017-09-04 11:53:30 +02:00
parent 10da3933ca
commit 396524eb50
5 changed files with 89 additions and 22 deletions

View File

@ -1,22 +1,30 @@
<?php <?php
// Impostazioni di base per l'accesso al database
$db_host = '|host|'; $db_host = '|host|';
$db_username = '|username|'; $db_username = '|username|';
$db_password = '|password|'; $db_password = '|password|';
$db_name = '|database|'; $db_name = '|database|';
// Percorso della cartella di backup
$backup_dir = __DIR__.'/backup/'; $backup_dir = __DIR__.'/backup/';
// Tema selezionato per il front-end
$theme = 'default'; $theme = 'default';
// Redirect automatico delle richieste da HTTP a HTTPS
$redirectHTTPS = false; $redirectHTTPS = false;
// Impostazioni di debug
$debug = false; $debug = false;
$strict = false; $strict = false;
// Personalizzazione dei gestori dei tag personalizzati
$HTMLWrapper = null; $HTMLWrapper = null;
$HTMLHandlers = []; $HTMLHandlers = [];
$HTMLManagers = []; $HTMLManagers = [];
// Lingua del progetto
$lang = 'it'; $lang = 'it';
// Personalizzazione della formattazione di date e numeri
$formatter = []; $formatter = [];

View File

@ -8,14 +8,18 @@ currentMenu: api
> >
> \-- <cite>[Wikipedia](https://it.wikipedia.org/wiki/Application_programming_interface)</cite> > \-- <cite>[Wikipedia](https://it.wikipedia.org/wiki/Application_programming_interface)</cite>
L'API del progetto è attualmente ancora in sviluppo, e pertanto le funzioni disponibili potrebbero essere piuttosto ridotte. Di seguito sono elencate le basi per connettersi al sistema e ottenere i dati a cui si è interessati. L'API del progetto è attualmente ancora in sviluppo, e pertanto le funzioni disponibili potrebbero essere piuttosto ridotte.
Di seguito sono elencate le basi per connettersi al sistema e ottenere i dati a cui si è interessati.
<!-- TOC depthFrom:2 depthTo:6 orderedList:false updateOnSave:true withLinks:true --> <!-- TOC depthFrom:2 depthTo:6 orderedList:false updateOnSave:true withLinks:true -->
- [Accesso](#accesso) - [Standard di comunicazione](#standard-di-comunicazione)
- [Ottenere la chiave](#ottenere-la-chiave)
- [Formato dei componenti](#formato-dei-componenti)
- [Output](#output) - [Output](#output)
- [Messaggi](#messaggi) - [Stati](#stati)
- [Formato dei componenti](#formato-dei-componenti) - [Lettura](#lettura)
- [Personalizzazione](#personalizzazione)
- [Richieste di lettura](#richieste-di-lettura) - [Richieste di lettura](#richieste-di-lettura)
- [Interventi](#interventi) - [Interventi](#interventi)
- [Anagrafiche](#anagrafiche) - [Anagrafiche](#anagrafiche)
@ -25,29 +29,38 @@ L'API del progetto è attualmente ancora in sviluppo, e pertanto le funzioni dis
<!-- /TOC --> <!-- /TOC -->
## Accesso ## Standard di comunicazione
L'accesso all'API viene effettuato concatenendo la chiave dell'utenza all'URL del sito su cui è ospitato il progetto. Il funzionamento dell'API si basa fondamentalmente sull'utilizzo di una chiave di accesso, ospitata all'interno della tabella `zz_tokens` del database del progetto, univoca per ogni istanza dell'utente.
http://<url_osm>/api/?token=<token> Ogni richiesta all'API deve contenere la chiave di accesso (campo `token`) e l'operazione richiesta (campo `resource`), inserendo questi elementi tra gli ulteriori contenuti che si intendono inviare.
I contenuti della richiesta devono quindi essere convertiti in formato JSON ed inviati all'API secondo uno specifico schema:
La chiave di accesso è ottenibile eseguendo la seguente query all'interno del database del progetto: - `POST` - Richieste di creazione (**Create**).
- `GET` - Richieste di informazioni (**Retrieve**).
- `PUT` - Richieste di modifica (**Update**).
- `DELETE` - Richieste di eliminazione (**Delete**).
```sql ### Ottenere la chiave
SELECT `token` FROM `zz_tokens` WHERE `id_utente` = <id_utente>
``` La chiave di accesso può essere ottenuta sfruttando l'operazione di accesso nativa dell'API, che prevede l'invio di una richiesta **POST** corrispondente alla seguente struttura:
- `resource` - login.
- `username` - &lt;username dell'account>.
- `password` - &lt;password dell'account>.
### Formato dei componenti
I seguenti componenti delle richieste devono seguire una rigida struttura:
- `page` - intero.
- `upd` - yyyy-MM-dd hh:mm:ss.
## Output ## Output
L'API del progetto permette di ottenere le informazioni attraverso un array in formato JSON. L'API del progetto permette di ottenere le informazioni attraverso un array in formato JSON.
Per poter interpretare correttamente i dati, si devono ignorare gli indici numerici di primo livello (non rilevanti all'interno del formato) e sfruttare in particolare i seguenti campi generici:
- `records`, rappresentante il numero totale dei record richiesti; ### Stati
- `pages`, indicante il numero totale della pagine disponibili.
Si ricorda che l'API prevede la restituzione di un insieme di dati limitato rispetto alla richiesta effettuatua: per ottenere l'intero insieme di informazioni è necessario eseguire molteplici richieste consecutive basate sul campo `page`.
## Messaggi
Ogni richiesta effettuata all'API viene accompagnata da un messaggio predefinito che permette di interpretare in modo più preciso la risposta. Ogni richiesta effettuata all'API viene accompagnata da un messaggio predefinito che permette di interpretare in modo più preciso la risposta.
In particolare, sono presenti i seguenti _status_: In particolare, sono presenti i seguenti _status_:
@ -57,13 +70,29 @@ In particolare, sono presenti i seguenti _status_:
- `401: Non autorizzato` - Accesso non autorizzato. - `401: Non autorizzato` - Accesso non autorizzato.
- `404: Non trovato` - La risorsa richiesta non risulta disponibile. - `404: Non trovato` - La risorsa richiesta non risulta disponibile.
- `500: Errore del server` - Il gestionale non è in grado di completare la richiesta. - `500: Errore del server` - Il gestionale non è in grado di completare la richiesta.
- `503: Servizio non disponibile` - L'API del gestionale non è abilitata.
## Formato dei componenti ### Lettura
I seguenti componenti delle richieste devono seguire una rigida struttura: Le richieste di lettura sono solitamente completate con l'invio di un numero predefinito di informazioni.
Per poter interpretare correttamente i dati, si devono ignorare gli indici numerici di primo livello (non rilevanti all'interno del formato) e sfruttare in particolare i seguenti campi generici:
- `page` (intero). - `records`, rappresentante il numero totale dei record richiesti;
- `upd` (yyyy-MM-dd hh:mm:ss). - `pages`, indicante il numero totale della pagine disponibili.
Si ricorda che l'API prevede la restituzione di un insieme di dati limitato rispetto alla richiesta effettuatua: per ottenere l'intero insieme di informazioni è necessario eseguire molteplici richieste consecutive basate sul campo `page`.
## Personalizzazione
L'API sfrutta una struttura modulare per poter funzionare in modo completo e garantire al tempo stesso il possibile ampliamento delle sue funzioni.
In particolare, ogni modulo può specificare una determinata serie di operazioni che lo riguardano e che possono essere richiamate in vari modi.
Di seguito lo schema attraverso cui l'API individua la presenza delle possibili richieste supportate dai moduli (cartelle **api/** e **custom/api/**):
- `POST` - File `create.php`.
- `GET` - File `eetrieve.php`.
- `PUT` - File `update.php`.
- `DELETE` - File `delete.php`.
## Richieste di lettura ## Richieste di lettura

View File

@ -377,6 +377,7 @@ class Auth extends \Util\Singleton
if (!isset(self::$is_brute)) { if (!isset(self::$is_brute)) {
$results = $database->fetchArray('SELECT COUNT(*) AS tot FROM zz_logs WHERE ip = '.prepare(get_client_ip()).' AND stato = '.prepare(self::getStatus()['failed']['code']).' AND DATE_ADD(created_at, INTERVAL '.self::$brute['timeout'].' SECOND) >= NOW()'); $results = $database->fetchArray('SELECT COUNT(*) AS tot FROM zz_logs WHERE ip = '.prepare(get_client_ip()).' AND stato = '.prepare(self::getStatus()['failed']['code']).' AND DATE_ADD(created_at, INTERVAL '.self::$brute['timeout'].' SECOND) >= NOW()');
self::$is_brute = $results[0]['tot'] > self::$brute['attemps']; self::$is_brute = $results[0]['tot'] > self::$brute['attemps'];
} }

View File

@ -328,6 +328,30 @@ if (!empty($records[0]['idcontratto_prev'])) {
} }
?> ?>
<script type="text/javascript">
$(document).ready(function(){
$('#data_accettazione').on("dp.change", function(){
if($(this).val()){
$('#data_rifiuto').attr('disabled', true);
}else{
$('#data_rifiuto').attr('disabled', false);
}
});
$('#data_rifiuto').on("dp.change", function(){
console.log($(this).val());
if($(this).val()){
$('#data_accettazione').attr('disabled', true);
}else{
$('#data_accettazione').attr('disabled', false);
}
});
$("#data_accettazione").trigger("dp.change");
$("#data_rifiuto").trigger("dp.change");
});
</script>
<a class="btn btn-danger ask" data-backto="record-list"> <a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> <?php echo _('Elimina'); ?> <i class="fa fa-trash"></i> <?php echo _('Elimina'); ?>
</a> </a>

View File

@ -2,6 +2,7 @@
switch ($resource) { switch ($resource) {
case 'login': case 'login':
// Controllo sulle credenziali
if (Auth::getInstance()->attempt($request['username'], $request['password'])) { if (Auth::getInstance()->attempt($request['username'], $request['password'])) {
$user = Auth::user(); $user = Auth::user();
@ -17,6 +18,7 @@ switch ($resource) {
$token = $tokens[0]['token']; $token = $tokens[0]['token'];
} }
// Informazioni da restituire tramite l'API
$results = $dbo->fetchArray('SELECT `ragione_sociale`, `codice`, `piva`, `codice_fiscale`, `indirizzo`, `citta`, `provincia`, (SELECT `nome` FROM `an_nazioni` WHERE `an_nazioni`.`id` = `an_anagrafiche`.`id_nazione`) AS nazione, `telefono`, `fax`, `cellulare`, `an_anagrafiche`.`email` FROM `zz_users` LEFT JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica` = `zz_users`.`idanagrafica` WHERE `id` = '.prepare($user['id_utente']))[0]; $results = $dbo->fetchArray('SELECT `ragione_sociale`, `codice`, `piva`, `codice_fiscale`, `indirizzo`, `citta`, `provincia`, (SELECT `nome` FROM `an_nazioni` WHERE `an_nazioni`.`id` = `an_anagrafiche`.`id_nazione`) AS nazione, `telefono`, `fax`, `cellulare`, `an_anagrafiche`.`email` FROM `zz_users` LEFT JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica` = `zz_users`.`idanagrafica` WHERE `id` = '.prepare($user['id_utente']))[0];
$results['token'] = $token; $results['token'] = $token;
@ -25,6 +27,7 @@ switch ($resource) {
'status' => API::getStatus()['unauthorized']['code'], 'status' => API::getStatus()['unauthorized']['code'],
]; ];
// Se è in corso un brute-force, aggiunge il timeout
if (Auth::isBrute()) { if (Auth::isBrute()) {
$results['timeout'] = Auth::getBruteTimeout(); $results['timeout'] = Auth::getBruteTimeout();
} }
@ -32,6 +35,7 @@ switch ($resource) {
break; break;
// Operazione di logout
case 'logout': case 'logout':
if (!empty($request['token']) && !empty($user)) { if (!empty($request['token']) && !empty($user)) {
$database->query('DELETE FROM `zz_tokens` WHERE `token` = '.prepare($request['token']).' AND `id_utente` = '.prepare($user['id_utente'])); $database->query('DELETE FROM `zz_tokens` WHERE `token` = '.prepare($request['token']).' AND `id_utente` = '.prepare($user['id_utente']));
@ -46,4 +50,5 @@ switch ($resource) {
return [ return [
'login', 'login',
'logout',
]; ];