Skip to content

Commit

Permalink
Merge branch 'main' into feat/blog-posts-migration
Browse files Browse the repository at this point in the history
  • Loading branch information
zoedsoupe authored Aug 28, 2024
2 parents 5ef74d4 + 06cbfcc commit a708b40
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 0 deletions.
76 changes: 76 additions & 0 deletions lib/pescarte/blog/entity/tag.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
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

@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

@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, Tag.t()} | {:error, :not_found}
def update_tag(id, attrs) do
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_with_updated_date))
|> case do
{1, [updated_tag]} -> {:ok, updated_tag}
{_, _} -> {:error, :not_found}
end
end

@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
{1, _} -> :ok
{_, _} -> {:error, :not_found}
end
end
end
13 changes: 13 additions & 0 deletions priv/repo/migrations/20240814202453_create_blog_tag.exs
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit a708b40

Please sign in to comment.