70 lines
1.6 KiB
Elixir
70 lines
1.6 KiB
Elixir
defmodule LabelmakerWeb.LabelsController do
|
|
use LabelmakerWeb, :controller
|
|
alias LabelmakerWeb.Constants
|
|
|
|
@label_dir Path.join(:code.priv_dir(:labelmaker), "static/labels")
|
|
|
|
def index(conn, params) do
|
|
page = parse_page(params["page"])
|
|
all_labels = list_labels()
|
|
total_count = length(all_labels)
|
|
total_pages = ceil(total_count / Constants.labels_per_page())
|
|
|
|
# Ensure page is within valid range
|
|
page = max(1, min(page, max(total_pages, 1)))
|
|
|
|
labels = paginate(all_labels, page)
|
|
|
|
render(conn, :index,
|
|
labels: labels,
|
|
page: page,
|
|
total_pages: total_pages,
|
|
total_count: total_count,
|
|
per_page: Constants.labels_per_page()
|
|
)
|
|
end
|
|
|
|
defp parse_page(nil), do: 1
|
|
|
|
defp parse_page(page_str) do
|
|
case Integer.parse(page_str) do
|
|
{page, _} when page > 0 -> page
|
|
_ -> 1
|
|
end
|
|
end
|
|
|
|
defp paginate(labels, page) do
|
|
labels
|
|
|> Enum.drop((page - 1) * Constants.labels_per_page())
|
|
|> Enum.take(Constants.labels_per_page())
|
|
end
|
|
|
|
defp list_labels do
|
|
case File.ls(@label_dir) do
|
|
{:ok, files} ->
|
|
files
|
|
|> Enum.filter(&String.ends_with?(&1, ".png"))
|
|
|> Enum.map(fn filename ->
|
|
filepath = Path.join(@label_dir, filename)
|
|
stat = File.stat!(filepath)
|
|
|
|
%{
|
|
filename: filename,
|
|
filepath: filepath,
|
|
size: stat.size,
|
|
modified: stat.mtime,
|
|
url: "/labels/#{filename}"
|
|
}
|
|
end)
|
|
|> Enum.sort_by(& &1.modified, :desc)
|
|
|
|
{:error, :enoent} ->
|
|
# Directory doesn't exist yet
|
|
[]
|
|
|
|
{:error, _reason} ->
|
|
[]
|
|
end
|
|
end
|
|
end
|