mobilizon.chapril.org-mobil.../lib/mobilizon/events/tag.ex

41 lines
948 B
Elixir

defmodule Mobilizon.Events.Tag do
@moduledoc """
Represents a tag for events
"""
use Ecto.Schema
import Ecto.Changeset
alias Mobilizon.Events.Tag
alias Mobilizon.Events.Tag.TitleSlug
alias Mobilizon.Events.TagRelation
schema "tags" do
field(:title, :string)
field(:slug, TitleSlug.Type)
many_to_many(:related_tags, Tag, join_through: TagRelation)
timestamps()
end
@doc false
def changeset(%Tag{} = tag, attrs) do
tag
|> cast(attrs, [:title])
|> TitleSlug.maybe_generate_slug()
|> validate_required([:title, :slug])
|> TitleSlug.unique_constraint()
end
def increment_slug(slug) do
case List.pop_at(String.split(slug, "-"), -1) do
{nil, _} ->
slug
{suffix, slug_parts} ->
case Integer.parse(suffix) do
{id, _} -> Enum.join(slug_parts, "-") <> "-" <> Integer.to_string(id + 1)
:error -> slug <> "-1"
end
end
end
end