lib/bbox_web/router.ex

defmodule BboxWeb.Router do
  import Plug.Conn
  use Plug.Router
  use Plug.Debugger
  require Logger

  alias Bbox.Votes
  alias Bbox.Candidates
  alias Bbox.Candidates.Candidate

  plug(Plug.Logger, log: :debug)
  plug(Plug.Static, from: "public/views", at: "/")
  plug(:match)
  plug(:dispatch)
  plug(Plug.Parsers, parsers: [:urlencoded, :json], json_decoder: Jason)

  post "/api/votes" do
    {:ok, body, conn} = read_body(conn)

    %{"candidate_code" => candidate_code} = Jason.decode!(body)
    [private_key] = get_req_header(conn, "x-voter-private-key")

    IO.inspect(private_key)

    with %Candidate{} = candidate <- Candidates.get_by_code!(candidate_code) do
      {:ok, vote} = Votes.insert(private_key, candidate)
      vote = Jason.encode!(vote)

      conn
      |> put_resp_header("content-type", "application/json")
      |> send_resp(:created, vote)
    end
  end

  get "/api/votes" do
    votes = Votes.list!()
    votes = Jason.encode!(votes)

    conn
    |> put_resp_header("content-type", "application/json")
    |> send_resp(:ok, votes)
  end

  get "/api/candidates" do
    candidates = Candidates.list!()
    candidates = Jason.encode!(candidates)

    conn
    |> put_resp_header("content-type", "application/json")
    |> send_resp(:created, candidates)
  end

  get "/api/candidates/:code" do
    candidate = Candidates.get_by_code!(code)
    candidate = Jason.encode!(candidate)

    conn
    |> put_resp_header("content-type", "application/json")
    |> send_resp(:created, candidate)
  end

  match _ do
    send_resp(conn, :not_found, "Not found")
  end
end