···8899## Routes
10101111-| Route | Description | Method |
1212-| ------------------------------ | ----------------------------------------------------------- | ----------- |
1313-| /admin/setup | Create the first admin user | POST (JSON) |
1414-| /admin/signup | Register a new user account | POST (Form) |
1515-| /admin/users | List all registred users | GET |
1616-| /admin/users/{{id}} | Delete an user from the DataBase | DELETE |
1717-| /admin/users/{{id}} | Update the user data as an admin | PUT (JSON) |
1818-| /admin/users/{{id}}/status | Update the status of a user account | PUT (JSON) |
1919-| /admin/teams | Register a new brigade, with a leader and all their members | POST (Form) |
2020-| /admin/teams | Query all registered brigades | GET |
2121-| /admin/teams/{{id}}/status | Update the status of a brigade | PUT (JSON) |
2222-| /admin/teams/{{id}} | Remove a brigade | DELETE |
2323-| /user/login | Login with your user account | POST (Form) |
2424-| /user/profile | Retrieve data about the authenticated user | GET |
2525-| /user/profile | Update your profile | PUT(JSON) |
2626-| /user/roles | Get a list of all available roles | GET |
2727-| /user/{{id}}/occurrences | Find all occurrences applied by this user | GET |
2828-| /user/{{id}}/crew_members | List fellow brigade members of this user | GET |
2929-| /user/notification_preferences | Fetch authenticated user notification preferences | GET |
3030-| /user/notification_preferences | Update authenticated user notification preferences | PUT (JSON) |
3131-| /user/password | Update authenticated user password | PUT (JSON) |
3232-| /brigade/{{id}}/members | List brigade members | GET |
3333-| /occurrence/new | Register new occurrence | POST (Form) |
3434-| /dashboard/stats | Fetch stats for the dashboard page | GET |
1111+| Route | Description | Method |
1212+| ------------------------------ | ----------------------------------------------------------- | ------------- |
1313+| /admin/setup | Create the first admin user | POST (JSON) |
1414+| /admin/signup | Register a new user account | POST (Form) |
1515+| /admin/users | List all registred users | GET |
1616+| /admin/users/{{id}} | Delete an user from the DataBase | DELETE |
1717+| /admin/users/{{id}} | Update the user data as an admin | PUT (JSON) |
1818+| /admin/users/{{id}}/status | Update the status of a user account | PUT (JSON) |
1919+| /admin/teams | Register a new brigade, with a leader and all their members | POST (Form) |
2020+| /admin/teams | Query all registered brigades | GET |
2121+| /admin/teams/{{id}}/status | Update the status of a brigade | PUT (JSON) |
2222+| /admin/teams/{{id}} | Remove a brigade | DELETE |
2323+| /user/login | Login with your user account | POST (Form) |
2424+| /user/profile | Retrieve data about the authenticated user | GET |
2525+| /user/profile | Update your profile | PUT(JSON) |
2626+| /user/roles | Get a list of all available roles | GET |
2727+| /user/{{id}}/occurrences | Find all occurrences applied by this user | GET |
2828+| /user/{{id}}/crew_members | List fellow brigade members of this user | GET |
2929+| /user/notification_preferences | Fetch authenticated user notification preferences | GET |
3030+| /user/notification_preferences | Update authenticated user notification preferences | PUT (JSON) |
3131+| /user/password | Update authenticated user password | PUT (JSON) |
3232+| /brigade/{{id}}/members | List brigade members | GET |
3333+| /dashboard/stats | Fetch stats for the dashboard page | GET |
3434+| /occurrence/new | Register a new occurrence | POST (Form) |
3535+| /occurrence/resolve/{{id}} | Update an occurrence `resolved_at` field | POST / DELETE |
35363637## Entity RelationShip Diagram
3738
+3-3
src/app.gleam
···99//// 1. A PostgreSQL database connection pool using Pog
1010//// 2. An HTTP server using Mist (with Wisp handling the web layer)
11111212-import app/router
1212+import app/http_router
1313import app/routes/admin/sql as admin_sql
1414import app/supervision_tree
1515import app/web
···5858 secret_key_base:,
5959 )
60606161- let wisp_handler = router.handle_request(_, ctx)
6161+ let wisp_handler = http_router.handle_request(_, ctx)
6262 let ws_handler = socket.handle_request(_, ctx)
63636464 // Start all essential processes under a supervision tree
···120120 simulate.browser_request(http.Post, "/admin/setup")
121121 |> simulate.json_body(json.object([#("key", json.string("admin"))]))
122122123123- router.handle_request(setup_admin_req, ctx)
123123+ http_router.handle_request(setup_admin_req, ctx)
124124 io.println(" Administrador cadastrado com sucesso!")
125125 }
126126 }
···11-import app/router
11+import app/http_router
22import app/routes/role
33import app/routes/user/sql as u_sql
44import app_dev/sql as dev_sql
···4040 ]),
4141 )
42424343- let resp = router.handle_request(req, ctx)
4343+ let resp = http_router.handle_request(req, ctx)
4444 assert resp.status == 401
4545 as "Endpoint only accessible for authenticated Admin users"
46464747 let req = app_test.with_authorization(req)
4848- let resp = router.handle_request(req, ctx)
4848+ let resp = http_router.handle_request(req, ctx)
49495050 assert resp.status == 200 as "Response should be HTTP 200 OK"
5151···112112 simulate.request(http.Put, path)
113113 |> simulate.json_body(json.object([#("status", json.bool(target_status))]))
114114115115- let resp = router.handle_request(req, ctx)
115115+ let resp = http_router.handle_request(req, ctx)
116116117117 assert resp.status == 401 as "Only accessible to Admin users"
118118119119 let req = app_test.with_authorization(req)
120120- let resp = router.handle_request(req, ctx)
120120+ let resp = http_router.handle_request(req, ctx)
121121122122 assert resp.status == 200 as "Status should be 200"
123123 let body = simulate.read_body(resp)
+2-2
test/app_test.gleam
···11import app
22-import app/router
22+import app/http_router
33import app/web/context.{type Context, Context}
44import gleam/erlang/process
55import gleam/http
···4444 simulate.browser_request(http.Post, "/user/login")
4545 |> simulate.form_body([#("matricula", "000"), #("senha", "aluno")])
46464747- let login_resp = router.handle_request(login_req, ctx)
4747+ let login_resp = http_router.handle_request(login_req, ctx)
48484949 // Continue the session after being logged in
5050 simulate.session(req, login_req, login_resp)
+5-5
test/brigade_test.gleam
···11-import app/router
11+import app/http_router
22import app/routes/role
33import app_dev/sql as dev_sql
44import app_test
···4040 )
41414242 // REGULAR REQUEST
4343- let resp = router.handle_request(req, ctx)
4343+ let resp = http_router.handle_request(req, ctx)
4444 assert resp.status == 401 as "Endpoint restricted to Admin users"
45454646 // AS ADMIN
4747 let with_auth = app_test.with_authorization(req)
48484949 // AUTHORIZED REQUEST
5050- let resp = router.handle_request(with_auth, ctx)
5050+ let resp = http_router.handle_request(with_auth, ctx)
5151 assert resp.status == 201 as "Response sould be HTTP 201 CREATED"
52525353 // READ BODY -----------------------------------------------------------------
···112112 let path = "/brigade/" <> uuid.to_string(dummy_brigade) <> "/members"
113113 let req = simulate.browser_request(http.Get, path)
114114115115- let resp = router.handle_request(req, ctx)
115115+ let resp = http_router.handle_request(req, ctx)
116116 assert resp.status == 200 as "Response should be HTTP 200 OK"
117117118118 let body = simulate.read_body(resp)
···176176177177 // START ---------------------------------------------------------------------
178178 let req = simulate.browser_request(http.Get, path)
179179- let resp = router.handle_request(req, ctx)
179179+ let resp = http_router.handle_request(req, ctx)
180180181181 assert resp.status == 200 as "Enpoint should be accessible"
182182
+2-2
test/dashboard_test.gleam
···11-import app/router
11+import app/http_router
22import app_test
33import gleam/dynamic/decode
44import gleam/http
···99 let ctx = app_test.global_data()
10101111 let req = simulate.browser_request(http.Get, "/dashboard/stats")
1212- let resp = router.handle_request(req, ctx)
1212+ let resp = http_router.handle_request(req, ctx)
1313 assert resp.status == 200 as "Response status should be 200"
14141515 let body = simulate.read_body(resp)
+6-6
test/occurence_test.gleam
···11-import app/router
11+import app/http_router
22import app/routes/occurrence/category
33import app/routes/occurrence/priority
44import app/routes/occurrence/sql as o_sql
···5858 )
59596060 // RESPONSE ------------------------------------------------------------------
6161- let resp = router.handle_request(req, ctx)
6161+ let resp = http_router.handle_request(req, ctx)
6262 assert resp.status != 422 as "Invalid request Payload"
6363 assert resp.status == 401
6464 as "Endpoint should only accessible to authenticated users"
65656666 let with_auth = app_test.with_authorization(next: req)
6767- let resp = router.handle_request(with_auth, ctx)
6767+ let resp = http_router.handle_request(with_auth, ctx)
6868 assert resp.status == 201 as "Status should be HTTP 201 Created"
69697070 // JSON PARSING --------------------------------------------------------------
···156156 let path = "/user/" <> uuid.to_string(dummy_applicant_id) <> "/occurrences"
157157 let req = simulate.browser_request(http.Get, path)
158158159159- let resp = router.handle_request(req, ctx)
159159+ let resp = http_router.handle_request(req, ctx)
160160 let body = simulate.read_body(resp)
161161 assert resp.status == 200
162162···252252253253 let path = "/occurrence/" <> uuid.to_string(dummy_occurrence)
254254 let req = simulate.request(http.Delete, path)
255255- let resp = router.handle_request(req, ctx)
255255+ let resp = http_router.handle_request(req, ctx)
256256257257 assert resp.status == 401 as "Only accessible to Admins"
258258259259 let with_auth = app_test.with_authorization(req)
260260- let resp = router.handle_request(with_auth, ctx)
260260+ let resp = http_router.handle_request(with_auth, ctx)
261261262262 assert resp.status == 200 as "Status should be HTTP 200 OK"
263263
+2-2
test/role_test.gleam
···11-import app/router
11+import app/http_router
22import app/routes/role
33import app_test
44import gleam/dynamic/decode
···1111 let ctx = app_test.global_data()
12121313 let req = simulate.browser_request(http.Get, "/user/roles")
1414- let resp = router.handle_request(req, ctx)
1414+ let resp = http_router.handle_request(req, ctx)
15151616 assert resp.status == 200 as "Status code should be 200 OK"
1717 let body = simulate.read_body(resp)
+14-14
test/user_test.gleam
···11-import app/router
11+import app/http_router
22import app/routes/role
33import app/routes/user
44import app_dev/sql as dev_sql
···2323 simulate.browser_request(http.Post, "/user/login")
2424 |> simulate.form_body([#("matricula", "000"), #("senha", "aluno")])
25252626- let resp = router.handle_request(req, ctx)
2626+ let resp = http_router.handle_request(req, ctx)
2727 assert resp.status == 200 as "Status should be 200"
28282929 let body = simulate.read_body(resp)
···6868 #("cargo", role.to_string_pt_br(dummy.random_role())),
6969 ])
70707171- let resp = router.handle_request(req, ctx)
7171+ let resp = http_router.handle_request(req, ctx)
7272 assert resp.status == 401 as "Endpoint access should be restricted"
73737474 // AUTH -------------------------------------------------------------------
7575 let with_auth = app_test.with_authorization(next: req)
7676- let resp = router.handle_request(with_auth, ctx)
7676+ let resp = http_router.handle_request(with_auth, ctx)
7777 assert resp.status == 201 as "Response should be 201 Created"
78787979 let body = simulate.read_body(resp)
···107107 ])
108108109109 let with_auth = app_test.with_authorization(next: req)
110110- let resp = router.handle_request(with_auth, ctx)
110110+ let resp = http_router.handle_request(with_auth, ctx)
111111 assert resp.status == 409 as "Registration should be unique"
112112 }
113113···127127 ])
128128129129 let with_auth = app_test.with_authorization(next: req)
130130- let resp = router.handle_request(with_auth, ctx)
130130+ let resp = http_router.handle_request(with_auth, ctx)
131131 assert resp.status == 409 as "Email should be unique"
132132 }
133133···147147 ])
148148149149 let with_auth = app_test.with_authorization(next: req)
150150- let resp = router.handle_request(with_auth, ctx)
150150+ let resp = http_router.handle_request(with_auth, ctx)
151151 assert resp.status == 409 as "Phone should be unique"
152152 }
153153}
···156156 let ctx = app_test.global_data()
157157158158 let req = simulate.browser_request(http.Get, "/admin/users")
159159- let resp = router.handle_request(req, ctx)
159159+ let resp = http_router.handle_request(req, ctx)
160160161161 assert resp.status == 401 as "Access only provided to Admin users"
162162163163 // -------------------------------------------------------
164164 let with_auth = app_test.with_authorization(next: req)
165165- let resp = router.handle_request(with_auth, ctx)
165165+ let resp = http_router.handle_request(with_auth, ctx)
166166 assert resp.status == 200 as "Endpoint access should be available for Admins"
167167168168 let body = simulate.read_body(resp)
···208208 ])
209209210210 let with_auth = app_test.with_authorization(new_user_req)
211211- let new_user_resp = router.handle_request(with_auth, ctx)
211211+ let new_user_resp = http_router.handle_request(with_auth, ctx)
212212213213 let assert Ok(_) =
214214 json.parse(simulate.read_body(new_user_resp), {
···227227 #("matricula", dummy_registration),
228228 #("senha", dummy_password),
229229 ])
230230- let login_resp = router.handle_request(login_req, ctx)
230230+ let login_resp = http_router.handle_request(login_req, ctx)
231231232232 // UPDATING DUMMY ------------------------------------------------------------
233233 let new_name = wisp.random_string(8)
···245245 )
246246 |> simulate.session(login_req, login_resp)
247247248248- let resp = router.handle_request(req, ctx)
248248+ let resp = http_router.handle_request(req, ctx)
249249250250 // ASSERTIONS ----------------------------------------------------------------
251251···281281 )
282282 |> simulate.session(login_req, login_resp)
283283284284- let resp = router.handle_request(req, ctx)
284284+ let resp = http_router.handle_request(req, ctx)
285285 assert resp.status == 409 as "Status should be HTTP 409"
286286 }
287287···298298 ]),
299299 )
300300 |> simulate.session(login_req, login_resp)
301301- let resp = router.handle_request(req, ctx)
301301+ let resp = http_router.handle_request(req, ctx)
302302 assert resp.status == 409 as "Status should be HTTP 409"
303303 }
304304