zoeys.computer/lib/zoeyscomputer_web/controllers/gist_controller.ex
2024-10-26 23:30:25 -04:00

72 lines
1.8 KiB
Elixir

defmodule ZoeyscomputerWeb.GistController do
use ZoeyscomputerWeb, :controller
alias Zoeyscomputer.Gists
alias Zoeyscomputer.Gists.Gist
action_fallback ZoeyscomputerWeb.FallbackController
def index(conn, _params) do
gists = Gists.list_gists()
IO.inspect(gists)
render(conn, :index, gists: gists)
end
def create(conn, params) do
gist_params = decode_params(params)
with {:ok, %Gist{} = gist} <- Gists.create_gist(conn.assigns.current_user, gist_params) do
conn
|> put_status(:created)
|> put_resp_header("location", ~p"/api/gists/#{gist}")
|> render(:show, gist: gist)
end
end
# Private function to handle param decoding
defp decode_params(params) when is_map(params) do
cond do
# Handle regular JSON params
Map.has_key?(params, "title") and
Map.has_key?(params, "desc") and
Map.has_key?(params, "code") and
Map.has_key?(params, "language") ->
params
# Handle params wrapped in "gist" key
Map.has_key?(params, "gist") ->
params["gist"]
# Handle string JSON that needs parsing
Enum.any?(params, fn {k, _v} -> String.starts_with?(k, "{") end) ->
params
|> Map.keys()
|> List.first()
|> Jason.decode!()
true ->
params
end
end
def show(conn, %{"id" => id}) do
gist = Gists.get_gist!(id)
render(conn, :show, gist: gist)
end
def update(conn, %{"id" => id, "gist" => gist_params}) do
gist = Gists.get_gist!(id)
with {:ok, %Gist{} = gist} <- Gists.update_gist(gist, gist_params) do
render(conn, :show, gist: gist)
end
end
def delete(conn, %{"id" => id}) do
gist = Gists.get_gist!(id)
with {:ok, %Gist{}} <- Gists.delete_gist(gist) do
send_resp(conn, :no_content, "")
end
end
end