From 16d233dd98a70093aaf5b96126ff975fc2fe0178 Mon Sep 17 00:00:00 2001 From: Marcos Dias <57465032+SoraAsc@users.noreply.github.com> Date: Wed, 14 Aug 2024 20:40:06 +0000 Subject: [PATCH 1/9] feat: created blog_tag table migration --- .../migrations/20240814202453_create_blog_tag.exs | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 priv/repo/migrations/20240814202453_create_blog_tag.exs diff --git a/priv/repo/migrations/20240814202453_create_blog_tag.exs b/priv/repo/migrations/20240814202453_create_blog_tag.exs new file mode 100644 index 00000000..a0d86b0d --- /dev/null +++ b/priv/repo/migrations/20240814202453_create_blog_tag.exs @@ -0,0 +1,13 @@ +defmodule Pescarte.Database.Repo.Migrations.CreateBlogTag do + use Ecto.Migration + + def change do + create table(:blog_tag, primary_key: false) do + add :id, :string, primary_key: true + add :nome, :string, null: false + + timestamps() + end + create unique_index(:blog_tag, [:nome]) + end +end From f64dffe07b729ff45ec0a224449d359d4e9edb7b Mon Sep 17 00:00:00 2001 From: Marcos Dias <57465032+SoraAsc@users.noreply.github.com> Date: Wed, 14 Aug 2024 21:34:46 +0000 Subject: [PATCH 2/9] feat: created blog_tag model --- lib/pescarte/blog/models/tag.ex | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 lib/pescarte/blog/models/tag.ex diff --git a/lib/pescarte/blog/models/tag.ex b/lib/pescarte/blog/models/tag.ex new file mode 100644 index 00000000..aa20d276 --- /dev/null +++ b/lib/pescarte/blog/models/tag.ex @@ -0,0 +1,24 @@ +defmodule Pescarte.Blog.Models.Tag do + use Pescarte, :model + + alias Pescarte.Database.Types.PublicId + + @type t :: %Tag{nome: binary, id: binary} + + @required_fields ~w(nome)a + + @primary_key {:id, PublicId, autogenerate: true} + schema "blog_tag" do + field :nome, :string + + timestamps() + end + + @spec changeset(Tag.t(), map) :: changeset + def changeset(%Tag{} = tag, attrs) do + tag + |> cast(attrs, @required_fields) + |> validate_required(@required_fields) + |> unique_constraint(:nome) + end +end From cd43adac644e244e6c7302970984216839a77dd8 Mon Sep 17 00:00:00 2001 From: Marcos Dias <57465032+SoraAsc@users.noreply.github.com> Date: Thu, 15 Aug 2024 03:00:37 +0000 Subject: [PATCH 3/9] feat: tag crud --- lib/pescarte/blog/blog_tag.ex | 53 +++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 lib/pescarte/blog/blog_tag.ex diff --git a/lib/pescarte/blog/blog_tag.ex b/lib/pescarte/blog/blog_tag.ex new file mode 100644 index 00000000..0b1a7f17 --- /dev/null +++ b/lib/pescarte/blog/blog_tag.ex @@ -0,0 +1,53 @@ +defmodule Pescarte.Blog.BlogTag do + @moduledoc""" + O contexto BlogTag é responsável por gerenciar as operações relacionadas a TAG. + """ + + alias Pescarte.Database.Repo + alias Pescarte.Blog.Models.Tag + + @spec list_tags() :: {:ok, list(Tag.t())} | {:error, term()} + def list_tags do + Repo.replica().all(Tag) + end + + @spec fetch_tag_by_id(String.t()) :: {:ok, Tag.t()} | {:error, term()} + def fetch_tag_by_id(id) do + Pescarte.Database.fetch(Tag, id) + end + + @spec fetch_tag_by_name(String.t()) :: {:ok, Tag.t()} | {:error, term()} + def fetch_tag_by_name(nome) do + Pescarte.Database.fetch_by(Tag, nome: nome) + end + + @spec create_tag(map()) :: {:ok, Tag.t()} | {:error, Ecto.Changeset.t()} + def create_tag(attrs) do + %Tag{} + |> Tag.changeset(attrs) + |> Repo.insert() + end + + @spec update_tag(String.t(), map()) :: {:ok, Tag.t()} | {:error, :not_found | Ecto.Changeset.t()} + def update_tag(id, attrs) do + case Repo.get(Tag, id) do + nil -> + {:error, :not_found} + + tag -> + tag + |> Tag.changeset(attrs) + |> Repo.update() + end + end + + @spec delete_tag_by_id(String.t()) :: {:ok, Tag.t()} | {:error, :not_found} + def delete_tag_by_id(id) do + case Repo.get(Tag, id) do + nil -> + {:error, :not_found} + tag -> + Repo.delete(tag) + end + end +end From 5070208d13b5d4a5ea5182b36c5a924a2a89ce23 Mon Sep 17 00:00:00 2001 From: Marcos Dias <57465032+SoraAsc@users.noreply.github.com> Date: Thu, 15 Aug 2024 03:10:38 +0000 Subject: [PATCH 4/9] fix: code format --- lib/pescarte/blog/blog_tag.ex | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/pescarte/blog/blog_tag.ex b/lib/pescarte/blog/blog_tag.ex index 0b1a7f17..89eabbdb 100644 --- a/lib/pescarte/blog/blog_tag.ex +++ b/lib/pescarte/blog/blog_tag.ex @@ -1,10 +1,10 @@ defmodule Pescarte.Blog.BlogTag do - @moduledoc""" + @moduledoc """ O contexto BlogTag é responsável por gerenciar as operações relacionadas a TAG. """ - alias Pescarte.Database.Repo alias Pescarte.Blog.Models.Tag + alias Pescarte.Database.Repo @spec list_tags() :: {:ok, list(Tag.t())} | {:error, term()} def list_tags do @@ -28,7 +28,8 @@ defmodule Pescarte.Blog.BlogTag do |> Repo.insert() end - @spec update_tag(String.t(), map()) :: {:ok, Tag.t()} | {:error, :not_found | Ecto.Changeset.t()} + @spec update_tag(String.t(), map()) :: + {:ok, Tag.t()} | {:error, :not_found | Ecto.Changeset.t()} def update_tag(id, attrs) do case Repo.get(Tag, id) do nil -> @@ -44,10 +45,8 @@ defmodule Pescarte.Blog.BlogTag do @spec delete_tag_by_id(String.t()) :: {:ok, Tag.t()} | {:error, :not_found} def delete_tag_by_id(id) do case Repo.get(Tag, id) do - nil -> - {:error, :not_found} - tag -> - Repo.delete(tag) + nil -> {:error, :not_found} + tag -> Repo.delete(tag) end end end From b32867e6363cafc65c64f5c6b983743a000448a6 Mon Sep 17 00:00:00 2001 From: Marcos Dias <57465032+SoraAsc@users.noreply.github.com> Date: Sun, 25 Aug 2024 22:37:40 +0000 Subject: [PATCH 5/9] refactor: change in tag namespace --- lib/pescarte/blog/{models => entity}/tag.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename lib/pescarte/blog/{models => entity}/tag.ex (92%) diff --git a/lib/pescarte/blog/models/tag.ex b/lib/pescarte/blog/entity/tag.ex similarity index 92% rename from lib/pescarte/blog/models/tag.ex rename to lib/pescarte/blog/entity/tag.ex index aa20d276..cdc57ea3 100644 --- a/lib/pescarte/blog/models/tag.ex +++ b/lib/pescarte/blog/entity/tag.ex @@ -1,4 +1,4 @@ -defmodule Pescarte.Blog.Models.Tag do +defmodule Pescarte.Blog.Entity.Tag do use Pescarte, :model alias Pescarte.Database.Types.PublicId From 34eea36845200c756eda13a24e6bdc9c20ebc4d4 Mon Sep 17 00:00:00 2001 From: Marcos Dias <57465032+SoraAsc@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:33:41 -0300 Subject: [PATCH 6/9] fix: blog CRUD - Refatorado get e update para update_all - Refatorado get e delete para delete_all. --- lib/pescarte/blog/{blog_tag.ex => blog.ex} | 39 ++++++++++++---------- 1 file changed, 21 insertions(+), 18 deletions(-) rename lib/pescarte/blog/{blog_tag.ex => blog.ex} (50%) diff --git a/lib/pescarte/blog/blog_tag.ex b/lib/pescarte/blog/blog.ex similarity index 50% rename from lib/pescarte/blog/blog_tag.ex rename to lib/pescarte/blog/blog.ex index 89eabbdb..a287a8c6 100644 --- a/lib/pescarte/blog/blog_tag.ex +++ b/lib/pescarte/blog/blog.ex @@ -1,10 +1,11 @@ -defmodule Pescarte.Blog.BlogTag do +defmodule Pescarte.Blog.Blog do @moduledoc """ - O contexto BlogTag é responsável por gerenciar as operações relacionadas a TAG. + O contexto Blog é responsável por gerenciar as operações relacionadas aos Posts e as Tags. """ - alias Pescarte.Blog.Models.Tag + alias Pescarte.Blog.Entity.Tag alias Pescarte.Database.Repo + import Ecto.Query @spec list_tags() :: {:ok, list(Tag.t())} | {:error, term()} def list_tags do @@ -28,25 +29,27 @@ defmodule Pescarte.Blog.BlogTag do |> Repo.insert() end - @spec update_tag(String.t(), map()) :: - {:ok, Tag.t()} | {:error, :not_found | Ecto.Changeset.t()} + @spec update_tag(String.t(), map()) :: {:ok, :updated} | {:error, :not_found} def update_tag(id, attrs) do - case Repo.get(Tag, id) do - nil -> - {:error, :not_found} - - tag -> - tag - |> Tag.changeset(attrs) - |> Repo.update() + query = from(t in Tag, where: t.id == ^id) + + query + |> Repo.update_all(set: Map.to_list(attrs)) + |> case do + {0, _} -> {:error, :not_found} + {_, _} -> {:ok, :updated} end end - @spec delete_tag_by_id(String.t()) :: {:ok, Tag.t()} | {:error, :not_found} - def delete_tag_by_id(id) do - case Repo.get(Tag, id) do - nil -> {:error, :not_found} - tag -> Repo.delete(tag) + @spec delete_tag(String.t()) :: {:ok, :deleted} | {:error, :not_found} + def delete_tag(id) do + query = from(t in Tag, where: t.id == ^id) + + query + |> Repo.delete_all() + |> case do + {0, _} -> {:error, :not_found} + {_, _} -> {:ok, :deleted} end end end From 32159a35438d14796741850a8034e1c4a9a5765c Mon Sep 17 00:00:00 2001 From: Marcos Dias <57465032+SoraAsc@users.noreply.github.com> Date: Tue, 27 Aug 2024 19:45:07 -0300 Subject: [PATCH 7/9] =?UTF-8?q?fix:=20centralizando=20fun=C3=A7=C3=B5es=20?= =?UTF-8?q?do=20crud=20na=20entidade=20tag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pescarte/blog/blog.ex | 55 --------------------------------- lib/pescarte/blog/entity/tag.ex | 47 ++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 55 deletions(-) delete mode 100644 lib/pescarte/blog/blog.ex diff --git a/lib/pescarte/blog/blog.ex b/lib/pescarte/blog/blog.ex deleted file mode 100644 index a287a8c6..00000000 --- a/lib/pescarte/blog/blog.ex +++ /dev/null @@ -1,55 +0,0 @@ -defmodule Pescarte.Blog.Blog do - @moduledoc """ - O contexto Blog é responsável por gerenciar as operações relacionadas aos Posts e as Tags. - """ - - alias Pescarte.Blog.Entity.Tag - alias Pescarte.Database.Repo - import Ecto.Query - - @spec list_tags() :: {:ok, list(Tag.t())} | {:error, term()} - def list_tags do - Repo.replica().all(Tag) - end - - @spec fetch_tag_by_id(String.t()) :: {:ok, Tag.t()} | {:error, term()} - def fetch_tag_by_id(id) do - Pescarte.Database.fetch(Tag, id) - end - - @spec fetch_tag_by_name(String.t()) :: {:ok, Tag.t()} | {:error, term()} - def fetch_tag_by_name(nome) do - Pescarte.Database.fetch_by(Tag, nome: nome) - end - - @spec create_tag(map()) :: {:ok, Tag.t()} | {:error, Ecto.Changeset.t()} - def create_tag(attrs) do - %Tag{} - |> Tag.changeset(attrs) - |> Repo.insert() - end - - @spec update_tag(String.t(), map()) :: {:ok, :updated} | {:error, :not_found} - def update_tag(id, attrs) do - query = from(t in Tag, where: t.id == ^id) - - query - |> Repo.update_all(set: Map.to_list(attrs)) - |> case do - {0, _} -> {:error, :not_found} - {_, _} -> {:ok, :updated} - end - end - - @spec delete_tag(String.t()) :: {:ok, :deleted} | {:error, :not_found} - def delete_tag(id) do - query = from(t in Tag, where: t.id == ^id) - - query - |> Repo.delete_all() - |> case do - {0, _} -> {:error, :not_found} - {_, _} -> {:ok, :deleted} - end - end -end diff --git a/lib/pescarte/blog/entity/tag.ex b/lib/pescarte/blog/entity/tag.ex index cdc57ea3..5040af8b 100644 --- a/lib/pescarte/blog/entity/tag.ex +++ b/lib/pescarte/blog/entity/tag.ex @@ -21,4 +21,51 @@ defmodule Pescarte.Blog.Entity.Tag do |> validate_required(@required_fields) |> unique_constraint(:nome) end + + @spec list_tags() :: {:ok, list(Tag.t())} | {:error, term()} + def list_tags do + Repo.replica().all(Tag) + end + + @spec fetch_tag_by_id(String.t()) :: {:ok, Tag.t()} | {:error, term()} + def fetch_tag_by_id(id) do + Pescarte.Database.fetch(Tag, id) + end + + @spec fetch_tag_by_name(String.t()) :: {:ok, Tag.t()} | {:error, term()} + def fetch_tag_by_name(nome) do + Pescarte.Database.fetch_by(Tag, nome: nome) + end + + @spec create_tag(map()) :: {:ok, Tag.t()} | {:error, changeset} + def create_tag(attrs) do + %Tag{} + |> changeset(attrs) + |> Repo.insert() + end + + @spec update_tag(String.t(), map()) :: {:ok, :updated} | {:error, :not_found} + def update_tag(id, attrs) do + query = from(t in Tag, where: t.id == ^id) + + query + |> Repo.update_all(set: Map.to_list(attrs)) + |> case do + {0, _} -> {:error, :not_found} + {_, _} -> {:ok, :updated} + end + end + + @spec delete_tag(String.t()) :: {:ok, :deleted} | {:error, :not_found} + def delete_tag(id) do + query = from(t in Tag, where: t.id == ^id) + + query + |> Repo.delete_all() + |> case do + {0, _} -> {:error, :not_found} + {_, _} -> {:ok, :deleted} + end + end + end From 6ab7fd2451d82a227adcb1e1a8e7e18b6dd61fd9 Mon Sep 17 00:00:00 2001 From: Marcos Dias <57465032+SoraAsc@users.noreply.github.com> Date: Tue, 27 Aug 2024 20:18:33 -0300 Subject: [PATCH 8/9] fix: update e delete MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - atualização no updated_at e retorno da entidade do update_tag. - delete_tag agora só retorna ok quando é realizado com sucesso. --- lib/pescarte/blog/entity/tag.ex | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/pescarte/blog/entity/tag.ex b/lib/pescarte/blog/entity/tag.ex index 5040af8b..798e647c 100644 --- a/lib/pescarte/blog/entity/tag.ex +++ b/lib/pescarte/blog/entity/tag.ex @@ -44,27 +44,29 @@ defmodule Pescarte.Blog.Entity.Tag do |> Repo.insert() end - @spec update_tag(String.t(), map()) :: {:ok, :updated} | {:error, :not_found} + @spec update_tag(String.t(), map()) :: {:ok, Tag.t()} | {:error, :not_found} def update_tag(id, attrs) do - query = from(t in Tag, where: t.id == ^id) + query = from(t in Tag, where: t.id == ^id, select: t) + + attrs_with_updated_date = Map.put(attrs, :updated_at, NaiveDateTime.utc_now()) query - |> Repo.update_all(set: Map.to_list(attrs)) + |> Repo.update_all(set: Map.to_list(attrs_with_updated_date)) |> case do - {0, _} -> {:error, :not_found} - {_, _} -> {:ok, :updated} + {1, [updated_tag]} -> {:ok, updated_tag} + {_, _} -> {:error, :not_found} end end - @spec delete_tag(String.t()) :: {:ok, :deleted} | {:error, :not_found} + @spec delete_tag(String.t()) :: :ok | {:error, :not_found} def delete_tag(id) do query = from(t in Tag, where: t.id == ^id) query |> Repo.delete_all() |> case do - {0, _} -> {:error, :not_found} - {_, _} -> {:ok, :deleted} + {1, _} -> :ok + {_, _} -> {:error, :not_found} end end From 8c3dfd0def734edf35525cbb2be63dffe0784968 Mon Sep 17 00:00:00 2001 From: Marcos Dias <57465032+SoraAsc@users.noreply.github.com> Date: Tue, 27 Aug 2024 20:53:13 -0300 Subject: [PATCH 9/9] =?UTF-8?q?feat:=20documenta=C3=A7=C3=A3o=20simples=20?= =?UTF-8?q?na=20entidade=20Tag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pescarte/blog/entity/tag.ex | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/pescarte/blog/entity/tag.ex b/lib/pescarte/blog/entity/tag.ex index 798e647c..d42a6d2a 100644 --- a/lib/pescarte/blog/entity/tag.ex +++ b/lib/pescarte/blog/entity/tag.ex @@ -1,4 +1,8 @@ defmodule Pescarte.Blog.Entity.Tag do + @moduledoc """ + A entidade `Tag` fornece um CRUD básico para a mesma e é responsável por categorizar os posts do contexto Blog, para filtragem e pesquisa. + """ + use Pescarte, :model alias Pescarte.Database.Types.PublicId @@ -69,5 +73,4 @@ defmodule Pescarte.Blog.Entity.Tag do {_, _} -> {:error, :not_found} end end - end