Skip to content

Commit f575c01

Browse files
committed
fix: utlizzo di insert ignore per evitare errore js in fase di modifica permessi utenti
1 parent c564065 commit f575c01

4 files changed

Lines changed: 25 additions & 58 deletions

File tree

modules/segmenti/actions.php

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,17 +110,8 @@
110110
$gruppi_con_accesso[] = ['idgruppo' => $id_gruppo_admin];
111111
}
112112

113-
$array = [];
114-
foreach ($gruppi_con_accesso as $gruppo) {
115-
$array[] = [
116-
'id_gruppo' => $gruppo['idgruppo'],
117-
'id_segment' => $id_record,
118-
];
119-
}
120-
121-
if (!empty($array)) {
122-
$dbo->insert('zz_group_segment', $array);
123-
}
113+
// Usa sync per evitare duplicati e sincronizzare correttamente i permessi
114+
$dbo->sync('zz_group_segment', ['id_segment' => $id_record], ['id_gruppo' => array_column($gruppi_con_accesso, 'idgruppo')]);
124115

125116
flash()->info(tr('Nuovo segmento aggiunto'));
126117

modules/utenti/actions.php

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,8 @@
4242
$group->save();
4343

4444
if ($id_module_start) {
45-
$dbo->insert('zz_permissions', [
46-
'idgruppo' => $id_record,
47-
'idmodule' => $id_module_start,
48-
'permessi' => 'r',
49-
]);
45+
// Usa INSERT IGNORE per evitare errori di duplicazione in caso di race condition
46+
$dbo->query('INSERT IGNORE INTO zz_permissions(idgruppo, idmodule, permessi) VALUES('.prepare($id_record).', '.prepare($id_module_start).', \'r\')');
5047

5148
// Sincronizza i permessi delle viste e dei segmenti per il modulo di partenza
5249
$group->syncModulePermissions($id_module_start, 'r');
@@ -120,7 +117,8 @@
120117
$sedi = array_merge([0], $sedi);
121118
}
122119
foreach ($sedi as $id_sede) {
123-
$dbo->query('INSERT INTO `zz_user_sedi` (`id_user`,`idsede`) VALUES ('.prepare($utente['id']).', '.prepare($id_sede).')');
120+
// Usa INSERT IGNORE per evitare errori di duplicazione in caso di race condition
121+
$dbo->query('INSERT IGNORE INTO `zz_user_sedi` (`id_user`,`idsede`) VALUES ('.prepare($utente['id']).', '.prepare($id_sede).')');
124122
}
125123

126124
flash()->info(tr("Informazioni per l'utente _USERNAME_ salvate correttamente!", [
@@ -258,11 +256,8 @@
258256
foreach ($permessi as $module_name => $permesso) {
259257
$module_id = Module::where('name', $module_name)->first()->id;
260258

261-
$dbo->insert('zz_permissions', [
262-
'idgruppo' => $id_record,
263-
'idmodule' => $module_id,
264-
'permessi' => $permesso,
265-
]);
259+
// Usa INSERT IGNORE per evitare errori di duplicazione in caso di race condition
260+
$dbo->query('INSERT IGNORE INTO zz_permissions(idgruppo, idmodule, permessi) VALUES('.prepare($id_record).', '.prepare($module_id).', '.prepare($permesso).')');
266261

267262
// Sincronizza i permessi delle viste e dei segmenti per ogni modulo
268263
$group->syncModulePermissions($module_id, $permesso);
@@ -282,7 +277,8 @@
282277
if ($permessi != '-') {
283278
$rs = $dbo->fetchArray('SELECT * FROM zz_permissions WHERE idgruppo='.prepare($id_record).' AND idmodule='.prepare($idmodulo));
284279
if (empty($rs)) {
285-
$query = 'INSERT INTO zz_permissions(idgruppo, idmodule, permessi) VALUES('.prepare($id_record).', '.prepare($idmodulo).', '.prepare($permessi).')';
280+
// Usa INSERT IGNORE per evitare errori di duplicazione in caso di race condition
281+
$query = 'INSERT IGNORE INTO zz_permissions(idgruppo, idmodule, permessi) VALUES('.prepare($id_record).', '.prepare($idmodulo).', '.prepare($permessi).')';
286282
} else {
287283
$query = 'UPDATE zz_permissions SET permessi='.prepare($permessi).' WHERE id='.prepare($rs[0]['id']);
288284
}

src/Database.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,13 @@ public function attach($table, $conditions, $list)
660660

661661
$inserts = array_unique(array_diff($sync, $results));
662662
foreach ($inserts as $insert) {
663-
$this->insert($table, array_merge($conditions, [$field => $insert]));
663+
// Usa INSERT IGNORE per evitare errori di duplicazione in caso di race condition
664+
$data = array_merge($conditions, [$field => $insert]);
665+
$columns = array_keys($data);
666+
$values = array_map(function ($v) {
667+
return $this->prepare($v);
668+
}, $data);
669+
$this->query('INSERT IGNORE INTO `'.$table.'` (`'.implode('`, `', $columns).'`) VALUES ('.implode(', ', $values).')');
664670
}
665671
}
666672

src/Models/Group.php

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -99,61 +99,35 @@ public function syncModulePermissions($id_module, $permessi)
9999
$default_views = $database->fetchArray('SELECT `id` FROM `zz_views` WHERE `id_module`='.prepare($id_module).' AND `default` = 1');
100100

101101
foreach ($default_views as $view) {
102-
// Controlla se il gruppo ha già accesso a questa vista specifica
103-
$has_view_access = $database->fetchArray('SELECT COUNT(*) as cont FROM `zz_group_view` WHERE `id_gruppo` = '.prepare($this->id).' AND `id_vista` = '.prepare($view['id']))['cont'];
104-
105-
if ($has_view_access == 0) {
106-
$database->insert('zz_group_view', [
107-
'id_gruppo' => $this->id,
108-
'id_vista' => $view['id'],
109-
]);
110-
}
102+
// Usa INSERT IGNORE per evitare errori di duplicazione
103+
$database->query('INSERT IGNORE INTO `zz_group_view` (`id_gruppo`, `id_vista`) VALUES ('.prepare($this->id).', '.prepare($view['id']).')');
111104
}
112105

113106
// Se non ci sono viste predefinite, aggiungi il gruppo a tutte le viste del modulo
114107
if (empty($default_views)) {
115108
$all_views = $database->fetchArray('SELECT `id` FROM `zz_views` WHERE `id_module`='.prepare($id_module).' ORDER BY `order` ASC');
116109

117110
foreach ($all_views as $view) {
118-
$has_view_access = $database->fetchArray('SELECT COUNT(*) as cont FROM `zz_group_view` WHERE `id_gruppo` = '.prepare($this->id).' AND `id_vista` = '.prepare($view['id']))['cont'];
119-
120-
if ($has_view_access == 0) {
121-
$database->insert('zz_group_view', [
122-
'id_gruppo' => $this->id,
123-
'id_vista' => $view['id'],
124-
]);
125-
}
111+
// Usa INSERT IGNORE per evitare errori di duplicazione
112+
$database->query('INSERT IGNORE INTO `zz_group_view` (`id_gruppo`, `id_vista`) VALUES ('.prepare($this->id).', '.prepare($view['id']).')');
126113
}
127114
}
128115

129116
// Aggiungi accesso ai segmenti predefiniti se non ce l'ha già
130117
$default_segments = $database->fetchArray('SELECT `id` FROM `zz_segments` WHERE `id_module`='.prepare($id_module).' AND `predefined` = 1');
131118

132119
foreach ($default_segments as $segment) {
133-
// Controlla se il gruppo ha già accesso a questo segmento specifico
134-
$has_segment_access = $database->fetchArray('SELECT COUNT(*) as cont FROM `zz_group_segment` WHERE `id_gruppo` = '.prepare($this->id).' AND `id_segment` = '.prepare($segment['id']))['cont'];
135-
136-
if ($has_segment_access == 0) {
137-
$database->insert('zz_group_segment', [
138-
'id_gruppo' => $this->id,
139-
'id_segment' => $segment['id'],
140-
]);
141-
}
120+
// Usa INSERT IGNORE per evitare errori di duplicazione
121+
$database->query('INSERT IGNORE INTO `zz_group_segment` (`id_gruppo`, `id_segment`) VALUES ('.prepare($this->id).', '.prepare($segment['id']).')');
142122
}
143123

144124
// Se non ci sono segmenti predefiniti, aggiungi il gruppo ad almeno un segmento (il primo disponibile)
145125
if (empty($default_segments)) {
146126
$first_segment = $database->fetchArray('SELECT `id` FROM `zz_segments` WHERE `id_module`='.prepare($id_module).' ORDER BY `id` ASC LIMIT 1');
147127

148128
if (!empty($first_segment)) {
149-
$has_segment_access = $database->fetchArray('SELECT COUNT(*) as cont FROM `zz_group_segment` WHERE `id_gruppo` = '.prepare($this->id).' AND `id_segment` = '.prepare($first_segment[0]['id']))['cont'];
150-
151-
if ($has_segment_access == 0) {
152-
$database->insert('zz_group_segment', [
153-
'id_gruppo' => $this->id,
154-
'id_segment' => $first_segment[0]['id'],
155-
]);
156-
}
129+
// Usa INSERT IGNORE per evitare errori di duplicazione
130+
$database->query('INSERT IGNORE INTO `zz_group_segment` (`id_gruppo`, `id_segment`) VALUES ('.prepare($this->id).', '.prepare($first_segment[0]['id']).')');
157131
}
158132
}
159133
} else {

0 commit comments

Comments
 (0)