Skip to main content

koprogo_api/infrastructure/web/
app_state.rs

1use crate::application::ports::mqtt_energy_port::MqttEnergyPort;
2use crate::application::use_cases::boinc_use_cases::BoincUseCases;
3use crate::application::use_cases::consent_use_cases::ConsentUseCases;
4use crate::application::use_cases::module_registry_use_cases::ModuleRegistryUseCases;
5use crate::application::use_cases::{
6    AccountUseCases, AchievementUseCases, AcpUseCases, AgSessionUseCases, AgeRequestUseCases,
7    AuditLogUseCases, AuthUseCases, BoardDashboardUseCases, BoardDecisionUseCases,
8    BoardMemberUseCases, BudgetUseCases, BuildingUseCases, CallForFundsUseCases, CdcUseCases,
9    ChallengeUseCases, ChargeDistributionUseCases, ContractorEvaluationUseCases,
10    ContractorReportUseCases, ConvocationUseCases, DashboardUseCases, DocumentUseCases,
11    EnergyBillUploadUseCases, EnergyCampaignUseCases, EtatDateUseCases, ExpenseUseCases,
12    FinancialReportUseCases, GamificationStatsUseCases, GdprArt30UseCases, GdprUseCases,
13    IndividualMemberUseCases, IoTUseCases, JournalEntryUseCases, LienNotaireUseCases,
14    LinkyUseCases, LocalExchangeUseCases, MagicLinkUseCases, MandateUseCases, MeetingUseCases,
15    NoticeUseCases, NotificationUseCases, OrganizationUseCases, OwnerContributionUseCases,
16    OwnerUseCases, PaymentMethodUseCases, PaymentReminderUseCases, PaymentUseCases, PcnUseCases,
17    PollUseCases, PortfolioUseCases, QuoteUseCases, ResolutionUseCases, ResourceBookingUseCases,
18    RoleDelegationUseCases, SecurityIncidentUseCases, ServiceProviderUseCases,
19    SharedObjectUseCases, SkillUseCases, StatsUseCases, SyndicResponseUseCases,
20    TechnicalInspectionUseCases, TechnicalSpecUseCases, TicketUseCases, TwoFactorUseCases,
21    UnitOwnerUseCases, UnitUseCases, UserUseCases, WorkReportUseCases,
22};
23use crate::infrastructure::audit_logger::AuditLogger;
24use crate::infrastructure::database::repositories::{
25    PostgresModuleRegistry, PostgresSyndicResponseRepository, PostgresTicketRepository,
26};
27use crate::infrastructure::email::EmailService;
28use crate::infrastructure::pool::DbPool;
29use std::sync::Arc;
30
31pub struct AppState {
32    pub account_use_cases: Arc<AccountUseCases>,
33    pub acp_use_cases: Arc<AcpUseCases>,
34    /// Registre de modules par ACP — Story 5.1 (#585), ADR-0015.
35    pub module_registry_use_cases: Arc<ModuleRegistryUseCases>,
36    pub audit_log_use_cases: Arc<AuditLogUseCases>,
37    pub auth_use_cases: Arc<AuthUseCases>,
38    pub building_use_cases: Arc<BuildingUseCases>,
39    pub budget_use_cases: Arc<BudgetUseCases>,
40    pub unit_use_cases: Arc<UnitUseCases>,
41    pub owner_use_cases: Arc<OwnerUseCases>,
42    pub unit_owner_use_cases: Arc<UnitOwnerUseCases>,
43    pub expense_use_cases: Arc<ExpenseUseCases>,
44    pub charge_distribution_use_cases: Arc<ChargeDistributionUseCases>,
45    pub meeting_use_cases: Arc<MeetingUseCases>,
46    pub convocation_use_cases: Arc<ConvocationUseCases>,
47    pub resolution_use_cases: Arc<ResolutionUseCases>,
48    pub ticket_use_cases: Arc<TicketUseCases>,
49    pub two_factor_use_cases: Arc<TwoFactorUseCases>,
50    pub notification_use_cases: Arc<NotificationUseCases>,
51    pub payment_use_cases: Arc<PaymentUseCases>,
52    pub payment_method_use_cases: Arc<PaymentMethodUseCases>,
53    pub poll_use_cases: Arc<PollUseCases>,
54    pub portfolio_use_cases: Arc<PortfolioUseCases>,
55    pub quote_use_cases: Arc<QuoteUseCases>,
56    pub local_exchange_use_cases: Arc<LocalExchangeUseCases>,
57    pub notice_use_cases: Arc<NoticeUseCases>,
58    pub organization_use_cases: Arc<OrganizationUseCases>,
59    pub resource_booking_use_cases: Arc<ResourceBookingUseCases>,
60    pub shared_object_use_cases: Arc<SharedObjectUseCases>,
61    pub skill_use_cases: Arc<SkillUseCases>,
62    pub stats_use_cases: Arc<StatsUseCases>,
63    pub technical_inspection_use_cases: Arc<TechnicalInspectionUseCases>,
64    pub work_report_use_cases: Arc<WorkReportUseCases>,
65    pub document_use_cases: Arc<DocumentUseCases>,
66    pub energy_campaign_use_cases: Arc<EnergyCampaignUseCases>,
67    pub energy_bill_upload_use_cases: Arc<EnergyBillUploadUseCases>,
68    pub etat_date_use_cases: Arc<EtatDateUseCases>,
69    pub pcn_use_cases: Arc<PcnUseCases>,
70    pub payment_reminder_use_cases: Arc<PaymentReminderUseCases>,
71    pub gdpr_art30_use_cases: Arc<GdprArt30UseCases>,
72    pub gdpr_use_cases: Arc<GdprUseCases>,
73    pub iot_use_cases: Arc<IoTUseCases>,
74    pub linky_use_cases: Arc<LinkyUseCases>,
75    pub board_member_use_cases: Arc<BoardMemberUseCases>,
76    pub board_decision_use_cases: Arc<BoardDecisionUseCases>,
77    pub cdc_use_cases: Arc<CdcUseCases>,
78    pub board_dashboard_use_cases: Arc<BoardDashboardUseCases>,
79    pub dashboard_use_cases: Arc<DashboardUseCases>,
80    pub financial_report_use_cases: Arc<FinancialReportUseCases>,
81    pub owner_contribution_use_cases: Arc<OwnerContributionUseCases>,
82    pub call_for_funds_use_cases: Arc<CallForFundsUseCases>,
83    pub journal_entry_use_cases: Arc<JournalEntryUseCases>,
84    pub achievement_use_cases: Arc<AchievementUseCases>,
85    pub challenge_use_cases: Arc<ChallengeUseCases>,
86    pub gamification_stats_use_cases: Arc<GamificationStatsUseCases>,
87    pub ag_session_use_cases: Arc<AgSessionUseCases>,
88    pub age_request_use_cases: Arc<AgeRequestUseCases>,
89    pub contractor_report_use_cases: Arc<ContractorReportUseCases>,
90    pub security_incident_use_cases: Arc<SecurityIncidentUseCases>,
91    pub service_provider_use_cases: Arc<ServiceProviderUseCases>,
92    pub individual_member_use_cases: Arc<IndividualMemberUseCases>,
93    pub consent_use_cases: Arc<ConsentUseCases>,
94    pub audit_logger: Arc<AuditLogger>,
95    pub email_service: Arc<EmailService>,
96    pub pool: DbPool, // For seeding operations
97    // IoT Phase 1: MQTT Home Assistant + BOINC Grid
98    pub mqtt_energy_adapter: Arc<dyn MqttEnergyPort>,
99    pub boinc_use_cases: Arc<BoincUseCases>,
100    pub user_use_cases: Arc<UserUseCases>,
101    /// Story 3.2 — generic MagicLink (public-access tokens for contractors / tiers).
102    pub magic_link_use_cases: Arc<MagicLinkUseCases>,
103    /// #845 / ADR 0051 — notary link (signed, renewable, revocable access to
104    /// a single état daté via `GET /etats-dates/reference/{reference_number}`).
105    pub lien_notaire_use_cases: Arc<LienNotaireUseCases>,
106    /// Story 3.4 — Mandate (delegation to external professionals: notaire,
107    /// avocat, AMO, architecte, BET, gardien) with bounded validity.
108    pub mandate_use_cases: Arc<MandateUseCases>,
109    /// Story 3.5 — Temporary role delegation (syndic → owner, bounded).
110    pub role_delegation_use_cases: Arc<RoleDelegationUseCases>,
111    /// Story 3.7 — SyndicResponse (append-only) + SLA escalation use-cases.
112    /// Concrete types because the use-case struct is generic over the two
113    /// repository traits; we use the production Postgres implementations
114    /// here and a single concrete alias in handlers / tests.
115    pub syndic_response_use_cases:
116        Arc<SyndicResponseUseCases<PostgresSyndicResponseRepository, PostgresTicketRepository>>,
117    /// Story 3.8 — TechnicalSpec (versionable + signatures multi-parties).
118    pub technical_spec_use_cases: Arc<TechnicalSpecUseCases>,
119    /// Story 3.9 — ContractorEvaluation (append-only, gated by an approved
120    /// TechnicalSpec) (FR34 FR35 INV-21 INV-24).
121    pub contractor_evaluation_use_cases: Arc<ContractorEvaluationUseCases>,
122}
123
124impl AppState {
125    #[allow(clippy::too_many_arguments)]
126    pub fn new(
127        account_use_cases: AccountUseCases,
128        acp_use_cases: AcpUseCases,
129        audit_log_use_cases: AuditLogUseCases,
130        auth_use_cases: AuthUseCases,
131        building_use_cases: BuildingUseCases,
132        budget_use_cases: BudgetUseCases,
133        unit_use_cases: UnitUseCases,
134        owner_use_cases: OwnerUseCases,
135        unit_owner_use_cases: UnitOwnerUseCases,
136        expense_use_cases: ExpenseUseCases,
137        charge_distribution_use_cases: ChargeDistributionUseCases,
138        meeting_use_cases: MeetingUseCases,
139        convocation_use_cases: ConvocationUseCases,
140        resolution_use_cases: ResolutionUseCases,
141        ticket_use_cases: TicketUseCases,
142        two_factor_use_cases: TwoFactorUseCases,
143        notification_use_cases: NotificationUseCases,
144        payment_use_cases: Arc<PaymentUseCases>,
145        payment_method_use_cases: PaymentMethodUseCases,
146        poll_use_cases: PollUseCases,
147        portfolio_use_cases: PortfolioUseCases,
148        quote_use_cases: QuoteUseCases,
149        local_exchange_use_cases: LocalExchangeUseCases,
150        notice_use_cases: NoticeUseCases,
151        organization_use_cases: OrganizationUseCases,
152        resource_booking_use_cases: ResourceBookingUseCases,
153        shared_object_use_cases: SharedObjectUseCases,
154        skill_use_cases: SkillUseCases,
155        stats_use_cases: StatsUseCases,
156        technical_inspection_use_cases: TechnicalInspectionUseCases,
157        work_report_use_cases: WorkReportUseCases,
158        document_use_cases: DocumentUseCases,
159        energy_campaign_use_cases: EnergyCampaignUseCases,
160        energy_bill_upload_use_cases: EnergyBillUploadUseCases,
161        etat_date_use_cases: EtatDateUseCases,
162        pcn_use_cases: PcnUseCases,
163        payment_reminder_use_cases: PaymentReminderUseCases,
164        gdpr_art30_use_cases: GdprArt30UseCases,
165        gdpr_use_cases: GdprUseCases,
166        iot_use_cases: IoTUseCases,
167        linky_use_cases: LinkyUseCases,
168        board_member_use_cases: BoardMemberUseCases,
169        board_decision_use_cases: BoardDecisionUseCases,
170        cdc_use_cases: CdcUseCases,
171        board_dashboard_use_cases: BoardDashboardUseCases,
172        dashboard_use_cases: DashboardUseCases,
173        financial_report_use_cases: FinancialReportUseCases,
174        owner_contribution_use_cases: OwnerContributionUseCases,
175        call_for_funds_use_cases: CallForFundsUseCases,
176        journal_entry_use_cases: JournalEntryUseCases,
177        achievement_use_cases: AchievementUseCases,
178        challenge_use_cases: ChallengeUseCases,
179        gamification_stats_use_cases: GamificationStatsUseCases,
180        ag_session_use_cases: AgSessionUseCases,
181        age_request_use_cases: AgeRequestUseCases,
182        contractor_report_use_cases: ContractorReportUseCases,
183        security_incident_use_cases: SecurityIncidentUseCases,
184        service_provider_use_cases: ServiceProviderUseCases,
185        individual_member_use_cases: IndividualMemberUseCases,
186        consent_use_cases: ConsentUseCases,
187        audit_logger: AuditLogger,
188        email_service: EmailService,
189        pool: DbPool,
190        mqtt_energy_adapter: Arc<dyn MqttEnergyPort>,
191        boinc_use_cases: BoincUseCases,
192        user_use_cases: UserUseCases,
193        magic_link_use_cases: MagicLinkUseCases,
194        lien_notaire_use_cases: LienNotaireUseCases,
195        mandate_use_cases: MandateUseCases,
196        role_delegation_use_cases: RoleDelegationUseCases,
197        syndic_response_use_cases: SyndicResponseUseCases<
198            PostgresSyndicResponseRepository,
199            PostgresTicketRepository,
200        >,
201        technical_spec_use_cases: TechnicalSpecUseCases,
202        contractor_evaluation_use_cases: ContractorEvaluationUseCases,
203    ) -> Self {
204        // Construit ICI plutôt qu'ajouté à la signature : `new()` est
205        // positionnelle et appelée par plusieurs harnais de test. Un
206        // paramètre de plus les aurait tous cassés d'un coup, pour une
207        // dépendance qu'on sait déjà dériver de `pool` et `acp_use_cases`.
208        let acp_use_cases = Arc::new(acp_use_cases);
209        let module_registry_use_cases = Arc::new(ModuleRegistryUseCases::new(
210            Arc::new(PostgresModuleRegistry::new(pool.clone())),
211            acp_use_cases.clone(),
212        ));
213
214        Self {
215            account_use_cases: Arc::new(account_use_cases),
216            acp_use_cases,
217            module_registry_use_cases,
218            audit_log_use_cases: Arc::new(audit_log_use_cases),
219            auth_use_cases: Arc::new(auth_use_cases),
220            building_use_cases: Arc::new(building_use_cases),
221            budget_use_cases: Arc::new(budget_use_cases),
222            unit_use_cases: Arc::new(unit_use_cases),
223            owner_use_cases: Arc::new(owner_use_cases),
224            unit_owner_use_cases: Arc::new(unit_owner_use_cases),
225            expense_use_cases: Arc::new(expense_use_cases),
226            charge_distribution_use_cases: Arc::new(charge_distribution_use_cases),
227            meeting_use_cases: Arc::new(meeting_use_cases),
228            convocation_use_cases: Arc::new(convocation_use_cases),
229            resolution_use_cases: Arc::new(resolution_use_cases),
230            ticket_use_cases: Arc::new(ticket_use_cases),
231            two_factor_use_cases: Arc::new(two_factor_use_cases),
232            notification_use_cases: Arc::new(notification_use_cases),
233            payment_use_cases,
234            payment_method_use_cases: Arc::new(payment_method_use_cases),
235            poll_use_cases: Arc::new(poll_use_cases),
236            portfolio_use_cases: Arc::new(portfolio_use_cases),
237            quote_use_cases: Arc::new(quote_use_cases),
238            local_exchange_use_cases: Arc::new(local_exchange_use_cases),
239            notice_use_cases: Arc::new(notice_use_cases),
240            organization_use_cases: Arc::new(organization_use_cases),
241            resource_booking_use_cases: Arc::new(resource_booking_use_cases),
242            shared_object_use_cases: Arc::new(shared_object_use_cases),
243            skill_use_cases: Arc::new(skill_use_cases),
244            stats_use_cases: Arc::new(stats_use_cases),
245            technical_inspection_use_cases: Arc::new(technical_inspection_use_cases),
246            work_report_use_cases: Arc::new(work_report_use_cases),
247            document_use_cases: Arc::new(document_use_cases),
248            energy_campaign_use_cases: Arc::new(energy_campaign_use_cases),
249            energy_bill_upload_use_cases: Arc::new(energy_bill_upload_use_cases),
250            etat_date_use_cases: Arc::new(etat_date_use_cases),
251            pcn_use_cases: Arc::new(pcn_use_cases),
252            payment_reminder_use_cases: Arc::new(payment_reminder_use_cases),
253            gdpr_art30_use_cases: Arc::new(gdpr_art30_use_cases),
254            gdpr_use_cases: Arc::new(gdpr_use_cases),
255            iot_use_cases: Arc::new(iot_use_cases),
256            linky_use_cases: Arc::new(linky_use_cases),
257            board_member_use_cases: Arc::new(board_member_use_cases),
258            board_decision_use_cases: Arc::new(board_decision_use_cases),
259            cdc_use_cases: Arc::new(cdc_use_cases),
260            board_dashboard_use_cases: Arc::new(board_dashboard_use_cases),
261            dashboard_use_cases: Arc::new(dashboard_use_cases),
262            financial_report_use_cases: Arc::new(financial_report_use_cases),
263            owner_contribution_use_cases: Arc::new(owner_contribution_use_cases),
264            call_for_funds_use_cases: Arc::new(call_for_funds_use_cases),
265            journal_entry_use_cases: Arc::new(journal_entry_use_cases),
266            achievement_use_cases: Arc::new(achievement_use_cases),
267            challenge_use_cases: Arc::new(challenge_use_cases),
268            gamification_stats_use_cases: Arc::new(gamification_stats_use_cases),
269            ag_session_use_cases: Arc::new(ag_session_use_cases),
270            age_request_use_cases: Arc::new(age_request_use_cases),
271            contractor_report_use_cases: Arc::new(contractor_report_use_cases),
272            security_incident_use_cases: Arc::new(security_incident_use_cases),
273            service_provider_use_cases: Arc::new(service_provider_use_cases),
274            individual_member_use_cases: Arc::new(individual_member_use_cases),
275            consent_use_cases: Arc::new(consent_use_cases),
276            audit_logger: Arc::new(audit_logger),
277            email_service: Arc::new(email_service),
278            pool,
279            mqtt_energy_adapter,
280            boinc_use_cases: Arc::new(boinc_use_cases),
281            user_use_cases: Arc::new(user_use_cases),
282            magic_link_use_cases: Arc::new(magic_link_use_cases),
283            lien_notaire_use_cases: Arc::new(lien_notaire_use_cases),
284            mandate_use_cases: Arc::new(mandate_use_cases),
285            role_delegation_use_cases: Arc::new(role_delegation_use_cases),
286            syndic_response_use_cases: Arc::new(syndic_response_use_cases),
287            technical_spec_use_cases: Arc::new(technical_spec_use_cases),
288            contractor_evaluation_use_cases: Arc::new(contractor_evaluation_use_cases),
289        }
290    }
291}