mobilizon/lib/service/export/participants/common.ex

148 lines
3.9 KiB
Elixir
Raw Permalink Normal View History

defmodule Mobilizon.Service.Export.Participants.Common do
@moduledoc """
Common functions for managing participants export
"""
alias Mobilizon.Actors.Actor
alias Mobilizon.{Config, Export}
alias Mobilizon.Events.Participant
alias Mobilizon.Events.Participant.Metadata
alias Mobilizon.Storage.Repo
import Mobilizon.Web.Gettext, only: [gettext: 1]
import Mobilizon.Service.DateTime, only: [datetime_to_string: 2]
@spec save_upload(String.t(), String.t(), String.t(), String.t(), String.t()) ::
{:ok, Export.t()} | {:error, atom() | Ecto.Changeset.t()}
def save_upload(full_path, file_path, reference, file_name, format) do
with {:ok, %File.Stat{size: file_size}} <- File.stat(full_path) do
%Export{}
|> Export.changeset(%{
file_size: file_size,
file_name: file_name,
file_path: file_path,
format: format,
reference: reference,
type: "event_participants"
})
|> Repo.insert()
end
end
@doc """
Match a participant role to it's translated version
"""
@spec translate_role(atom()) :: String.t()
def translate_role(role) do
case role do
:not_approved ->
gettext("Not approved")
:not_confirmed ->
gettext("Not confirmed")
:rejected ->
gettext("Rejected")
:participant ->
gettext("Participant")
:moderator ->
gettext("Moderator")
:administrator ->
gettext("Administrator")
:creator ->
gettext("Creator")
end
end
@spec columns :: list(String.t())
def columns do
[
gettext("Participant name"),
gettext("Participant status"),
gettext("Participant registration date"),
gettext("Participant message")
]
end
# One hour
@expiration 60 * 60
@doc """
Clean outdated files in export folder
"""
@spec clean_exports(String.t(), String.t(), integer()) :: :ok
def clean_exports(format, upload_path, expiration \\ @expiration) do
"event_participants"
|> Export.outdated(format, expiration)
|> Enum.each(&remove_export(&1, upload_path))
end
defp remove_export(%Export{file_path: filename} = export, upload_path) do
full_path = upload_path <> filename
File.rm(full_path)
Repo.delete!(export)
end
@spec to_list({Participant.t(), Actor.t()}) :: list(String.t())
def to_list(
{%Participant{role: role, metadata: metadata, inserted_at: inserted_at},
%Actor{domain: nil, preferred_username: "anonymous"}}
) do
[
gettext("Anonymous participant"),
translate_role(role),
datetime_to_string(inserted_at, Gettext.get_locale()),
convert_metadata(metadata)
]
end
def to_list(
{%Participant{role: role, metadata: metadata, inserted_at: inserted_at}, %Actor{} = actor}
) do
[
Actor.display_name_and_username(actor),
translate_role(role),
datetime_to_string(inserted_at, Gettext.get_locale()),
convert_metadata(metadata)
]
end
@spec convert_metadata(Metadata.t() | nil) :: String.t()
defp convert_metadata(%Metadata{message: message}) when is_binary(message) do
message
end
defp convert_metadata(_), do: ""
@spec export_modules :: list(module())
def export_modules do
export_config = Application.get_env(:mobilizon, :exports)
Keyword.get(export_config, :formats, [])
end
@spec enabled_formats :: list(String.t())
def enabled_formats do
export_modules()
|> Enum.map(& &1.extension())
end
@spec export_enabled?(module()) :: boolean
def export_enabled?(type) do
export_config = Application.get_env(:mobilizon, :exports)
formats = Keyword.get(export_config, :formats, [])
type in formats
end
@default_upload_path "uploads/exports/"
@spec export_path(String.t()) :: String.t()
def export_path(extension) do
[:exports, :path]
|> Config.get(@default_upload_path)
|> Path.join(extension)
end
end