koprogo_api/infrastructure/web/
routes.rs

1use crate::infrastructure::configure_swagger_ui;
2use crate::infrastructure::web::handlers::*;
3use actix_web::web;
4
5pub fn configure_routes(cfg: &mut web::ServiceConfig) {
6    // OpenAPI Swagger UI (accessible at /swagger-ui/)
7    cfg.service(configure_swagger_ui());
8
9    cfg.service(metrics_endpoint);
10
11    cfg.service(
12        web::scope("/api/v1")
13            .service(health_check)
14            // Public Endpoints (no authentication required - Issue #92)
15            .service(get_public_syndic_info)
16            // Authentication
17            .service(login)
18            .service(register)
19            .service(refresh_token)
20            .service(switch_role)
21            .service(get_current_user)
22            // Buildings
23            .service(create_building)
24            .service(list_buildings)
25            .service(get_building)
26            .service(update_building)
27            .service(delete_building)
28            .service(export_annual_report_pdf) // PDF Export (Issue #47)
29            // Units
30            .service(create_unit)
31            .service(list_units)
32            .service(get_unit)
33            .service(update_unit)
34            .service(delete_unit)
35            .service(list_units_by_building)
36            .service(assign_owner)
37            // Owners
38            .service(create_owner)
39            .service(list_owners)
40            .service(get_owner)
41            .service(update_owner)
42            .service(link_owner_to_user)
43            .service(export_owner_statement_pdf) // PDF Export (Issue #47)
44            // Owner Contributions (Revenue)
45            .service(create_contribution)
46            .service(get_contribution)
47            .service(get_contributions_by_owner)
48            .service(get_outstanding_contributions)
49            .service(record_payment)
50            // Call for Funds (Collective payment requests)
51            .service(create_call_for_funds)
52            .service(get_call_for_funds)
53            .service(list_call_for_funds)
54            .service(get_overdue_calls)
55            .service(send_call_for_funds)
56            .service(cancel_call_for_funds)
57            .service(delete_call_for_funds)
58            // Unit-Owner Relationships
59            .service(add_owner_to_unit)
60            .service(remove_owner_from_unit)
61            .service(update_unit_owner)
62            .service(get_unit_owners)
63            .service(get_owner_units)
64            .service(get_unit_ownership_history)
65            .service(get_owner_ownership_history)
66            .service(transfer_ownership)
67            .service(get_total_ownership_percentage)
68            .service(export_ownership_contract_pdf) // PDF Export (Issue #47)
69            // Expenses
70            .service(create_expense)
71            .service(list_expenses)
72            .service(get_expense)
73            .service(list_expenses_by_building)
74            .service(mark_expense_paid)
75            .service(mark_expense_overdue)
76            .service(cancel_expense)
77            .service(reactivate_expense)
78            .service(unpay_expense)
79            // Invoice Workflow (Issue #73)
80            .service(create_invoice_draft)
81            .service(update_invoice_draft)
82            .service(submit_invoice_for_approval)
83            .service(approve_invoice)
84            .service(reject_invoice)
85            .service(get_pending_invoices)
86            .service(get_invoice)
87            .service(export_work_quote_pdf) // PDF Export (Issue #47)
88            // Charge Distribution (Issue #73)
89            .service(calculate_and_save_distribution)
90            .service(get_distribution_by_expense)
91            .service(get_distributions_by_owner)
92            .service(get_total_due_by_owner)
93            // Meetings
94            .service(create_meeting)
95            .service(list_meetings)
96            .service(get_meeting)
97            .service(list_meetings_by_building)
98            .service(update_meeting)
99            .service(add_agenda_item)
100            .service(complete_meeting)
101            .service(cancel_meeting)
102            .service(reschedule_meeting)
103            .service(delete_meeting)
104            .service(export_meeting_minutes_pdf)
105            // Convocations (Automatic AG Invitations - Issue #88 - Phase 2)
106            .service(create_convocation)
107            .service(get_convocation)
108            .service(get_convocation_by_meeting)
109            .service(list_building_convocations)
110            .service(list_organization_convocations)
111            .service(delete_convocation)
112            .service(schedule_convocation)
113            .service(send_convocation)
114            .service(cancel_convocation)
115            .service(list_convocation_recipients)
116            .service(get_convocation_tracking_summary)
117            .service(mark_recipient_email_opened)
118            .service(update_recipient_attendance)
119            .service(set_recipient_proxy)
120            .service(send_convocation_reminders)
121            // Resolutions & Voting (Issue #46 - Phase 2)
122            .service(create_resolution)
123            .service(get_resolution)
124            .service(list_meeting_resolutions)
125            .service(delete_resolution)
126            .service(cast_vote)
127            .service(list_resolution_votes)
128            .service(change_vote)
129            .service(close_voting)
130            .service(get_meeting_vote_summary)
131            // Polls (Board Decision Polls - Issue #51 - Phase 2)
132            .service(create_poll)
133            .service(get_poll)
134            .service(update_poll)
135            .service(list_polls)
136            .service(find_active_polls)
137            .service(publish_poll)
138            .service(close_poll)
139            .service(cancel_poll)
140            .service(delete_poll)
141            .service(cast_poll_vote)
142            .service(get_poll_results)
143            .service(get_poll_building_statistics)
144            // Tickets (Maintenance Requests - Issue #85 - Phase 2)
145            .service(create_ticket)
146            .service(get_ticket)
147            .service(list_building_tickets)
148            .service(list_organization_tickets)
149            .service(list_my_tickets)
150            .service(list_assigned_tickets)
151            .service(list_tickets_by_status)
152            .service(delete_ticket)
153            .service(assign_ticket)
154            .service(start_work)
155            .service(resolve_ticket)
156            .service(close_ticket)
157            .service(cancel_ticket)
158            .service(reopen_ticket)
159            .service(get_ticket_statistics)
160            .service(get_overdue_tickets)
161            // Notifications (Multi-Channel System - Issue #86 - Phase 2)
162            .service(create_notification)
163            .service(get_notification)
164            .service(list_my_notifications)
165            .service(list_unread_notifications)
166            .service(mark_notification_read)
167            .service(mark_all_notifications_read)
168            .service(delete_notification)
169            .service(get_notification_stats)
170            // Notification Preferences
171            .service(get_user_preferences)
172            .service(get_preference)
173            .service(update_preference)
174            // Payments (Issue #84 - Phase 2)
175            .service(create_payment)
176            .service(get_payment)
177            .service(get_payment_by_stripe_intent)
178            .service(list_owner_payments)
179            .service(list_building_payments)
180            .service(list_expense_payments)
181            .service(list_organization_payments)
182            .service(list_payments_by_status)
183            .service(list_pending_payments) // Must be before list_failed_payments
184            .service(list_failed_payments)
185            .service(mark_payment_processing)
186            .service(mark_payment_requires_action)
187            .service(mark_payment_succeeded)
188            .service(mark_payment_failed)
189            .service(mark_payment_cancelled)
190            .service(refund_payment)
191            .service(delete_payment)
192            .service(get_owner_payment_stats)
193            .service(get_building_payment_stats)
194            .service(get_expense_total_paid)
195            .service(get_owner_total_paid)
196            .service(get_building_total_paid)
197            // Payment Methods (Issue #84 - Phase 2)
198            .service(create_payment_method)
199            .service(get_payment_method)
200            .service(get_payment_method_by_stripe_id)
201            .service(list_owner_payment_methods)
202            .service(list_active_owner_payment_methods)
203            .service(get_default_payment_method)
204            .service(list_organization_payment_methods)
205            .service(list_payment_methods_by_type)
206            .service(update_payment_method)
207            .service(set_payment_method_as_default)
208            .service(deactivate_payment_method)
209            .service(reactivate_payment_method)
210            .service(delete_payment_method)
211            .service(count_active_payment_methods)
212            .service(has_active_payment_methods)
213            // Quotes (Contractor Quotes Module - Issue #91 - Phase 2)
214            .service(create_quote)
215            .service(get_quote)
216            .service(list_building_quotes)
217            .service(list_contractor_quotes)
218            .service(list_quotes_by_status)
219            .service(submit_quote)
220            .service(start_review)
221            .service(accept_quote)
222            .service(reject_quote)
223            .service(withdraw_quote)
224            .service(compare_quotes)
225            .service(update_contractor_rating)
226            .service(delete_quote)
227            .service(count_building_quotes)
228            .service(count_quotes_by_status)
229            // Local Exchanges (SEL - Local Exchange Trading System - Issue #49 - Phase 2)
230            .service(create_exchange)
231            .service(get_exchange)
232            .service(list_building_exchanges)
233            .service(list_available_exchanges)
234            .service(list_owner_exchanges)
235            .service(list_exchanges_by_type)
236            .service(request_exchange)
237            .service(start_exchange)
238            .service(complete_exchange)
239            .service(cancel_exchange)
240            .service(rate_provider)
241            .service(rate_requester)
242            .service(delete_exchange)
243            .service(get_credit_balance)
244            .service(get_leaderboard)
245            .service(get_sel_statistics)
246            .service(get_owner_summary)
247            // Notices (Community Notice Board - Issue #49 - Phase 2)
248            .service(create_notice)
249            .service(get_notice)
250            .service(list_building_notices)
251            .service(list_published_notices)
252            .service(list_pinned_notices)
253            .service(list_notices_by_type)
254            .service(list_notices_by_category)
255            .service(list_notices_by_status)
256            .service(list_author_notices)
257            .service(update_notice)
258            .service(publish_notice)
259            .service(archive_notice)
260            .service(pin_notice)
261            .service(unpin_notice)
262            .service(set_expiration)
263            .service(delete_notice)
264            .service(get_notice_statistics)
265            // Skills (Skills Directory - Issue #49 - Phase 3)
266            .service(create_skill)
267            .service(get_skill)
268            .service(list_building_skills)
269            .service(list_available_skills)
270            .service(list_free_skills)
271            .service(list_professional_skills)
272            .service(list_skills_by_category)
273            .service(list_skills_by_expertise)
274            .service(list_owner_skills)
275            .service(update_skill)
276            .service(mark_skill_available)
277            .service(mark_skill_unavailable)
278            .service(delete_skill)
279            .service(get_skill_statistics)
280            // Shared Objects (Object Sharing Library - Issue #49 - Phase 4)
281            .service(create_shared_object)
282            .service(get_shared_object)
283            .service(list_building_objects)
284            .service(list_available_objects)
285            .service(list_borrowed_objects)
286            .service(list_overdue_objects)
287            .service(list_free_objects)
288            .service(list_objects_by_category)
289            .service(list_owner_objects)
290            .service(list_my_borrowed_objects)
291            .service(update_shared_object)
292            .service(mark_object_available)
293            .service(mark_object_unavailable)
294            .service(borrow_object)
295            .service(return_object)
296            .service(delete_shared_object)
297            .service(get_object_statistics)
298            // Resource Bookings (Resource Booking Calendar - Issue #49 - Phase 5)
299            .service(create_booking)
300            .service(get_booking)
301            .service(list_building_bookings)
302            .service(list_by_resource_type)
303            .service(list_by_resource)
304            .service(list_my_bookings)
305            .service(list_my_bookings_by_status)
306            .service(list_building_bookings_by_status)
307            .service(list_upcoming_bookings)
308            .service(list_active_bookings)
309            .service(list_past_bookings)
310            .service(update_booking)
311            .service(cancel_booking)
312            .service(complete_booking)
313            .service(mark_no_show)
314            .service(confirm_booking)
315            .service(delete_booking)
316            .service(check_conflicts)
317            .service(get_booking_statistics)
318            // Gamification & Achievements (Issue #49 - Phase 6)
319            // Achievements
320            .service(create_achievement)
321            .service(get_achievement)
322            .service(list_achievements)
323            .service(list_achievements_by_category)
324            .service(list_visible_achievements)
325            .service(update_achievement)
326            .service(delete_achievement)
327            // User Achievements
328            .service(award_achievement)
329            .service(get_user_achievements)
330            .service(get_recent_achievements)
331            // Challenges
332            .service(create_challenge)
333            .service(get_challenge)
334            .service(list_challenges)
335            .service(list_challenges_by_status)
336            .service(list_building_challenges)
337            .service(list_active_challenges)
338            .service(update_challenge)
339            .service(activate_challenge)
340            .service(complete_challenge)
341            .service(cancel_challenge)
342            .service(delete_challenge)
343            // Challenge Progress
344            .service(get_challenge_progress)
345            .service(list_challenge_progress)
346            .service(list_user_active_challenges)
347            .service(increment_progress)
348            // Gamification Stats
349            .service(get_gamification_user_stats)
350            .service(get_gamification_leaderboard)
351            // Board Members
352            .service(elect_board_member)
353            .service(get_my_mandates) // Must be before get_board_member to avoid UUID parsing
354            .service(get_board_dashboard) // Must be before get_board_member to avoid UUID parsing
355            .service(get_board_member)
356            .service(list_active_board_members)
357            .service(list_all_board_members)
358            .service(renew_mandate)
359            .service(remove_board_member)
360            .service(get_board_stats)
361            // Board Decisions
362            .service(create_decision)
363            .service(get_decision)
364            .service(list_decisions_by_building)
365            .service(list_decisions_by_status)
366            .service(list_overdue_decisions)
367            .service(update_decision_status)
368            .service(add_notes)
369            .service(complete_decision)
370            .service(get_decision_stats)
371            // Documents
372            .service(upload_document)
373            .service(list_documents)
374            .service(get_document)
375            .service(download_document)
376            .service(list_documents_by_building)
377            .service(list_documents_by_meeting)
378            .service(list_documents_by_expense)
379            .service(link_document_to_meeting)
380            .service(link_document_to_expense)
381            .service(delete_document)
382            // Energy Buying Groups (Achats Groupés d'Énergie - GDPR compliant)
383            .service(create_campaign)
384            .service(list_campaigns)
385            .service(get_campaign)
386            .service(get_campaign_stats)
387            .service(update_campaign_status)
388            .service(delete_campaign)
389            .service(add_offer)
390            .service(list_offers)
391            .service(select_offer)
392            .service(finalize_campaign)
393            .service(upload_bill)
394            .service(get_my_uploads)
395            .service(get_upload)
396            .service(decrypt_consumption)
397            .service(verify_upload)
398            .service(delete_upload)
399            .service(withdraw_consent)
400            .service(get_campaign_uploads)
401            // États Datés (Belgian legal requirement for property sales)
402            .service(create_etat_date)
403            .service(get_etat_date)
404            .service(get_by_reference_number)
405            .service(list_etats_dates)
406            .service(list_etats_dates_by_unit)
407            .service(list_etats_dates_by_building)
408            .service(mark_in_progress)
409            .service(mark_generated)
410            .service(mark_delivered)
411            .service(update_financial_data)
412            .service(update_additional_data)
413            .service(list_overdue)
414            .service(list_expired)
415            .service(get_stats)
416            .service(delete_etat_date)
417            // Budgets (Annual budget management)
418            .service(create_budget)
419            .service(get_budget)
420            .service(get_budget_by_building_and_fiscal_year)
421            .service(get_active_budget)
422            .service(list_budgets_by_building)
423            .service(list_budgets_by_fiscal_year)
424            .service(list_budgets_by_status)
425            .service(list_budgets)
426            .service(update_budget)
427            .service(submit_budget)
428            .service(approve_budget)
429            .service(reject_budget)
430            .service(archive_budget)
431            .service(get_budget_stats)
432            .service(get_budget_variance)
433            .service(delete_budget)
434            // Accounts (Belgian PCMN)
435            .service(create_account)
436            .service(list_accounts)
437            .service(get_account)
438            .service(get_account_by_code)
439            .service(update_account)
440            .service(delete_account)
441            .service(seed_belgian_pcmn)
442            .service(count_accounts)
443            // PCN (Belgian Chart of Accounts - Legacy)
444            .service(generate_pcn_report)
445            .service(export_pcn_pdf)
446            .service(export_pcn_excel)
447            // Financial Reports (Belgian PCMN)
448            .service(generate_balance_sheet)
449            .service(generate_income_statement)
450            .service(generate_balance_sheet_for_building)
451            .service(generate_income_statement_for_building)
452            // Journal Entries (Manual Accounting Operations - Noalyss-inspired)
453            .service(create_journal_entry)
454            .service(list_journal_entries)
455            .service(get_journal_entry)
456            .service(delete_journal_entry)
457            // Dashboard (Accountant)
458            .service(get_accountant_stats)
459            .service(get_recent_transactions)
460            // Payment Reminders (Issue #83)
461            // IMPORTANT: Specific routes BEFORE parameterized routes to avoid UUID conflicts
462            .service(get_recovery_stats) // Must be before get_reminder (/payment-reminders/stats vs /{id})
463            .service(find_overdue_without_reminders) // Must be before get_reminder
464            .service(bulk_create_reminders) // Must be before get_reminder
465            .service(list_by_organization) // /payment-reminders
466            .service(create_reminder) // POST /payment-reminders
467            .service(get_reminder) // /payment-reminders/{id}
468            .service(delete_reminder) // DELETE /payment-reminders/{id}
469            .service(list_by_expense) // /expenses/{id}/payment-reminders
470            .service(list_by_owner) // /owners/{id}/payment-reminders
471            .service(list_active_by_owner) // /owners/{id}/payment-reminders/active
472            .service(mark_as_sent) // PUT /payment-reminders/{id}/mark-sent
473            .service(mark_as_opened) // PUT /payment-reminders/{id}/mark-opened
474            .service(mark_as_paid) // PUT /payment-reminders/{id}/mark-paid
475            .service(cancel_reminder) // PUT /payment-reminders/{id}/cancel
476            .service(escalate_reminder) // POST /payment-reminders/{id}/escalate
477            .service(add_tracking_number) // PUT /payment-reminders/{id}/tracking-number
478            // Seed (SuperAdmin only) - ONE seed only
479            .service(seed_demo_data)
480            // .service(seed_realistic_data) // Disabled: we only use ONE seed
481            .service(clear_demo_data)
482            // Stats (SuperAdmin only)
483            .service(get_dashboard_stats)
484            .service(get_seed_data_stats)
485            // Stats (Syndic/Accountant)
486            .service(get_syndic_stats)
487            .service(get_syndic_urgent_tasks)
488            // Stats (Owner)
489            .service(get_owner_stats)
490            // Organizations (SuperAdmin only)
491            .service(list_organizations)
492            .service(create_organization)
493            .service(update_organization)
494            .service(activate_organization)
495            .service(suspend_organization)
496            .service(delete_organization)
497            // Users (SuperAdmin only)
498            .service(list_users)
499            .service(create_user)
500            .service(update_user)
501            .service(activate_user)
502            .service(deactivate_user)
503            .service(delete_user)
504            // GDPR (Data Privacy)
505            .service(export_user_data)
506            .service(erase_user_data)
507            .service(can_erase_user)
508            // GDPR Complementary Articles (Issue #90)
509            .service(rectify_user_data) // Article 16: Right to Rectification
510            .service(restrict_user_processing) // Article 18: Right to Restriction
511            .service(set_marketing_preference) // Article 21: Right to Object
512            // GDPR Admin (SuperAdmin only)
513            .service(list_audit_logs)
514            .service(admin_export_user_data)
515            .service(admin_erase_user_data)
516            // Two-Factor Authentication (2FA TOTP - Issue #78)
517            .configure(two_factor_handlers::configure_two_factor_routes)
518            // Work Reports (Digital Maintenance Logbook - Issue #134)
519            .service(create_work_report)
520            .service(get_work_report)
521            .service(list_building_work_reports)
522            .service(list_organization_work_reports)
523            .service(list_work_reports_paginated)
524            .service(update_work_report)
525            .service(delete_work_report)
526            .service(get_active_warranties)
527            .service(get_expiring_warranties)
528            .service(add_photo)
529            .service(add_document)
530            // Technical Inspections (Digital Maintenance Logbook - Issue #134)
531            .service(create_technical_inspection)
532            .service(get_technical_inspection)
533            .service(list_building_technical_inspections)
534            .service(list_organization_technical_inspections)
535            .service(list_technical_inspections_paginated)
536            .service(update_technical_inspection)
537            .service(delete_technical_inspection)
538            .service(get_overdue_inspections)
539            .service(get_upcoming_inspections)
540            .service(get_inspections_by_type)
541            .service(add_report)
542            .service(add_inspection_photo)
543            .service(add_certificate)
544            // IoT Smart Meters (Linky/Ores - Issue #133 - IoT Phase 0)
545            .configure(iot_handlers::configure_iot_routes),
546    );
547}