Miglioramento della documentazione
This commit is contained in:
parent
10da3933ca
commit
396524eb50
|
@ -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 = [];
|
||||||
|
|
73
docs/API.md
73
docs/API.md
|
@ -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` - <username dell'account>.
|
||||||
|
- `password` - <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
|
||||||
|
|
||||||
|
|
|
@ -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'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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',
|
||||||
];
|
];
|
||||||
|
|
Loading…
Reference in New Issue