tangled
alpha
login
or
join now
kacaii.dev
/
senac-brigade-server
0
fork
atom
wip: currently rewriting the project as a full stack application
tangled.org/kacaii.dev/sigo
gleam
0
fork
atom
overview
issues
1
pulls
pipelines
:recycle: move decoders to the global scope
kacaii.dev
3 months ago
3e3e2010
b217dd0d
+26
-26
1 changed file
expand all
collapse all
unified
split
src
app
domain
brigade
register_new_brigade.gleam
+26
-26
src/app/domain/brigade/register_new_brigade.gleam
···
40
40
use body <- wisp.require_json(request)
41
41
42
42
case decode.run(body, body_decoder()) {
43
43
-
Ok(body) -> handle_body(request:, ctx:, body:)
44
43
Error(err) -> web.handle_decode_error(err)
44
44
+
Ok(body) -> handle_body(request:, ctx:, body:)
45
45
}
46
46
}
47
47
···
61
61
)
62
62
}
63
63
64
64
-
/// Registering a new brigade can fail
65
64
type RegisterBrigadeError {
66
65
/// Uuid contain invalid format
67
66
InvalidUuid(String)
68
68
-
/// An error occurred while accessing the Database
67
67
+
/// Failed to access the DataBase
69
68
DataBase(pog.QueryError)
70
69
/// Brigade not found in the Database
71
71
-
BrigadeNotFound
70
70
+
NotFound
72
71
/// Error related to Authentication / Authorization
73
72
AccessControl(user.AccessControlError)
74
73
}
75
74
76
75
fn body_decoder() {
77
77
-
let uuid_decoder = {
78
78
-
use maybe_uuid <- decode.then(decode.string)
79
79
-
case uuid.from_string(maybe_uuid) {
80
80
-
Error(_) -> decode.failure(uuid.v7(), "uuid")
81
81
-
Ok(value) -> decode.success(value)
82
82
-
}
83
83
-
}
84
84
-
85
85
-
let members_decoder = {
86
86
-
use members <- decode.then(decode.list(of: uuid_decoder))
87
87
-
decode.success(members)
88
88
-
}
89
89
-
90
90
-
use leader_id <- decode.field("liderId", uuid_decoder)
76
76
+
use leader_id <- decode.field("liderId", uuid_decoder())
91
77
use name <- decode.field("nome", decode.string)
92
78
use vehicle_code <- decode.field("codigoViatura", decode.string)
93
79
use is_active <- decode.field("ativo", decode.bool)
94
94
-
use members_id <- decode.field("membros", members_decoder)
80
80
+
use members_id <- decode.field("membros", members_id_decoder())
95
81
96
82
decode.success(RequestBody(
97
83
leader_id:,
···
107
93
ctx ctx: Context,
108
94
body body: RequestBody,
109
95
) -> wisp.Response {
110
110
-
case try_register_brigade(request:, ctx:, body:) {
96
96
+
case try_register_brigade(request, ctx, body) {
97
97
+
Error(err) -> handle_error(request, err)
111
98
Ok(body) -> wisp.json_response(body, 201)
112
112
-
Error(err) -> handle_error(request:, err:)
113
99
}
114
100
}
115
101
···
141
127
142
128
use row <- result.try(
143
129
list.first(returned.rows)
144
144
-
|> result.replace_error(BrigadeNotFound),
130
130
+
|> result.replace_error(NotFound),
145
131
)
146
132
147
133
use assigned_members <- result.map(try_assign_members(
···
179
165
row.inserted_user_id
180
166
}
181
167
182
182
-
// BROADCAST --------------------------------------------------------------
168
168
+
// BROADCAST
183
169
let registry = group_registry.get_registry(ctx.registry_name)
184
170
list.each(assigned_members, fn(user_id) {
185
171
let body =
···
192
178
193
179
fn handle_error(request request, err err: RegisterBrigadeError) -> wisp.Response {
194
180
case err {
195
195
-
InvalidUuid(user_id) ->
196
196
-
wisp.bad_request("Usuário possui UUID inválido: " <> user_id)
181
181
+
InvalidUuid(id) -> wisp.bad_request("Usuário possui UUID inválido: " <> id)
197
182
DataBase(err) -> web.handle_database_error(err)
198
183
AccessControl(err) -> user.handle_access_control_error(request, err)
199
199
-
BrigadeNotFound ->
184
184
+
NotFound ->
200
185
"O Banco de Dados não retornou informações sobre a nova equipe após a inserção"
201
186
|> wisp.Text
202
187
|> wisp.set_body(wisp.not_found(), _)
203
188
}
204
189
}
190
190
+
191
191
+
// DECODERS -------------------------------------------------------------------
192
192
+
193
193
+
fn members_id_decoder() -> decode.Decoder(List(uuid.Uuid)) {
194
194
+
use members <- decode.then(decode.list(of: uuid_decoder()))
195
195
+
decode.success(members)
196
196
+
}
197
197
+
198
198
+
fn uuid_decoder() {
199
199
+
use maybe_uuid <- decode.then(decode.string)
200
200
+
case uuid.from_string(maybe_uuid) {
201
201
+
Error(_) -> decode.failure(uuid.v7(), "uuid")
202
202
+
Ok(value) -> decode.success(value)
203
203
+
}
204
204
+
}