Employee-Controller: beim Gelöscht-Setzen Verknüpfung in Auth-DB lösen
authorMoritz Bunkus <m.bunkus@linet.de>
Mon, 9 Nov 2020 10:19:10 +0000 (11:19 +0100)
committerMoritz Bunkus <m.bunkus@linet.de>
Mon, 9 Nov 2020 10:19:10 +0000 (11:19 +0100)
Beim Anlegen von Benutzer*inen in der Auth-DB werden sie nicht
zwangsweise auch in der Mandanten-DB angelegt, z.B. wenn die in dem
Moment noch nicht existiert. Daher werden bei jedem Login in einem
Mandanten alle Benutzer*innen, die in dem Moment mit dem Mandanten
verknüpft sind, in der Mandanten-DB angelegt (falls noch nicht
existierend) und das »gelöscht«-Flag wieder entfernt.

Beim Löschen von Benutzer*innen aus dem Admin-Bereich heraus ist das
soweit auch OK, denn dann wird in der Auth-DB der Eintrag entfernt und
in der Mandanten-DB das Login auf »gelöscht« gesetzt.

Es gibt aber auch im Mandantenbereich einen Controller zum Bearbeiten
von Benutzer*innen, in dem das »gelöscht«-Flag gesetzt werden
kann. Und hier wurde bisher nur die Mandanten-DB angefasst, nicht aber
die Auth-DB. Wenn also hier ein(e) Benutzer*in auf »gelöscht« gesetzt
wird, so wurde beim nächsten Login in den Mandanten in der Auth-DB
nachgesehen, dort war der Account noch verknüpft, also wurde das
»gelöscht«-Flag wieder entfernt.

Fix ist, dass nun auch in der Auth-DB die Verknüpfung des Accounts mit
dem Mandanten entfernt wird. Der Account wird in der Auth-DB aber
nicht gelöscht, weil er ja auch noch auf andere Mandanten Zugriff
haben könnte.

Fix für #97.

SL/Controller/Employee.pm

index 6792272..431c8b7 100644 (file)
@@ -35,7 +35,24 @@ sub action_edit {
 sub action_save {
   my ($self, %params) = @_;
 
-  $self->{employee}->save;
+  SL::DB->client->with_transaction(sub {
+    1;
+
+    $self->{employee}->save;
+
+    if ($self->{employee}->deleted) {
+      my $auth_user = SL::DB::Manager::AuthUser->get_first(login => $self->{employee}->login);
+      if ($auth_user) {
+        SL::DB::Manager::AuthClientUser->delete_all(
+          where => [
+            client_id => $::auth->client->{id},
+            user_id   => $auth_user->id,
+          ]);
+      }
+    }
+
+    1;
+  });
 
   flash('info', $::locale->text('Employee #1 saved!', $self->{employee}->safe_name));