101 lines
2.7 KiB
Elixir
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
|