Files
Holzleitner---Backend--aktu…/crates/api/src/state.rs
Dennis Nemec 6a9b5872e1 Backend-Arbeitsstand: ERP-Sync, Lieferlebenszyklus, Reports + config.toml
Bringt das Backend vom initialen Skeleton auf den aktuellen Arbeitsstand
(Clean Architecture: domain → application → infrastructure → api).

Wesentliche Bereiche:
- ERP-Anbindung (MSSQL-Pull der Touren, Import-Scheduler, Rückschreiben)
- Lieferlebenszyklus: Scan/Hold/Cancel/Complete, Gutschriften, Notizen,
  Bild-Anhänge, Unterschriften, PDF-Lieferreport → DOCUframe
- Stammdaten: Kunden, Artikel, Lager, Zahlungsarten, Services
- Keycloak-JWT-Gate + Fahrer-Provisionierung via Admin-API
- Admin-API-Key-Gate (X-Admin-Api-Key) für Maschinen-Endpunkte

Jüngste Änderungen dieser Session:
- Belegspezifische Kontaktdaten: alle ERP-Adressen (Beleg-/Liefer-/
  Rechnungsadresse, Ansprechpartner, Kundenstamm) mit Telefon/Mobil/
  E-Mail werden gesynct (Migration 0029, MSSQL-Query, TourDetails)
- Konfiguration von .env (envy/dotenvy) auf config.toml (toml/serde)
  umgestellt; Vorlage config.example.toml, Pfad via HOLZLEITNER_CONFIG

Nicht im Repo (per .gitignore): config.toml (Secrets), data/ (Laufzeit-/
Kundendaten), demo.mp4, .claude/, variocontrol-ai/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 17:52:58 +02:00

79 lines
4.4 KiB
Rust

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<GetAccountUseCase>,
pub get_tour: Arc<GetTourUseCase>,
pub list_my_tours_today: Arc<ListMyToursTodayUseCase>,
pub sync_tour: Arc<SyncTourUseCase>,
pub import_erp_tours: Arc<ImportErpToursUseCase>,
/// DEV-ONLY: überschreibender Resync (löscht Postgres + importiert neu).
pub dev_resync_tours: Arc<DevResyncToursUseCase>,
/// Erzeugt den PDF-Lieferreport (lokal — Dev-Endpoint + Fallback ohne Upload).
pub generate_delivery_report: Arc<GenerateDeliveryReportUseCase>,
/// Überträgt den Report an DOCUframe (Upload → Makro → Cleanup) — beim
/// Abschluss (Hintergrund) + Retry-Cron + Dev-Endpoint.
pub process_delivery_report: Arc<ProcessDeliveryReportUseCase>,
/// 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<SetDeliveryOrderUseCase>,
pub apply_scans: Arc<ApplyScansUseCase>,
pub apply_delivery_action: Arc<ApplyDeliveryActionUseCase>,
pub complete_delivery: Arc<CompleteDeliveryUseCase>,
pub push_completion_to_erp: Arc<PushCompletionToErpUseCase>,
/// Admin: Belegnummern offener (noch nicht versendeter) Lieferungen.
pub list_delivered_belegnummern: Arc<ListDeliveredBelegnummernUseCase>,
/// Admin: Liefermails von Belegnummern als versendet markieren (Dedup).
pub mark_mail_sent: Arc<MarkMailSentUseCase>,
pub apply_delivery_credit_event: Arc<ApplyDeliveryCreditEventUseCase>,
pub create_delivery_note: Arc<CreateDeliveryNoteUseCase>,
pub update_delivery_note: Arc<UpdateDeliveryNoteUseCase>,
pub delete_delivery_note: Arc<DeleteDeliveryNoteUseCase>,
pub upload_delivery_note_image: Arc<UploadDeliveryNoteImageUseCase>,
pub get_attachment_preview: Arc<GetAttachmentPreviewUseCase>,
pub list_my_cars: Arc<ListMyCarsUseCase>,
pub create_my_car: Arc<CreateMyCarUseCase>,
pub update_my_car: Arc<UpdateMyCarUseCase>,
pub assign_car_to_delivery: Arc<AssignCarToDeliveryUseCase>,
pub list_payment_methods: Arc<ListPaymentMethodsUseCase>,
pub create_payment_method: Arc<CreatePaymentMethodUseCase>,
pub update_payment_method: Arc<UpdatePaymentMethodUseCase>,
pub delete_payment_method: Arc<DeletePaymentMethodUseCase>,
pub list_services: Arc<ListServicesUseCase>,
pub create_service: Arc<CreateServiceUseCase>,
pub update_service: Arc<UpdateServiceUseCase>,
pub delete_service: Arc<DeleteServiceUseCase>,
pub set_delivery_service: Arc<SetDeliveryServiceUseCase>,
pub delete_delivery_service: Arc<DeleteDeliveryServiceUseCase>,
pub auth_service: Arc<dyn AuthService>,
/// 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<str>,
}