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