//! Port für das **Provisionieren** von Fahrer-Konten im Identity-Provider //! (Keycloak) beim ERP-Sync. //! //! Wenn der tägliche Touren-Import einen Fahrer (ERP-`Vertreter`, fachlich die //! Account-/Vertragspartner-Nummer) sieht, soll im Realm ein Login-Konto //! existieren: Benutzername = Fahrer-/Account-Nummer, ein **temporäres** //! Passwort, das beim ersten Login zwingend geändert werden muss //! (Keycloak-Required-Action `UPDATE_PASSWORD`), und die Rolle `driver`. //! //! Die konkrete Impl (Keycloak Admin-REST via reqwest) lebt in //! `holzleitner-infrastructure` und MUSS **idempotent** sein: existiert der //! User bereits, passiert nichts (kein Passwort-Reset, keine Doppelanlage). use async_trait::async_trait; use crate::error::ApplicationError; /// Ergebnis einer Provisionierung — ob ein Konto **neu** angelegt wurde. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct ProvisionOutcome { /// `true` ⇒ Konto wurde in diesem Aufruf erstellt; `false` ⇒ existierte /// bereits (idempotenter No-Op). pub created: bool, } #[async_trait] pub trait DriverIdentityProvisioner: Send + Sync { /// Stellt sicher, dass für `personalnummer` ein Login-Konto existiert. /// Idempotent. `display_name` ist ein optionaler Anzeigename (z. B. /// „Fahrer 423") — nur kosmetisch im IdP. async fn ensure_driver( &self, personalnummer: i64, display_name: Option<&str>, ) -> Result; }