mirror of
https://github.com/outbackdingo/firezone.git
synced 2026-01-27 10:18:54 +00:00
(External contribution) Hi, first thanks to @bmanifold for his awesome work! I've not yet tested the API but here is a first PR fixing various small mistakes in the generated openapi spec: Schema names cannot contain spaces Add missing path parameters in the spec Remove duplicated endpoint for creating an identity (not sure about that, I'll let you check) If you want to validate the generated spec you can paste it here: https://editor.swagger.io/ (or at the bottow of your swagger ui) Please review commit by commit Co-authored-by: Jamil <jamilbk@users.noreply.github.com> Co-authored-by: Antoine Labarussias <antoinelabarussias@gmail.com>
131 lines
3.6 KiB
Elixir
131 lines
3.6 KiB
Elixir
defmodule API.ResourceController do
|
|
use API, :controller
|
|
use OpenApiSpex.ControllerSpecs
|
|
alias API.Pagination
|
|
alias Domain.Resources
|
|
|
|
action_fallback API.FallbackController
|
|
|
|
tags ["Resources"]
|
|
|
|
operation :index,
|
|
summary: "List Resources",
|
|
parameters: [
|
|
limit: [in: :query, description: "Limit Resources returned", type: :integer, example: 10],
|
|
page_cursor: [in: :query, description: "Next/Prev page cursor", type: :string]
|
|
],
|
|
responses: [
|
|
ok: {"Resource Response", "application/json", API.Schemas.Resource.ListResponse}
|
|
]
|
|
|
|
def index(conn, params) do
|
|
list_opts = Pagination.params_to_list_opts(params)
|
|
|
|
with {:ok, resources, metadata} <-
|
|
Resources.list_resources(conn.assigns.subject, list_opts) do
|
|
render(conn, :index, resources: resources, metadata: metadata)
|
|
end
|
|
end
|
|
|
|
operation :show,
|
|
summary: "Show Resource",
|
|
parameters: [
|
|
id: [
|
|
in: :path,
|
|
description: "Resource ID",
|
|
type: :string,
|
|
example: "00000000-0000-0000-0000-000000000000"
|
|
]
|
|
],
|
|
responses: [
|
|
ok: {"Resource Response", "application/json", API.Schemas.Resource.Response}
|
|
]
|
|
|
|
def show(conn, %{"id" => id}) do
|
|
with {:ok, resource} <- Resources.fetch_resource_by_id(id, conn.assigns.subject) do
|
|
render(conn, :show, resource: resource)
|
|
end
|
|
end
|
|
|
|
operation :create,
|
|
summary: "Create Resource",
|
|
parameters: [],
|
|
request_body:
|
|
{"Resource Attributes", "application/json", API.Schemas.Resource.Request, required: true},
|
|
responses: [
|
|
ok: {"Resource Response", "application/json", API.Schemas.Resource.Response}
|
|
]
|
|
|
|
def create(conn, %{"resource" => params}) do
|
|
attrs = set_param_defaults(params)
|
|
|
|
with {:ok, resource} <- Resources.create_resource(attrs, conn.assigns.subject) do
|
|
conn
|
|
|> put_status(:created)
|
|
|> put_resp_header("location", ~p"/resources/#{resource}")
|
|
|> render(:show, resource: resource)
|
|
end
|
|
end
|
|
|
|
def create(_conn, _params) do
|
|
{:error, :bad_request}
|
|
end
|
|
|
|
operation :update,
|
|
summary: "Update Resource",
|
|
parameters: [
|
|
id: [
|
|
in: :path,
|
|
description: "Resource ID",
|
|
type: :string,
|
|
example: "00000000-0000-0000-0000-000000000000"
|
|
]
|
|
],
|
|
request_body:
|
|
{"Resource Attributes", "application/json", API.Schemas.Resource.Request, required: true},
|
|
responses: [
|
|
ok: {"Resource Response", "application/json", API.Schemas.Resource.Response}
|
|
]
|
|
|
|
def update(conn, %{"id" => id, "resource" => params}) do
|
|
subject = conn.assigns.subject
|
|
attrs = set_param_defaults(params)
|
|
|
|
with {:ok, resource} <- Resources.fetch_resource_by_id(id, subject),
|
|
{:ok, resource} <- Resources.update_resource(resource, attrs, subject) do
|
|
render(conn, :show, resource: resource)
|
|
end
|
|
end
|
|
|
|
def update(_conn, _params) do
|
|
{:error, :bad_request}
|
|
end
|
|
|
|
operation :delete,
|
|
summary: "Delete Resource",
|
|
parameters: [
|
|
id: [
|
|
in: :path,
|
|
description: "Resource ID",
|
|
type: :string,
|
|
example: "00000000-0000-0000-0000-000000000000"
|
|
]
|
|
],
|
|
responses: [
|
|
ok: {"Resource Response", "application/json", API.Schemas.Resource.Response}
|
|
]
|
|
|
|
def delete(conn, %{"id" => id}) do
|
|
subject = conn.assigns.subject
|
|
|
|
with {:ok, resource} <- Resources.fetch_resource_by_id(id, subject),
|
|
{:ok, resource} <- Resources.delete_resource(resource, subject) do
|
|
render(conn, :show, resource: resource)
|
|
end
|
|
end
|
|
|
|
defp set_param_defaults(params) do
|
|
Map.put_new(params, "filters", %{})
|
|
end
|
|
end
|