mobilizon/lib/mobilizon/collections/collections.ex

101 lines
2.7 KiB
Elixir

defmodule Mobilizon.Collections do
@moduledoc """
The Collections context.
"""
alias Mobilizon.Actors.Actor
alias Mobilizon.Collections.{Collection, Resource}
alias Mobilizon.Storage.{Page, Repo}
import Ecto.Query
import EctoEnum
defenum(ResourceType, :resource_type, [
:url
])
@doc """
Get a collection by it's ID
"""
@spec get_collection(integer | String.t()) :: Collection.t() | nil
def get_collection(id), do: Repo.get(Collection, id)
@doc """
Returns the list of collections for a group.
"""
@spec get_collections_for_group(Actor.t(), integer | nil, integer | nil) :: Page.t()
def get_collections_for_group(%Actor{id: group_id, type: :Group}, page \\ nil, limit \\ nil) do
Collection
|> where(actor_id: ^group_id)
|> Page.build_page(page, limit)
end
@doc """
Returns the list of collections for a group.
"""
@spec get_resources_for_collection(Collection.t(), integer | nil, integer | nil) :: Page.t()
def get_resources_for_collection(%Collection{id: collection_id}, page \\ nil, limit \\ nil) do
Resource
|> where(collection_id: ^collection_id)
|> Page.build_page(page, limit)
end
@doc """
Creates a collection.
"""
@spec create_collection(map) :: {:ok, Collection.t()} | {:error, Ecto.Changeset.t()}
def create_collection(attrs \\ %{}) do
%Collection{}
|> Collection.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a collection.
"""
@spec update_collection(Collection.t(), map) ::
{:ok, Collection.t()} | {:error, Ecto.Changeset.t()}
def update_collection(%Collection{} = collection, attrs) do
collection
|> Collection.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a collection
"""
@spec delete_collection(Collection.t()) :: {:ok, Collection.t()} | {:error, Ecto.Changeset.t()}
def delete_collection(%Collection{} = collection), do: Repo.delete(collection)
@doc """
Get a resource by it's ID
"""
@spec get_resource(integer | String.t()) :: Resource.t() | nil
def get_resource(id), do: Repo.get(Resource, id)
@doc """
Creates a resource.
"""
@spec create_resource(map) :: {:ok, Resource.t()} | {:error, Ecto.Changeset.t()}
def create_resource(attrs \\ %{}) do
%Resource{}
|> Resource.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a resource.
"""
@spec update_resource(Resource.t(), map) :: {:ok, Resource.t()} | {:error, Ecto.Changeset.t()}
def update_resource(%Resource{} = resource, attrs) do
resource
|> Resource.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a resource
"""
@spec delete_resource(Resource.t()) :: {:ok, Resource.t()} | {:error, Ecto.Changeset.t()}
def delete_resource(%Resource{} = resource), do: Repo.delete(resource)
end