forked from
slices.network/quickslice
Auto-indexing service and GraphQL API for AT Protocol Records
1/// Admin session repository operations
2import database/executor.{type DbError, type Executor, Text}
3import gleam/dynamic/decode
4import gleam/list
5import gleam/option.{type Option, None, Some}
6import gleam/result
7
8/// Admin session record
9pub type AdminSession {
10 AdminSession(session_id: String, atp_session_id: String, created_at: Int)
11}
12
13/// Create a new admin session
14pub fn insert(
15 exec: Executor,
16 session_id: String,
17 atp_session_id: String,
18) -> Result(Nil, DbError) {
19 let sql = case executor.dialect(exec) {
20 executor.SQLite ->
21 "INSERT INTO admin_session (session_id, atp_session_id) VALUES (?, ?)"
22 executor.PostgreSQL ->
23 "INSERT INTO admin_session (session_id, atp_session_id) VALUES ($1, $2)"
24 }
25
26 use _ <- result.try(executor.query(
27 exec,
28 sql,
29 [Text(session_id), Text(atp_session_id)],
30 decode.dynamic,
31 ))
32 Ok(Nil)
33}
34
35/// Get admin session by session_id (cookie ID)
36pub fn get(
37 exec: Executor,
38 session_id: String,
39) -> Result(Option(AdminSession), DbError) {
40 let sql = case executor.dialect(exec) {
41 executor.SQLite ->
42 "SELECT session_id, atp_session_id, created_at FROM admin_session WHERE session_id = ?"
43 executor.PostgreSQL ->
44 "SELECT session_id, atp_session_id, created_at FROM admin_session WHERE session_id = $1"
45 }
46
47 use rows <- result.try(executor.query(
48 exec,
49 sql,
50 [Text(session_id)],
51 decoder(),
52 ))
53
54 case list.first(rows) {
55 Ok(session) -> Ok(Some(session))
56 Error(_) -> Ok(None)
57 }
58}
59
60/// Delete admin session (logout)
61pub fn delete(exec: Executor, session_id: String) -> Result(Nil, DbError) {
62 let sql = case executor.dialect(exec) {
63 executor.SQLite -> "DELETE FROM admin_session WHERE session_id = ?"
64 executor.PostgreSQL -> "DELETE FROM admin_session WHERE session_id = $1"
65 }
66
67 use _ <- result.try(executor.query(
68 exec,
69 sql,
70 [Text(session_id)],
71 decode.dynamic,
72 ))
73 Ok(Nil)
74}
75
76/// Decode admin session from database row
77fn decoder() -> decode.Decoder(AdminSession) {
78 use session_id <- decode.field(0, decode.string)
79 use atp_session_id <- decode.field(1, decode.string)
80 use created_at <- decode.field(2, decode.int)
81
82 decode.success(AdminSession(
83 session_id: session_id,
84 atp_session_id: atp_session_id,
85 created_at: created_at,
86 ))
87}