use std::sync::Arc; use holzleitner_application::ports::AuthService; use holzleitner_application::usecases::{ ApplyDeliveryActionUseCase, ApplyDeliveryCreditEventUseCase, ApplyScansUseCase, AssignCarToDeliveryUseCase, CompleteDeliveryUseCase, CreateDeliveryNoteUseCase, CreateMyCarUseCase, CreatePaymentMethodUseCase, CreateServiceUseCase, DeleteDeliveryNoteUseCase, DeleteDeliveryServiceUseCase, DeletePaymentMethodUseCase, DeleteServiceUseCase, DevResyncToursUseCase, GenerateDeliveryReportUseCase, GetAccountUseCase, GetAttachmentPreviewUseCase, GetTourUseCase, ImportErpToursUseCase, ListDeliveredBelegnummernUseCase, ListMyCarsUseCase, ListMyToursTodayUseCase, ListPaymentMethodsUseCase, ListServicesUseCase, MarkMailSentUseCase, ProcessDeliveryReportUseCase, PushCompletionToErpUseCase, SetDeliveryOrderUseCase, SetDeliveryServiceUseCase, SyncTourUseCase, UpdateDeliveryNoteUseCase, UpdateMyCarUseCase, UpdatePaymentMethodUseCase, UpdateServiceUseCase, UploadDeliveryNoteImageUseCase, }; /// Shared application state, der per Axum's `State`-Extractor in alle /// Handler hineingegeben wird. Use Cases und Services liegen hinter /// `Arc`, damit `Clone` billig ist und Requests sich keine Locks teilen. /// /// Das `AppState`-Klon wird zudem in die JWT-Middleware geschleust /// (`from_fn_with_state`), die den `auth_service` nutzt — derselbe /// Trait-Objekt-Arc wie die Handler. #[derive(Clone)] pub struct AppState { pub get_account: Arc, pub get_tour: Arc, pub list_my_tours_today: Arc, pub sync_tour: Arc, pub import_erp_tours: Arc, /// DEV-ONLY: überschreibender Resync (löscht Postgres + importiert neu). pub dev_resync_tours: Arc, /// Erzeugt den PDF-Lieferreport (lokal — Dev-Endpoint + Fallback ohne Upload). pub generate_delivery_report: Arc, /// Überträgt den Report an DOCUframe (Upload → Makro → Cleanup) — beim /// Abschluss (Hintergrund) + Retry-Cron + Dev-Endpoint. pub process_delivery_report: Arc, /// Spiegelt `REPORT_UPLOAD_ENABLED`: steuert, ob beim Abschluss die /// DOCUframe-Übertragung läuft (an) oder nur lokal erzeugt wird (aus). pub report_upload_enabled: bool, pub set_delivery_order: Arc, pub apply_scans: Arc, pub apply_delivery_action: Arc, pub complete_delivery: Arc, pub push_completion_to_erp: Arc, /// Admin: Belegnummern offener (noch nicht versendeter) Lieferungen. pub list_delivered_belegnummern: Arc, /// Admin: Liefermails von Belegnummern als versendet markieren (Dedup). pub mark_mail_sent: Arc, pub apply_delivery_credit_event: Arc, pub create_delivery_note: Arc, pub update_delivery_note: Arc, pub delete_delivery_note: Arc, pub upload_delivery_note_image: Arc, pub get_attachment_preview: Arc, pub list_my_cars: Arc, pub create_my_car: Arc, pub update_my_car: Arc, pub assign_car_to_delivery: Arc, pub list_payment_methods: Arc, pub create_payment_method: Arc, pub update_payment_method: Arc, pub delete_payment_method: Arc, pub list_services: Arc, pub create_service: Arc, pub update_service: Arc, pub delete_service: Arc, pub set_delivery_service: Arc, pub delete_delivery_service: Arc, pub auth_service: Arc, /// Statischer API-Key-Gate für die `/admin`-Routen (Header /// `X-Admin-Api-Key`). Leer ⇒ alle Admin-Routen gesperrt (fail-closed). /// Wird von der `admin_api_key`-Middleware konstant-zeitlich verglichen. pub admin_api_key: Arc, }