This commit is contained in:
Sam
2026-06-10 11:51:56 -05:00
commit 66ba338b81
57 changed files with 5509 additions and 0 deletions

44
lib/forum/db.ex Normal file
View File

@@ -0,0 +1,44 @@
defmodule Forum.DB do
@moduledoc """
Thin wrappers around `Postgrex.query/3`. No ORM, just SQL.
The `Forum.DB` name was registered when Postgrex started in `Application`.
"""
def query(sql, params \\ []) do
Postgrex.query(__MODULE__, sql, params)
end
def query!(sql, params \\ []) do
Postgrex.query!(__MODULE__, sql, params)
end
def list_messages(opts \\ []) do
limit = Keyword.get(opts, :limit, 50)
%Postgrex.Result{rows: rows, columns: cols} =
query!("SELECT id, text, inserted_at FROM messages ORDER BY id DESC LIMIT $1", [limit])
rows_to_maps(rows, cols)
end
def insert_message(text) when is_binary(text) do
%Postgrex.Result{rows: [row], columns: cols} =
query!(
"INSERT INTO messages (text) VALUES ($1) RETURNING id, text, inserted_at",
[text]
)
[map] = rows_to_maps([row], cols)
map
end
# Postgrex returns rows as lists of values + a separate list of column names.
# Zip them into maps so JSON encoding is straightforward.
defp rows_to_maps(rows, cols) do
Enum.map(rows, fn row ->
cols
|> Enum.zip(row)
|> Map.new()
end)
end
end