wip: currently rewriting the project as a full stack application tangled.org/kacaii.dev/sigo
gleam

:recycle: move decoders to the global scope

+26 -26
+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 - Ok(body) -> handle_body(request:, ctx:, body:) 44 43 Error(err) -> web.handle_decode_error(err) 44 + Ok(body) -> handle_body(request:, ctx:, body:) 45 45 } 46 46 } 47 47 ··· 61 61 ) 62 62 } 63 63 64 - /// Registering a new brigade can fail 65 64 type RegisterBrigadeError { 66 65 /// Uuid contain invalid format 67 66 InvalidUuid(String) 68 - /// An error occurred while accessing the Database 67 + /// Failed to access the DataBase 69 68 DataBase(pog.QueryError) 70 69 /// Brigade not found in the Database 71 - BrigadeNotFound 70 + NotFound 72 71 /// Error related to Authentication / Authorization 73 72 AccessControl(user.AccessControlError) 74 73 } 75 74 76 75 fn body_decoder() { 77 - let uuid_decoder = { 78 - use maybe_uuid <- decode.then(decode.string) 79 - case uuid.from_string(maybe_uuid) { 80 - Error(_) -> decode.failure(uuid.v7(), "uuid") 81 - Ok(value) -> decode.success(value) 82 - } 83 - } 84 - 85 - let members_decoder = { 86 - use members <- decode.then(decode.list(of: uuid_decoder)) 87 - decode.success(members) 88 - } 89 - 90 - use leader_id <- decode.field("liderId", uuid_decoder) 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 - use members_id <- decode.field("membros", members_decoder) 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 - case try_register_brigade(request:, ctx:, body:) { 96 + case try_register_brigade(request, ctx, body) { 97 + Error(err) -> handle_error(request, err) 111 98 Ok(body) -> wisp.json_response(body, 201) 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 - |> result.replace_error(BrigadeNotFound), 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 - //  BROADCAST -------------------------------------------------------------- 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 - InvalidUuid(user_id) -> 196 - wisp.bad_request("Usuário possui UUID inválido: " <> user_id) 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 - BrigadeNotFound -> 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 + 191 + // DECODERS ------------------------------------------------------------------- 192 + 193 + fn members_id_decoder() -> decode.Decoder(List(uuid.Uuid)) { 194 + use members <- decode.then(decode.list(of: uuid_decoder())) 195 + decode.success(members) 196 + } 197 + 198 + fn uuid_decoder() { 199 + use maybe_uuid <- decode.then(decode.string) 200 + case uuid.from_string(maybe_uuid) { 201 + Error(_) -> decode.failure(uuid.v7(), "uuid") 202 + Ok(value) -> decode.success(value) 203 + } 204 + }