mirror of
https://github.com/ClaperCo/Claper.git
synced 2025-12-16 11:57:58 +01:00
Update and improve doc
This commit is contained in:
@@ -122,8 +122,7 @@ Claper is passwordless, so you don't have to create an account. Just login with
|
|||||||
<!-- ROADMAP -->
|
<!-- ROADMAP -->
|
||||||
## Roadmap
|
## Roadmap
|
||||||
|
|
||||||
- [ ] Add Changelog
|
- [x] Add Changelog
|
||||||
- [ ] Remove dead code
|
|
||||||
- [ ] Add additional tests for better coverage
|
- [ ] Add additional tests for better coverage
|
||||||
- [ ] Add more docs
|
- [ ] Add more docs
|
||||||
|
|
||||||
|
|||||||
@@ -136,11 +136,11 @@ defmodule Claper.Accounts do
|
|||||||
end
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Delivers the update email instructions to the given user.
|
Delivers the magic link email to the given user.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> deliver_update_email_instructions(user, current_email, &Routes.user_update_email_url(conn, :edit, &1))
|
iex> deliver_magic_link(user, &Routes.user_confirmation_url(conn, :confirm_magic, &1))
|
||||||
{:ok, %{to: ..., body: ...}}
|
{:ok, %{to: ..., body: ...}}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@@ -152,6 +152,15 @@ defmodule Claper.Accounts do
|
|||||||
UserNotifier.deliver_magic_link(email, magic_link_url_fun.(encoded_token))
|
UserNotifier.deliver_magic_link(email, magic_link_url_fun.(encoded_token))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Delivers the update email instructions to the given user.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> deliver_update_email_instructions(user, current_email, &Routes.user_update_email_url(conn, :edit, &1))
|
||||||
|
{:ok, %{to: ..., body: ...}}
|
||||||
|
|
||||||
|
"""
|
||||||
def deliver_update_email_instructions(%User{} = user, current_email, update_email_url_fun)
|
def deliver_update_email_instructions(%User{} = user, current_email, update_email_url_fun)
|
||||||
when is_function(update_email_url_fun, 1) do
|
when is_function(update_email_url_fun, 1) do
|
||||||
{encoded_token, user_token} = UserToken.build_email_token(user, "change:#{current_email}")
|
{encoded_token, user_token} = UserToken.build_email_token(user, "change:#{current_email}")
|
||||||
@@ -179,6 +188,9 @@ defmodule Claper.Accounts do
|
|||||||
Repo.one(query)
|
Repo.one(query)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Verify the token for a given user email is valid.
|
||||||
|
"""
|
||||||
def magic_token_valid?(email) do
|
def magic_token_valid?(email) do
|
||||||
query = UserToken.user_magic_and_contexts_expiry_query(email)
|
query = UserToken.user_magic_and_contexts_expiry_query(email)
|
||||||
Repo.exists?(query)
|
Repo.exists?(query)
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
defmodule Claper.Events do
|
defmodule Claper.Events do
|
||||||
@moduledoc """
|
@moduledoc """
|
||||||
The Events context.
|
The Events context.
|
||||||
|
|
||||||
|
An activity leader is a facilitator, a user invited to manage an event.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import Ecto.Query, warn: false
|
import Ecto.Query, warn: false
|
||||||
@@ -9,11 +11,11 @@ defmodule Claper.Events do
|
|||||||
alias Claper.Events.{Event, ActivityLeader}
|
alias Claper.Events.{Event, ActivityLeader}
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Returns the list of events.
|
Returns the list of events of a given user.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> list_events()
|
iex> list_events(123)
|
||||||
[%Event{}, ...]
|
[%Event{}, ...]
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@@ -23,6 +25,15 @@ defmodule Claper.Events do
|
|||||||
|> Repo.preload(preload)
|
|> Repo.preload(preload)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Returns the list of events managed by a given user email.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> list_managed_events_by("email@example.com")
|
||||||
|
[%Event{}, ...]
|
||||||
|
|
||||||
|
"""
|
||||||
def list_managed_events_by(email, preload \\ []) do
|
def list_managed_events_by(email, preload \\ []) do
|
||||||
from(a in ActivityLeader,
|
from(a in ActivityLeader,
|
||||||
join: u in Claper.Accounts.User,
|
join: u in Claper.Accounts.User,
|
||||||
@@ -58,16 +69,30 @@ defmodule Claper.Events do
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> get_event!(123)
|
iex> get_event!("123e4567-e89b-12d3-a456-426614174000")
|
||||||
%Event{}
|
%Event{}
|
||||||
|
|
||||||
iex> get_event!(456)
|
iex> get_event!("123e4567-e89b-12d3-a456-4266141740111")
|
||||||
** (Ecto.NoResultsError)
|
** (Ecto.NoResultsError)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
def get_event!(id, preload \\ []),
|
def get_event!(id, preload \\ []),
|
||||||
do: Repo.get_by!(Event, uuid: id) |> Repo.preload(preload)
|
do: Repo.get_by!(Event, uuid: id) |> Repo.preload(preload)
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Gets a single managed event.
|
||||||
|
|
||||||
|
Raises `Ecto.NoResultsError` if the Event does not exist.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> get_managed_event!(user, "123e4567-e89b-12d3-a456-426614174000")
|
||||||
|
%Event{}
|
||||||
|
|
||||||
|
iex> get_managed_event!(another_user, "123e4567-e89b-12d3-a456-426614174000")
|
||||||
|
** (Ecto.NoResultsError)
|
||||||
|
|
||||||
|
"""
|
||||||
def get_managed_event!(current_user, id, preload \\ []) do
|
def get_managed_event!(current_user, id, preload \\ []) do
|
||||||
event = Repo.get_by!(Event, uuid: id)
|
event = Repo.get_by!(Event, uuid: id)
|
||||||
is_leader = Claper.Events.is_leaded_by(current_user.email, event) || event.user_id == current_user.id
|
is_leader = Claper.Events.is_leaded_by(current_user.email, event) || event.user_id == current_user.id
|
||||||
@@ -78,9 +103,37 @@ defmodule Claper.Events do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Gets a single user's event.
|
||||||
|
|
||||||
|
Raises `Ecto.NoResultsError` if the Event does not exist.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> get_user_event!(user, "123e4567-e89b-12d3-a456-426614174000")
|
||||||
|
%Event{}
|
||||||
|
|
||||||
|
iex> get_user_event!(another_user, "123e4567-e89b-12d3-a456-426614174000")
|
||||||
|
** (Ecto.NoResultsError)
|
||||||
|
|
||||||
|
"""
|
||||||
def get_user_event!(user_id, id, preload \\ []),
|
def get_user_event!(user_id, id, preload \\ []),
|
||||||
do: Repo.get_by!(Event, uuid: id, user_id: user_id) |> Repo.preload(preload)
|
do: Repo.get_by!(Event, uuid: id, user_id: user_id) |> Repo.preload(preload)
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Gets a single event by code.
|
||||||
|
|
||||||
|
Raises `Ecto.NoResultsError` if the Event does not exist.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> get_event_with_code!("Hello")
|
||||||
|
%Event{}
|
||||||
|
|
||||||
|
iex> get_event_with_code!("Old event")
|
||||||
|
** (Ecto.NoResultsError)
|
||||||
|
|
||||||
|
"""
|
||||||
def get_event_with_code!(code, preload \\ []) do
|
def get_event_with_code!(code, preload \\ []) do
|
||||||
now = NaiveDateTime.utc_now()
|
now = NaiveDateTime.utc_now()
|
||||||
|
|
||||||
@@ -97,6 +150,16 @@ defmodule Claper.Events do
|
|||||||
|> Repo.preload(preload)
|
|> Repo.preload(preload)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Get a single event with the same code excluding a specific event.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> get_different_event_with_code("Hello", 123)
|
||||||
|
%Event{}
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
def get_different_event_with_code(nil, _event_id), do: nil
|
def get_different_event_with_code(nil, _event_id), do: nil
|
||||||
|
|
||||||
def get_different_event_with_code(code, event_id) do
|
def get_different_event_with_code(code, event_id) do
|
||||||
@@ -106,6 +169,16 @@ defmodule Claper.Events do
|
|||||||
|> Repo.one()
|
|> Repo.one()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Check if a user is a facilitator of a specific event.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> is_leaded_by("email@example.com", 123)
|
||||||
|
true
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
def is_leaded_by(email, event) do
|
def is_leaded_by(email, event) do
|
||||||
from(a in ActivityLeader,
|
from(a in ActivityLeader,
|
||||||
join: u in Claper.Accounts.User,
|
join: u in Claper.Accounts.User,
|
||||||
@@ -214,20 +287,7 @@ defmodule Claper.Events do
|
|||||||
alias Claper.Events.ActivityLeader
|
alias Claper.Events.ActivityLeader
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Returns the list of activity_leaders.
|
Gets a single facilitator.
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
iex> list_activity_leaders()
|
|
||||||
[%ActivityLeader{}, ...]
|
|
||||||
|
|
||||||
"""
|
|
||||||
def list_activity_leaders do
|
|
||||||
Repo.all(ActivityLeader)
|
|
||||||
end
|
|
||||||
|
|
||||||
@doc """
|
|
||||||
Gets a single activity_leader.
|
|
||||||
|
|
||||||
Raises `Ecto.NoResultsError` if the Activity leader does not exist.
|
Raises `Ecto.NoResultsError` if the Activity leader does not exist.
|
||||||
|
|
||||||
@@ -242,6 +302,15 @@ defmodule Claper.Events do
|
|||||||
"""
|
"""
|
||||||
def get_activity_leader!(id), do: Repo.get!(ActivityLeader, id)
|
def get_activity_leader!(id), do: Repo.get!(ActivityLeader, id)
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Gets all facilitators for a given event.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> get_activity_leaders_for_event!(event)
|
||||||
|
[%ActivityLeader{}, ...]
|
||||||
|
|
||||||
|
"""
|
||||||
def get_activity_leaders_for_event(event_id) do
|
def get_activity_leaders_for_event(event_id) do
|
||||||
from(a in ActivityLeader,
|
from(a in ActivityLeader,
|
||||||
left_join: u in Claper.Accounts.User,
|
left_join: u in Claper.Accounts.User,
|
||||||
@@ -253,7 +322,7 @@ defmodule Claper.Events do
|
|||||||
end
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Returns an `%Ecto.Changeset{}` for tracking activity_leader changes.
|
Returns an `%Ecto.Changeset{}` for tracking facilitator changes.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ defmodule Claper.Polls do
|
|||||||
alias Claper.Polls.PollVote
|
alias Claper.Polls.PollVote
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Returns the list of polls.
|
Returns the list of polls for a given presentation file.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> list_polls()
|
iex> list_polls(123)
|
||||||
[%Poll{}, ...]
|
[%Poll{}, ...]
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@@ -28,6 +28,15 @@ defmodule Claper.Polls do
|
|||||||
|> Repo.preload([:poll_opts])
|
|> Repo.preload([:poll_opts])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Returns the list of polls for a given presentation file and a given position.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> list_polls_at_position(123, 0)
|
||||||
|
[%Poll{}, ...]
|
||||||
|
|
||||||
|
"""
|
||||||
def list_polls_at_position(presentation_file_id, position) do
|
def list_polls_at_position(presentation_file_id, position) do
|
||||||
from(p in Poll,
|
from(p in Poll,
|
||||||
where: p.presentation_file_id == ^presentation_file_id and p.position == ^position,
|
where: p.presentation_file_id == ^presentation_file_id and p.position == ^position,
|
||||||
@@ -38,7 +47,7 @@ defmodule Claper.Polls do
|
|||||||
end
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Gets a single poll.
|
Gets a single poll and set percentages for each poll options.
|
||||||
|
|
||||||
Raises `Ecto.NoResultsError` if the Poll does not exist.
|
Raises `Ecto.NoResultsError` if the Poll does not exist.
|
||||||
|
|
||||||
@@ -63,6 +72,15 @@ defmodule Claper.Polls do
|
|||||||
)
|
)
|
||||||
|> set_percentages()
|
|> set_percentages()
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Gets a single poll for a given position.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> get_poll!(123, 0)
|
||||||
|
%Poll{}
|
||||||
|
|
||||||
|
"""
|
||||||
def get_poll_current_position(presentation_file_id, position) do
|
def get_poll_current_position(presentation_file_id, position) do
|
||||||
from(p in Poll,
|
from(p in Poll,
|
||||||
where:
|
where:
|
||||||
@@ -80,6 +98,15 @@ defmodule Claper.Polls do
|
|||||||
|> set_percentages()
|
|> set_percentages()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Calculate percentage of all poll options for a given poll.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> set_percentages(poll)
|
||||||
|
%Poll{}
|
||||||
|
|
||||||
|
"""
|
||||||
def set_percentages(%Poll{poll_opts: poll_opts} = poll) when is_list(poll_opts) do
|
def set_percentages(%Poll{poll_opts: poll_opts} = poll) when is_list(poll_opts) do
|
||||||
total = Enum.map(poll.poll_opts, fn e -> e.vote_count end) |> Enum.sum()
|
total = Enum.map(poll.poll_opts, fn e -> e.vote_count end) |> Enum.sum()
|
||||||
|
|
||||||
@@ -122,10 +149,10 @@ defmodule Claper.Polls do
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> update_poll(poll, %{field: new_value})
|
iex> update_poll("123e4567-e89b-12d3-a456-426614174000", poll, %{field: new_value})
|
||||||
{:ok, %Poll{}}
|
{:ok, %Poll{}}
|
||||||
|
|
||||||
iex> update_poll(poll, %{field: bad_value})
|
iex> update_poll("123e4567-e89b-12d3-a456-426614174000", poll, %{field: bad_value})
|
||||||
{:error, %Ecto.Changeset{}}
|
{:error, %Ecto.Changeset{}}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@@ -148,10 +175,10 @@ defmodule Claper.Polls do
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> delete_poll(poll)
|
iex> delete_poll("123e4567-e89b-12d3-a456-426614174000", poll)
|
||||||
{:ok, %Poll{}}
|
{:ok, %Poll{}}
|
||||||
|
|
||||||
iex> delete_poll(poll)
|
iex> delete_poll("123e4567-e89b-12d3-a456-426614174000", poll)
|
||||||
{:error, %Ecto.Changeset{}}
|
{:error, %Ecto.Changeset{}}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@@ -283,16 +310,12 @@ defmodule Claper.Polls do
|
|||||||
@doc """
|
@doc """
|
||||||
Gets a single poll_vote.
|
Gets a single poll_vote.
|
||||||
|
|
||||||
Raises `Ecto.NoResultsError` if the Poll vote does not exist.
|
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> get_poll_vote!(123)
|
iex> get_poll_vote!(321, 123)
|
||||||
%PollVote{}
|
%PollVote{}
|
||||||
|
|
||||||
iex> get_poll_vote!(456)
|
|
||||||
** (Ecto.NoResultsError)
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
def get_poll_vote(user_id, poll_id) when is_number(user_id),
|
def get_poll_vote(user_id, poll_id) when is_number(user_id),
|
||||||
do: Repo.get_by(PollVote, poll_id: poll_id, user_id: user_id)
|
do: Repo.get_by(PollVote, poll_id: poll_id, user_id: user_id)
|
||||||
|
|||||||
@@ -55,10 +55,10 @@ defmodule Claper.Posts do
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> get_post!(123)
|
iex> get_post!("123e4567-e89b-12d3-a456-426614174000")
|
||||||
%Post{}
|
%Post{}
|
||||||
|
|
||||||
iex> get_post!(456)
|
iex> get_post!("123e4567-e89b-12d3-a456-426614174123")
|
||||||
** (Ecto.NoResultsError)
|
** (Ecto.NoResultsError)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@@ -69,10 +69,10 @@ defmodule Claper.Posts do
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> create_post(%{field: value})
|
iex> create_post(event, %{field: value})
|
||||||
{:ok, %Post{}}
|
{:ok, %Post{}}
|
||||||
|
|
||||||
iex> create_post(%{field: bad_value})
|
iex> create_post(event, %{field: bad_value})
|
||||||
{:error, %Ecto.Changeset{}}
|
{:error, %Ecto.Changeset{}}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -51,10 +51,10 @@ defmodule Claper.Presentations do
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
iex> update_presentation_file(presentation_files, %{field: new_value})
|
iex> update_presentation_file(presentation_file, %{field: new_value})
|
||||||
{:ok, %PresentationFile{}}
|
{:ok, %PresentationFile{}}
|
||||||
|
|
||||||
iex> update_presentation_file(presentation_files, %{field: bad_value})
|
iex> update_presentation_file(presentation_file, %{field: bad_value})
|
||||||
{:error, %Ecto.Changeset{}}
|
{:error, %Ecto.Changeset{}}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|||||||
25
mix.exs
25
mix.exs
@@ -37,8 +37,29 @@ defmodule Claper.MixProject do
|
|||||||
Usage: ~r/guides\/usage\/.?/
|
Usage: ~r/guides\/usage\/.?/
|
||||||
],
|
],
|
||||||
groups_for_modules: [
|
groups_for_modules: [
|
||||||
Authentication: [
|
"User management": [
|
||||||
Claper.Accounts
|
~r/Claper\.Account\.?/,
|
||||||
|
~r/ClaperWeb\.UserRegistration\.?/,
|
||||||
|
~r/ClaperWeb\.UserSession\.?/,
|
||||||
|
~r/ClaperWeb\.UserLiveAuth\.?/,
|
||||||
|
~r/ClaperWeb\.UserConfirmation\.?/,
|
||||||
|
~r/ClaperWeb\.UserSettings\.?/,
|
||||||
|
~r/ClaperWeb\.UserReset\.?/,
|
||||||
|
~r/ClaperWeb\.Attendee\.?/,
|
||||||
|
~r/ClaperWeb\.UserAuth\.?/,
|
||||||
|
~r/ClaperWeb\.UserView\.?/,
|
||||||
|
],
|
||||||
|
"Events": [
|
||||||
|
~r/Claper\.Event\.?/,
|
||||||
|
~r/ClaperWeb\.Event\.?/,
|
||||||
|
],
|
||||||
|
"Polls": [
|
||||||
|
~r/Claper\.Polls\.?/,
|
||||||
|
~r/ClaperWeb\.Poll\.?/,
|
||||||
|
],
|
||||||
|
"Posts": [
|
||||||
|
~r/Claper\.Posts\.?/,
|
||||||
|
~r/ClaperWeb\.Post\.?/,
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user