45 lines
1.1 KiB
Elixir
45 lines
1.1 KiB
Elixir
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
|