diff --git a/client/src/client/page/signup.gleam b/client/src/client/page/signup.gleam index 9bcbf9c..3c8d239 100644 --- a/client/src/client/page/signup.gleam +++ b/client/src/client/page/signup.gleam @@ -12,7 +12,6 @@ import rsvp import shared/contract/signup as contract import shared/role import shared/session -import shared/user import shared/user/email pub const empty = Model( @@ -98,7 +97,7 @@ pub type Msg { // Auth related messages UserClickedSubmit - ApiReturnedUser(Result(user.User, rsvp.Error)) + ApiReturnedResponse(Result(contract.ResponseBody, rsvp.Error)) } pub fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { @@ -249,19 +248,19 @@ pub fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { |> contract.request_to_json() let effect = - rsvp.expect_json(user.decoder(), ApiReturnedUser) + rsvp.expect_json(contract.response_decoder(), ApiReturnedResponse) |> rsvp.post(contract.url, body, _) let new = Model(..model, loading: True) #(new, effect) } - ApiReturnedUser(Ok(_created)) -> #( + ApiReturnedResponse(Ok(_created)) -> #( Model(..empty, loading: False), effect.none(), ) - ApiReturnedUser(Error(_)) -> #( + ApiReturnedResponse(Error(_)) -> #( Model(..empty, loading: False), effect.none(), ) diff --git a/shared/src/shared/contract/login.gleam b/shared/src/shared/contract/login.gleam index 359773c..a6f19ac 100644 --- a/shared/src/shared/contract/login.gleam +++ b/shared/src/shared/contract/login.gleam @@ -13,7 +13,9 @@ pub type RequestBody { pub fn request_decoder() -> decode.Decoder(RequestBody) { use email <- decode.field("email", decode.string) use password <- decode.field("password", decode.string) - decode.success(RequestBody(email:, password:)) + + let body = RequestBody(email:, password:) + decode.success(body) } pub fn request_to_json(request_body: RequestBody) -> json.Json { diff --git a/shared/src/shared/contract/register_crew.gleam b/shared/src/shared/contract/register_crew.gleam index 2f242e5..d99a53e 100644 --- a/shared/src/shared/contract/register_crew.gleam +++ b/shared/src/shared/contract/register_crew.gleam @@ -22,8 +22,8 @@ pub fn request_decoder() -> decode.Decoder(RequestBody) { use crew_name <- decode.field("crew_name", decode.string) use members <- decode.field("crew_members", decode.list(user.decoder())) - RequestBody(leader_id:, crew_name:, members:) - |> decode.success + let body = RequestBody(leader_id:, crew_name:, members:) + decode.success(body) } pub fn request_to_json(request_body: RequestBody) -> json.Json { @@ -46,7 +46,8 @@ pub fn response_decoder() -> decode.Decoder(ResponseBody) { use crew <- decode.field("crew", crew.decoder()) use assigned <- decode.field("assigned", decode.list(user.decoder())) - decode.success(ResponseBody(crew:, assigned:)) + let body = ResponseBody(crew:, assigned:) + decode.success(body) } pub fn response_to_json(body: ResponseBody) -> json.Json { diff --git a/shared/src/shared/contract/signup.gleam b/shared/src/shared/contract/signup.gleam index 8f916ab..6f01772 100644 --- a/shared/src/shared/contract/signup.gleam +++ b/shared/src/shared/contract/signup.gleam @@ -1,6 +1,7 @@ import gleam/dynamic/decode import gleam/json import shared/role +import shared/user import shared/user/email pub const url = "/api/signup" @@ -34,6 +35,19 @@ pub fn request_decoder() -> decode.Decoder(RequestBody) { use password <- decode.field("password", decode.string) use email <- decode.field("email", email.decoder()) - RequestBody(name:, role:, email:, phone:, password:) - |> decode.success + let body = RequestBody(name:, role:, email:, phone:, password:) + decode.success(body) +} + +// RESPONSE -------------------------------------------------------------------- + +pub type ResponseBody = + user.User + +pub fn response_decoder() { + user.decoder() +} + +pub fn response_to_json(body: ResponseBody) { + user.to_json(body) } diff --git a/shared/src/shared/helper.gleam b/shared/src/shared/helper.gleam index f2727cd..537822c 100644 --- a/shared/src/shared/helper.gleam +++ b/shared/src/shared/helper.gleam @@ -2,7 +2,7 @@ import gleam/dynamic/decode import gleam/json import youid/uuid -pub fn uuid_decoder(expected: String) -> decode.Decoder(uuid.Uuid) { +pub fn uuid_decoder(expected expected: String) -> decode.Decoder(uuid.Uuid) { use value <- decode.then(decode.string) case uuid.from_string(value) { Ok(value) -> decode.success(value) diff --git a/shared/src/shared/user.gleam b/shared/src/shared/user.gleam index 77a7701..03fc516 100644 --- a/shared/src/shared/user.gleam +++ b/shared/src/shared/user.gleam @@ -1,5 +1,6 @@ import gleam/dynamic/decode import gleam/json +import shared/helper import shared/role import shared/user/email import youid/uuid @@ -17,7 +18,7 @@ pub type User { pub fn to_json(user: User) -> json.Json { json.object([ - #("uuid", uuid_to_json(user.id)), + #("uuid", helper.uuid_to_json(user.id)), #("role", role.to_json(user.role)), #("full_name", json.string(user.full_name)), #("email", json.string(user.email)), @@ -27,27 +28,13 @@ pub fn to_json(user: User) -> json.Json { } pub fn decoder() -> decode.Decoder(User) { - use id <- decode.field("uuid", uuid_decoder()) + use id <- decode.field("uuid", helper.uuid_decoder("user_uuid")) use role <- decode.field("role", role.decoder()) use full_name <- decode.field("full_name", decode.string) use email <- decode.field("email", email.decoder()) use phone <- decode.field("phone", decode.string) use is_active <- decode.field("is_active", decode.bool) - User(id:, role:, full_name:, email:, phone:, is_active:) - |> decode.success -} - -// helpers - -fn uuid_decoder() -> decode.Decoder(uuid.Uuid) { - use value <- decode.then(decode.string) - case uuid.from_string(value) { - Ok(value) -> decode.success(value) - Error(_) -> decode.failure(uuid.v7(), "user_uuid") - } -} - -fn uuid_to_json(uuid: uuid.Uuid) { - uuid.to_string(uuid) |> json.string() + let user = User(id:, role:, full_name:, email:, phone:, is_active:) + decode.success(user) }