defmodule Localiser.Domain.Firmware do @moduledoc false def firmware_dir do dir = Application.app_dir(:localiserd, "priv/firmware") File.mkdir_p!(dir) dir end def store(version, %Plug.Upload{path: tmp_path}) do dest = Path.join(firmware_dir(), "#{version}.bin") case File.cp(tmp_path, dest) do :ok -> {:ok, version} {:error, reason} -> {:error, reason} end end def list do dir = firmware_dir() dir |> File.ls!() |> Enum.filter(&String.ends_with?(&1, ".bin")) |> Enum.map(fn filename -> version = String.replace_suffix(filename, ".bin", "") path = Path.join(dir, filename) stat = File.stat!(path, time: :posix) %{version: version, size: stat.size, uploaded_at: stat.mtime} end) |> Enum.sort_by(& &1.uploaded_at, :desc) end def get(version) do path = Path.join(firmware_dir(), "#{version}.bin") if File.exists?(path), do: {:ok, path}, else: :not_found end end