wip: currently rewriting the project as a full stack application
tangled.org/kacaii.dev/sigo
gleam
1//// Application router that maps HTTP requests to handler functions.
2////
3//// This module defines the URL routing table for the application's API endpoints.
4//// It uses path-based routing to delegate requests to specific handler modules
5//// for processing.
6////
7//// All requests are processed through the web middleware pipeline before routing.
8//// Unmatched routes return a 404 Not Found response.
9
10import app/domain/admin/admin_update_user
11import app/domain/admin/setup_first_admin
12import app/domain/brigade/delete_brigade
13import app/domain/brigade/get_all_brigades
14import app/domain/brigade/get_brigade_members
15import app/domain/brigade/register_new_brigade
16import app/domain/brigade/update_brigade_status
17import app/domain/dashboard
18import app/domain/data_analysis/analysis_occurrence_volume
19import app/domain/notification/get_notification_preferences
20import app/domain/notification/update_notification_preferences
21import app/domain/occurrence/close_occurrence
22import app/domain/occurrence/delete_occurrence
23import app/domain/occurrence/get_ocurrences_by_applicant
24import app/domain/occurrence/register_new_occurrence
25import app/domain/occurrence/reopen_occurrence
26import app/domain/role/get_role_list
27import app/domain/user/delete_user
28import app/domain/user/get_all_user_profiles
29import app/domain/user/get_crew_members
30import app/domain/user/get_user_profile
31import app/domain/user/login
32import app/domain/user/signup
33import app/domain/user/update_user_password
34import app/domain/user/update_user_profile
35import app/domain/user/update_user_status
36import app/web
37import app/web/context.{type Context}
38import wisp
39
40/// Main request router - matches HTTP methods and paths to appropriate handlers
41/// All routes pass through middleware first for common processing
42pub fn handle_request(
43 request request: wisp.Request,
44 ctx ctx: Context,
45) -> wisp.Response {
46 use request <- web.middleware(request:, context: ctx)
47 case wisp.path_segments(request) {
48 // Security routes -------------------------------------------------
49 ["user", "login"] -> login.handle_request(request:, ctx:)
50
51 ["user", "password"] -> update_user_password.handle_request(request:, ctx:)
52
53 // Admin routes ---------------------------------------------------------
54 ["admin", "setup"] -> setup_first_admin.handle_request(request:, ctx:)
55
56 ["admin", "signup"] -> signup.handle_request(request:, ctx:)
57
58 ["admin", "users"] -> get_all_user_profiles.handle_request(request:, ctx:)
59
60 ["admin", "users", id, "update"] ->
61 admin_update_user.handle_request(request:, ctx:, id:)
62
63 ["admin", "users", id, "delete"] ->
64 delete_user.handle_request(request:, ctx:, id:)
65
66 ["admin", "users", id, "status"] ->
67 update_user_status.handle_request(request:, ctx:, id:)
68
69 ["admin", "brigade"] -> get_all_brigades.handle_request(request:, ctx:)
70
71 ["admin", "brigade", "new"] ->
72 register_new_brigade.handle_request(request:, ctx:)
73
74 ["admin", "brigade", id, "status"] ->
75 update_brigade_status.handle_request(request:, ctx:, id:)
76
77 ["admin", "brigade", id] ->
78 delete_brigade.handle_request(request:, ctx:, id:)
79
80 // Dashboard stats ------------------------------------------------------
81 ["dashboard", "stats"] -> dashboard.handle_request(request:, ctx:)
82
83 // Data analysis routes
84 ["analysis", "occurrence"] ->
85 analysis_occurrence_volume.handle_request(request:, ctx:)
86
87 // User data routes -----------------------------------------------------
88 ["user", id, "occurrences"] ->
89 get_ocurrences_by_applicant.handle_request(request:, ctx:, id:)
90
91 ["user", "profile"] -> get_user_profile.handle_request(request:, ctx:)
92
93 ["user", "profile", "update"] ->
94 update_user_profile.handle_request(request:, ctx:)
95
96 ["user", id, "crew_members"] ->
97 get_crew_members.handle_request(request:, ctx:, id:)
98
99 // Notification routes --------------------------------------------------
100 ["user", "notification_preferences"] ->
101 get_notification_preferences.handle_request(request:, ctx:)
102
103 ["user", "notification_preferences", "update"] ->
104 update_notification_preferences.handle_request(request:, ctx:)
105
106 // Occurrence routes ----------------------------------------------------
107 ["occurrence", "new"] ->
108 register_new_occurrence.handle_request(request:, ctx:)
109
110 ["occurrence", id] -> delete_occurrence.handle_request(request:, ctx:, id:)
111
112 ["occurrence", "close", id] ->
113 close_occurrence.handle_request(request:, ctx:, id:)
114
115 ["occurrence", "reopen", id] ->
116 reopen_occurrence.handle_request(request:, ctx:, id:)
117
118 // Brigade routes -------------------------------------------------------
119 ["brigade", id, "members"] ->
120 get_brigade_members.handle_request(request:, ctx:, id:)
121
122 // Role routes ----------------------------------------------------------
123 ["user", "roles"] -> get_role_list.handle_request(request:, ctx:)
124
125 // Fallback routes ---------------------------------------------------------
126 [] -> wisp.ok() |> wisp.html_body("<h2>🌠</h2>")
127 _ -> wisp.not_found()
128 }
129}