๐Ÿ‘ฉโ€๐Ÿš’ Firefighters API written in Gleam!
lustre gleam

:construction: handle duplicated email and phone fields

kacaii.dev a7d8a600 dd807fac

verified
+42 -8
+5 -5
client/src/client/page/signup.gleam
··· 119 #(Model(..model, loading: True), effect) 120 } 121 122 - ServerSentResponse(Ok(user)) -> { 123 - let text_message = user.full_name <> " registrado(a)" 124 - #(Model(..empty, loading: False, text_message:), effect.none()) 125 - } 126 127 ServerSentResponse(Error(reason)) -> { 128 let text_message = case reason { 129 rsvp.HttpError(resp) -> resp.body 130 rsvp.NetworkError -> "Connection not available" 131 - _ -> "An error occurred" 132 } 133 134 #(Model(..model, loading: False, text_message:), effect.none())
··· 119 #(Model(..model, loading: True), effect) 120 } 121 122 + ServerSentResponse(Ok(_)) -> #( 123 + Model(..empty, loading: False, text_message: ""), 124 + effect.none(), 125 + ) 126 127 ServerSentResponse(Error(reason)) -> { 128 let text_message = case reason { 129 rsvp.HttpError(resp) -> resp.body 130 rsvp.NetworkError -> "Connection not available" 131 + _ -> "Failed to register user" 132 } 133 134 #(Model(..model, loading: False, text_message:), effect.none())
+37 -3
server/src/server/user.gleam
··· 12 pub type UserError { 13 Database(pog.QueryError) 14 NotFound 15 } 16 17 /// Query an user by Uuid ··· 48 let role_enum = role_to_enum(role) 49 50 use returned <- result.try( 51 - sql.register(ctx.db, full_name, role_enum, hashed, email, phone, is_active) 52 - |> result.map_error(Database), 53 ) 54 55 use row <- result.map( ··· 68 69 pub fn handle_error(err: UserError) -> wisp.Response { 70 case err { 71 Database(_) -> wisp.internal_server_error() 72 NotFound -> 73 - "User not found" 74 |> wisp.Text 75 |> wisp.set_body(wisp.response(404), _) 76 } 77 } 78
··· 12 pub type UserError { 13 Database(pog.QueryError) 14 NotFound 15 + PhoneAlreadytaken 16 + EmailAlreadyTaken 17 } 18 19 /// Query an user by Uuid ··· 50 let role_enum = role_to_enum(role) 51 52 use returned <- result.try( 53 + case 54 + sql.register( 55 + ctx.db, 56 + full_name, 57 + role_enum, 58 + hashed, 59 + email, 60 + phone, 61 + is_active, 62 + ) 63 + { 64 + Error(pog.ConstraintViolated(constraint: "user_account_phone_key", ..)) -> 65 + Error(PhoneAlreadytaken) 66 + 67 + Error(pog.ConstraintViolated(constraint: "user_account_email_key", ..)) -> 68 + Error(EmailAlreadyTaken) 69 + 70 + Ok(value) -> Ok(value) 71 + Error(err) -> Error(Database(err)) 72 + }, 73 ) 74 75 use row <- result.map( ··· 88 89 pub fn handle_error(err: UserError) -> wisp.Response { 90 case err { 91 + Database(pog.QueryTimeout) | Database(pog.ConnectionUnavailable) -> 92 + wisp.response(403) 93 + 94 Database(_) -> wisp.internal_server_error() 95 + 96 NotFound -> 97 + "User not found in the system" 98 |> wisp.Text 99 |> wisp.set_body(wisp.response(404), _) 100 + 101 + PhoneAlreadytaken -> 102 + "Phone number is already taken" 103 + |> wisp.Text 104 + |> wisp.set_body(wisp.response(409), _) 105 + 106 + EmailAlreadyTaken -> 107 + "Email is already taken" 108 + |> wisp.Text 109 + |> wisp.set_body(wisp.response(409), _) 110 } 111 } 112