From e53c76dd5a869efef2266cd4d68b41c813e6a302 Mon Sep 17 00:00:00 2001 From: Larissa Sardinha <78085627+larisard@users.noreply.github.com> Date: Tue, 15 Feb 2022 23:56:19 -0300 Subject: [PATCH] feature/campi controller (#29) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: add delete function to db context * fix: API keys seeds module name * feat: Campus Controller - Criaçao da rota - Criaçao do controller - Criaçao da documentaçao --- config/dev.exs | 2 +- lib/fuschia/db.ex | 3 + .../controllers/campus_controller.ex | 68 +++++++++++++++++++ lib/fuschia_web/router.ex | 4 +- lib/fuschia_web/swagger/schemas/campi.ex | 59 ++++++++++++++++ lib/seeds/dev/api_keys_seeds.ex | 2 +- 6 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 lib/fuschia_web/controllers/campus_controller.ex create mode 100644 lib/fuschia_web/swagger/schemas/campi.ex diff --git a/config/dev.exs b/config/dev.exs index ae398e98..bf2b7eaf 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -4,7 +4,7 @@ import Config config :fuschia, Fuschia.Repo, username: "pescarte", password: "pescarte", - database: "pescarte", + database: "fuschia_dev", hostname: "db", show_sensitive_data_on_connection_error: true, pool_size: 10 diff --git a/lib/fuschia/db.ex b/lib/fuschia/db.ex index 5c69a4e3..80ee1f6e 100644 --- a/lib/fuschia/db.ex +++ b/lib/fuschia/db.ex @@ -80,6 +80,9 @@ defmodule Fuschia.Db do |> Repo.update() end + @spec delete(struct | changeset, keyword) :: {:ok, struct} | {:error, changeset} + defdelegate delete(struct, opts \\ []), to: Repo, as: :delete + @spec preload_all(query, relationships) :: query def preload_all(%Ecto.Query{} = query, args) do require Ecto.Query diff --git a/lib/fuschia_web/controllers/campus_controller.ex b/lib/fuschia_web/controllers/campus_controller.ex new file mode 100644 index 00000000..2b125b02 --- /dev/null +++ b/lib/fuschia_web/controllers/campus_controller.ex @@ -0,0 +1,68 @@ +defmodule FuschiaWeb.CampusController do + @moduledoc false + + use FuschiaWeb, :controller + use OpenApiSpex.ControllerSpecs + + alias Fuschia.Db + alias Fuschia.Entities.Campus + alias Fuschia.Queries.Campi + alias FuschiaWeb.Swagger.{CampusSchemas, Response, Security} + alias OpenApiSpex.Schema + + action_fallback FuschiaWeb.FallbackController + + tags(["campi"]) + security(Security.private()) + + operation(:create, + request_body: + {"Atributos de criação", "application/json", CampusSchemas.CreateRequest, required: true}, + responses: + [created: {"Resposta de sucesso", "application/json", CampusSchemas.Campus}] ++ + Response.errors(:unauthorized) + ) + + @spec create(Plug.Conn.t(), map) :: Plug.Conn.t() + def create(conn, %{"campus" => campus_attr}) do + with {:ok, campus} <- Db.create(Campus, campus_attr) do + render_response(campus, conn, :created) + end + end + + operation(:index, + responses: + [ok: {"Resposta de sucesso", "application/json", CampusSchemas.AllCampiResponse}] ++ + Response.errors(:unauthorized) + ) + + @spec index(Plug.Conn.t(), map) :: Plug.Conn.t() + def index(conn, _params) do + Campi.query() + |> Db.list() + |> render_response(conn) + end + + operation(:delete, + parameters: [ + id: [ + in: :path, + type: %Schema{type: :string, minimum: 1}, + description: "ID do Campus", + example: "1111111", + required: true + ] + ], + responses: + [ok: {"Resposta de sucesso", "application/json", CampusSchemas.Campus}] ++ + Response.errors(:unauthorized) + ) + + @spec delete(Plug.Conn.t(), map) :: Plug.Conn.t() + def delete(conn, %{"campus_id" => campus_id}) do + with %Campus{} = campus <- Db.get(Campi.query(), campus_id), + {:ok, _campus} <- Db.delete(campus) do + render_response(campus, conn) + end + end +end diff --git a/lib/fuschia_web/router.ex b/lib/fuschia_web/router.ex index b5d43b65..c59ae0d8 100644 --- a/lib/fuschia_web/router.ex +++ b/lib/fuschia_web/router.ex @@ -41,6 +41,8 @@ defmodule FuschiaWeb.Router do end scope "/api", FuschiaWeb do - pipe_through [:api, :auth] + pipe_through [:auth, :api] + + resources "/campi", CampusController, only: [:create, :index, :delete] end end diff --git a/lib/fuschia_web/swagger/schemas/campi.ex b/lib/fuschia_web/swagger/schemas/campi.ex new file mode 100644 index 00000000..16670e4a --- /dev/null +++ b/lib/fuschia_web/swagger/schemas/campi.ex @@ -0,0 +1,59 @@ +defmodule FuschiaWeb.Swagger.CampusSchemas do + @moduledoc false + + require OpenApiSpex + + alias OpenApiSpex.Schema + + defmodule CreateRequest do + @moduledoc false + + OpenApiSpex.schema(%{ + description: "Criação do Campus", + type: :object, + properties: %{ + nome: %Schema{type: :string, description: "Campus name", required: true} + }, + example: %{ + "nome" => "Campos dos Goytacazes" + } + }) + end + + defmodule AllCampiResponse do + @moduledoc false + + OpenApiSpex.schema(%{ + description: "Listagem de Campi", + type: :object, + properties: %{ + data: %Schema{description: "Campi", type: :array, items: Campus} + }, + example: %{ + "data" => [ + %{ + "nome" => "Campos dos Goytacazes", + "id_externo" => "1111111" + } + ] + } + }) + end + + defmodule Campus do + @moduledoc false + + OpenApiSpex.schema(%{ + description: "Campus info", + type: :object, + properties: %{ + nome: %Schema{type: :string, description: "Campus name"}, + id_externo: %Schema{type: :string, description: "Campus id"} + }, + example: %{ + "nome" => "Campos dos Goytacazes", + "id_externo" => "1111111" + } + }) + end +end diff --git a/lib/seeds/dev/api_keys_seeds.ex b/lib/seeds/dev/api_keys_seeds.ex index c905ec90..f36ed858 100644 --- a/lib/seeds/dev/api_keys_seeds.ex +++ b/lib/seeds/dev/api_keys_seeds.ex @@ -1,4 +1,4 @@ -defmodule Fuschia.ApiKeyDevSeeds do +defmodule Fuschia.ApiKeysDevSeeds do @moduledoc false alias Fuschia.Entities.ApiKey