Auto-indexing service and GraphQL API for AT Protocol Records
at main 87 lines 2.3 kB view raw
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}