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

54 lines
1.2 KiB
Elixir
Raw Permalink Normal View History

2019-09-08 01:49:56 +02:00
defmodule Mobilizon.Events.Tag.TitleSlug do
@moduledoc """
2019-09-13 01:01:17 +02:00
Generates slugs for tags.
2019-09-08 01:49:56 +02:00
"""
use EctoAutoslugField.Slug, from: :title, to: :slug
2019-09-13 01:01:17 +02:00
alias Mobilizon.Events
@slug_separator "-"
@doc """
Builds a slug.
"""
@spec build_slug(keyword, Ecto.Changeset.t()) :: String.t()
2019-09-08 01:49:56 +02:00
def build_slug(sources, changeset) do
slug = super(sources, changeset)
2019-09-13 01:01:17 +02:00
2019-09-08 01:49:56 +02:00
build_unique_slug(slug, changeset)
end
2019-09-13 01:01:17 +02:00
@spec build_unique_slug(String.t(), Ecto.Changeset.t()) :: String.t()
2019-09-08 01:49:56 +02:00
defp build_unique_slug(slug, changeset) do
2019-09-13 01:01:17 +02:00
case Events.get_tag_by_slug(slug) do
2019-09-08 01:49:56 +02:00
nil ->
slug
_tag ->
slug
2019-09-13 01:01:17 +02:00
|> increment_slug()
2019-09-08 01:49:56 +02:00
|> build_unique_slug(changeset)
end
end
2019-09-13 01:01:17 +02:00
@spec increment_slug(String.t()) :: String.t()
defp increment_slug(slug) do
case List.pop_at(String.split(slug, @slug_separator), -1) do
{nil, _} ->
slug
{suffix, slug_parts} ->
case Integer.parse(suffix) do
{id, _} ->
Enum.join(slug_parts, @slug_separator) <>
@slug_separator <>
Integer.to_string(id + 1)
:error ->
"#{slug}#{@slug_separator}1"
end
end
end
2019-09-08 01:49:56 +02:00
end