1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-02-18 12:30:35 +01:00

Revisione sincronizzazione Flash da Applicazione

This commit is contained in:
Dasc3er 2021-09-14 15:54:03 +02:00
parent 23b31347e4
commit 9027bfad75
2 changed files with 119 additions and 40 deletions

View File

@ -30,10 +30,37 @@ use Carbon\Carbon;
class Intervento extends Resource implements UpdateInterface class Intervento extends Resource implements UpdateInterface
{ {
public function update($request) /**
* Elenco risorse API.
*
* @var array
*/
protected $risorse;
/**
* Verifica sulla presenza di conflitti.
*
* @var bool
*/
protected $conflitti_rilevati = false;
/**
* Record da considerare per l'importazione.
*
* @var array
*/
protected $records = [];
/**
* Response delle richieste.
*
* @var array
*/
protected $response = [];
public function __construct()
{ {
// Elenco risorse API $this->risorse = [
$risorse = [
'cliente' => new Clienti(), 'cliente' => new Clienti(),
'intervento' => new Interventi(), 'intervento' => new Interventi(),
@ -41,41 +68,22 @@ class Intervento extends Resource implements UpdateInterface
'sessioni' => new SessioniInterventi(), 'sessioni' => new SessioniInterventi(),
'allegati' => new AllegatiInterventi(), 'allegati' => new AllegatiInterventi(),
]; ];
$sezioni = array_keys($risorse);
// Generazione record semplificati
$records = [];
foreach ($sezioni as $sezione) {
if (isset($request[$sezione][0])) {
foreach ($request[$sezione] as $record) {
$records[] = [$record, $risorse[$sezione]];
}
} elseif (!empty($request[$sezione])) {
$records[] = [$request[$sezione], $risorse[$sezione]];
}
} }
public function update($request)
{
// Controlli sui conflitti // Controlli sui conflitti
$conflict = false; foreach ($request as $key => $record) {
foreach ($records as $key => [$record, $risorsa]) { $records = $record;
$ultima_modifica = new Carbon($record['updated_at']); if (!isset($records[0])) {
$ultima_sincronizzazione = new Carbon($record['last_sync_at']); $records = [$records];
if (!empty($record['last_sync_at']) && !$ultima_modifica->greaterThan($ultima_sincronizzazione)) {
unset($records[$key]);
continue;
} }
$modifiche = $risorsa->getModifiedRecords($record['last_sync_at']); $this->processaRecords($key, $records);
$modifiche = array_keys($modifiche);
if (in_array($record['id'], $modifiche)) {
$conflict = true;
break;
}
} }
// Messaggio di conflitto in caso di problematica riscontrata // Messaggio di conflitto in caso di problematica riscontrata
if ($conflict) { if ($this->conflitti_rilevati) {
return [ return [
'status' => 200, 'status' => 200,
'message' => 'CONFLICT', 'message' => 'CONFLICT',
@ -83,16 +91,87 @@ class Intervento extends Resource implements UpdateInterface
} }
// Salvataggio delle modifiche // Salvataggio delle modifiche
foreach ($records as [$record, $risorsa]) { foreach ($this->records as $key => $records) {
if (!empty($record['deleted_at'])) { $this->importaRecords($key, $records);
$risorsa->deleteRecord($record['id']); }
} elseif (!empty($record['remote_id'])) {
$risorsa->updateRecord($record); return $this->response;
} else { }
$risorsa->createRecord($record);
/**
* @param $key
* @param $records
*/
protected function processaRecords($key, $request)
{
$records = [];
// Controlli sui conflitti
foreach ($request as $id => $record) {
$risorsa = $this->risorse[$key];
if (empty($risorsa) || empty($record)) {
continue;
}
$includi = $this->verificaConflitti($record, $risorsa);
if ($includi) {
$records[$id] = $record;
} }
} }
return []; // Registrazione dei record individuati
if (!empty($records)) {
$this->records[$key] = $records;
}
}
/**
* @param $key
* @param $records
*/
protected function importaRecords($key, $records)
{
$this->response[$key] = [];
$risorsa = $this->risorse[$key];
foreach ($records as $id => $record) {
// Fix id_cliente per Intervento in caso di generazione da zero
if ($risorsa instanceof Interventi && !empty($this->response['cliente'][$id])) {
$record['id_cliente'] = $this->response['cliente'][$id]['id'];
}
$response = null;
if (!empty($record['deleted_at'])) {
$risorsa->deleteRecord($record['id']);
} elseif (!empty($record['remote_id'])) {
$response = $risorsa->updateRecord($record);
} else {
$response = $risorsa->createRecord($record);
}
$this->response[$key][$id] = $response;
}
}
/**
* @param $record
* @param $risorsa
*
* @return bool
*/
protected function verificaConflitti($record, $risorsa)
{
$ultima_modifica = new Carbon($record['updated_at']);
$ultima_sincronizzazione = new Carbon($record['last_sync_at']);
if (!empty($record['last_sync_at']) && !$ultima_modifica->greaterThan($ultima_sincronizzazione)) {
return false;
}
$modifiche = $risorsa->getModifiedRecords($record['last_sync_at']);
$modifiche = array_keys($modifiche);
$this->conflitti_rilevati |= in_array($record['id'], $modifiche);
return true;
} }
} }

View File

@ -24,7 +24,7 @@ use API\Resource;
class Revisione extends Resource implements RetrieveInterface class Revisione extends Resource implements RetrieveInterface
{ {
const REVISION = '1.2'; const REVISION = '1.3';
public function retrieve($request) public function retrieve($request)
{ {