From ba448be83f3c0f17cafbdcfcf5df8f5359c6ee38 Mon Sep 17 00:00:00 2001 From: "kacaii.dev" Date: Tue, 16 Jun 2026 12:01:35 -0300 Subject: [PATCH] user: move "role" to the user module --- src/client/user.gleam | 30 ++++++++++++++++++--- src/client/user/role.gleam | 25 ----------------- test/client_test/dummy.gleam | 7 +++-- test/client_test/navigation_test.gleam | 6 ++--- test/client_test/page_test/login_test.gleam | 4 +-- test/client_test/session_test.gleam | 4 +-- 6 files changed, 36 insertions(+), 40 deletions(-) delete mode 100644 src/client/user/role.gleam diff --git a/src/client/user.gleam b/src/client/user.gleam index dd27ad5..989e976 100644 --- a/src/client/user.gleam +++ b/src/client/user.gleam @@ -1,15 +1,21 @@ -import client/user/role import gleam/dynamic/decode import gleam/json pub type User { - User(id: String, role: role.Role, full_name: String, email: String) + User(id: String, role: Role, full_name: String, email: String) +} + +pub type Role { + /// Regular user with default permissions + Default + /// User with elevated access to the system + Admin } pub fn to_json(self: User) -> json.Json { json.object([ #("id", json.string(self.id)), - #("role", role.to_json(self.role)), + #("role", role_to_json(self.role)), #("full_name", json.string(self.full_name)), #("email", json.string(self.email)), ]) @@ -17,9 +23,25 @@ pub fn to_json(self: User) -> json.Json { pub fn decoder() -> decode.Decoder(User) { use id <- decode.field("id", decode.string) - use role <- decode.field("role", role.decoder()) + use role <- decode.field("role", role_decoder()) use full_name <- decode.field("full_name", decode.string) use email <- decode.field("email", decode.string) decode.success(User(id:, role:, full_name:, email:)) } + +fn role_to_json(role: Role) -> json.Json { + case role { + Default -> json.string("default") + Admin -> json.string("admin") + } +} + +fn role_decoder() -> decode.Decoder(Role) { + use variant <- decode.then(decode.string) + case variant { + "default" -> decode.success(Default) + "admin" -> decode.success(Admin) + _ -> decode.failure(Default, "Role") + } +} diff --git a/src/client/user/role.gleam b/src/client/user/role.gleam deleted file mode 100644 index 6c03bd9..0000000 --- a/src/client/user/role.gleam +++ /dev/null @@ -1,25 +0,0 @@ -import gleam/dynamic/decode -import gleam/json - -pub type Role { - /// Regular user with default permissions - Default - /// User with elevated access to the system - Admin -} - -pub fn to_json(role: Role) -> json.Json { - case role { - Default -> json.string("default") - Admin -> json.string("admin") - } -} - -pub fn decoder() -> decode.Decoder(Role) { - use variant <- decode.then(decode.string) - case variant { - "default" -> decode.success(Default) - "admin" -> decode.success(Admin) - _ -> decode.failure(Default, "Role") - } -} diff --git a/test/client_test/dummy.gleam b/test/client_test/dummy.gleam index 5078906..811fc08 100644 --- a/test/client_test/dummy.gleam +++ b/test/client_test/dummy.gleam @@ -5,20 +5,19 @@ import client/route import client/session import client/session/token import client/user.{type User, User} -import client/user/role import gleam/json import lustre/effect.{type Effect} -pub fn user(role: role.Role) -> User { +pub fn user(role: user.Role) -> User { User(id: "000", role:, full_name: "Dummy", email: "dummy@lustre.dev") } ///  Authenticated session used for testing purposes. -pub fn session(role: role.Role) -> session.Session { +pub fn session(role: user.Role) -> session.Session { session.Authenticated(token(role)) } -pub fn token(role: role.Role) -> token.Token { +pub fn token(role: user.Role) -> token.Token { let body = json.object([ #("access_token", json.string("access_token")), diff --git a/test/client_test/navigation_test.gleam b/test/client_test/navigation_test.gleam index 5b4eea3..90fba45 100644 --- a/test/client_test/navigation_test.gleam +++ b/test/client_test/navigation_test.gleam @@ -2,13 +2,13 @@ import client import client/page import client/route import client/session -import client/user/role +import client/user import client_test/dummy import gleam/list import lustre/effect pub fn navigation_test() -> Nil { - let session = dummy.session(role.Default) + let session = dummy.session(user.Default) let route = route.Home let #(model, _) = dummy.model(session:, route:) @@ -39,7 +39,7 @@ pub fn redirect_guest_to_login_test() -> Nil { } pub fn prevent_redundant_login_test() -> Nil { - let session = dummy.session(role.Default) + let session = dummy.session(user.Default) let route = route.Home let #(model, _) = dummy.model(session:, route:) diff --git a/test/client_test/page_test/login_test.gleam b/test/client_test/page_test/login_test.gleam index 246ef72..0d6bb28 100644 --- a/test/client_test/page_test/login_test.gleam +++ b/test/client_test/page_test/login_test.gleam @@ -4,7 +4,7 @@ import client/page import client/page/login import client/route import client/session -import client/user/role +import client/user import client_test import client_test/dummy import lustre/dev/query @@ -59,7 +59,7 @@ pub fn form_submit_test() -> Nil { } pub fn success_step_test() -> Nil { - let want = dummy.token(role.Default) + let want = dummy.token(user.Default) let login_step = Ok(session.Authenticated(want)) diff --git a/test/client_test/session_test.gleam b/test/client_test/session_test.gleam index d0adba9..86d3d1c 100644 --- a/test/client_test/session_test.gleam +++ b/test/client_test/session_test.gleam @@ -1,7 +1,7 @@ import client import client/route import client/session -import client/user/role +import client/user import client_test import client_test/dummy import lustre/dev/simulate @@ -13,7 +13,7 @@ pub fn session_restored_success_test() -> Nil { |> client_test.init |> client_test.simulation - let session = dummy.session(role.Default) + let session = dummy.session(user.Default) let message = client.UserRestoredSession(Ok(session)) let model = -- 2.51.2