···125125 |> Ok
126126}
127127128128+/// gets a specific user using the associated email
129129+///
130130+pub fn user_by_email(
131131+ in on: sqlight.Connection,
132132+ email email: String,
133133+) -> Result(Result(user.User, Nil), sqlight.Error) {
134134+ let #(sql, with, expecting) = sql.user_by_email(email:)
135135+136136+ let with = list.map(with, parrot_to_sqlight)
137137+138138+ use user <- result.try(sqlight.query(sql, on:, with:, expecting:))
139139+140140+ case user {
141141+ [] -> Error(Nil)
142142+ [user, ..] -> {
143143+ let assert Ok(id) = uuid.from_bit_array(user.id)
144144+ as "invalid UUID from db UUID column?!"
145145+146146+ user.User(id, user.email)
147147+ |> Ok
148148+ }
149149+ }
150150+ |> Ok
151151+}
152152+128153// updates ----------------------------------------------------------------------
129154130155/// checks if a given `user` has been sent a given `item`
+15
src/eater/sql.gleam
···9393 decode.success(AllUsers(id:, email:))
9494}
95959696+pub type UserByEmail {
9797+ UserByEmail(id: BitArray, email: String)
9898+}
9999+100100+pub fn user_by_email(email email: String) {
101101+ let sql = "SELECT id, email FROM users WHERE users.email = ? LIMIT 1"
102102+ #(sql, [dev.ParamString(email)], user_by_email_decoder())
103103+}
104104+105105+pub fn user_by_email_decoder() -> decode.Decoder(UserByEmail) {
106106+ use id <- decode.field(0, decode.bit_array)
107107+ use email <- decode.field(1, decode.string)
108108+ decode.success(UserByEmail(id:, email:))
109109+}
110110+96111pub type WasUpdateSentToUser {
97112 WasUpdateSentToUser(count: Int)
98113}
+4
src/eater/sql/users.sql
···2525-- name: AllUsers :many
2626SELECT * FROM users;
27272828+-- name: UserByEmail :one
2929+SELECT * FROM users WHERE users.email = ? LIMIT 1;
3030+3131+2832-- name: WasUpdateSentToUser :one
2933SELECT count(*)
3034FROM feed_updates AS updates