Skip to content

Commit

Permalink
feat: team page (#464)
Browse files Browse the repository at this point in the history
  • Loading branch information
AfonsoMartins26 authored Feb 7, 2025
1 parent e78bfc8 commit d9e1649
Show file tree
Hide file tree
Showing 23 changed files with 1,115 additions and 6 deletions.
1 change: 1 addition & 0 deletions lib/safira/event.ex
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ defmodule Safira.Event do
"survival_guide_enabled",
"faqs_enabled",
"general_regulation_enabled",
"team_enabled",
"call_for_staff_enabled"
]
end
Expand Down
228 changes: 228 additions & 0 deletions lib/safira/teams.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
defmodule Safira.Teams do
@moduledoc """
The Teams context.
"""
use Safira.Context

alias Safira.Teams.Team

@doc """
Returns the list of teams.
## Examples
iex> list_teams()
[%Team{}, ...]
"""
def list_teams(opts \\ []) when is_list(opts) do
Team
|> order_by(:priority)
|> apply_filters(opts)
|> Repo.all()
end

@doc """
Gets a single team.
Raises `Ecto.NoResultsError` if the Team does not exist.
## Examples
iex> get_team!(123)
%Team{}
iex> get_team!(456)
** (Ecto.NoResultsError)
"""
def get_team!(id), do: Repo.get!(Team, id)

@doc """
Creates a team.
## Examples
iex> create_team(%{field: value})
{:ok, %Team{}}
iex> create_team(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_team(attrs \\ %{}) do
%Team{}
|> Team.changeset(attrs)
|> Repo.insert()
end

@doc """
Updates a team.
## Examples
iex> update_team(team, %{field: new_value})
{:ok, %Team{}}
iex> update_team(team, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_team(%Team{} = team, attrs) do
team
|> Team.changeset(attrs)
|> Repo.update()
end

@doc """
Deletes a team.
## Examples
iex> delete_team(team)
{:ok, %Team{}}
iex> delete_team(team)
{:error, %Ecto.Changeset{}}
"""
def delete_team(%Team{} = team) do
Repo.delete(team)
end

@doc """
Returns an `%Ecto.Changeset{}` for tracking team changes.
## Examples
iex> change_team(team)
%Ecto.Changeset{data: %Team{}}
"""
def change_team(%Team{} = team, attrs \\ %{}) do
Team.changeset(team, attrs)
end

def get_next_team_priority do
(Repo.aggregate(from(t in Team), :max, :priority) || -1) + 1
end

alias Safira.Teams.TeamMember

def update_team_member_foto(%TeamMember{} = member, attrs) do
member
|> TeamMember.image_changeset(attrs)
|> Repo.update()
end

@doc """
Returns the list of team_members.
## Examples
iex> list_team_members(team_id)
[%TeamMember{}, ...]
"""
def list_team_members(team_id \\ nil) do
members =
TeamMember
|> order_by(:name)
|> Repo.all()

case team_id do
nil ->
{:ok, members}

_ ->
filtered_members = Enum.filter(members, fn member -> member.team_id == team_id end)

if Enum.empty?(filtered_members) do
{:error, "No members found for the given team ID"}
else
{:ok, filtered_members}
end
end
end

@doc """
Gets a single team_member.
Raises `Ecto.NoResultsError` if the Team member does not exist.
## Examples
iex> get_team_member!(123)
%TeamMember{}
iex> get_team_member!(456)
** (Ecto.NoResultsError)
"""
def get_team_member!(id), do: Repo.get!(TeamMember, id)

@doc """
Creates a team_member.
## Examples
iex> create_team_member(%{field: value})
{:ok, %TeamMember{}}
iex> create_team_member(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_team_member(attrs \\ %{}) do
%TeamMember{}
|> TeamMember.changeset(attrs)
|> Repo.insert()
end

@doc """
Updates a team_member.
## Examples
iex> update_team_member(team_member, %{field: new_value})
{:ok, %TeamMember{}}
iex> update_team_member(team_member, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_team_member(%TeamMember{} = team_member, attrs) do
team_member
|> TeamMember.changeset(attrs)
|> Repo.update()
end

@doc """
Deletes a team_member.
## Examples
iex> delete_team_member(team_member)
{:ok, %TeamMember{}}
iex> delete_team_member(team_member)
{:error, %Ecto.Changeset{}}
"""
def delete_team_member(%TeamMember{} = team_member) do
Repo.delete(team_member)
end

@doc """
Returns an `%Ecto.Changeset{}` for tracking team_member changes.
## Examples
iex> change_team_member(team_member)
%Ecto.Changeset{data: %TeamMember{}}
"""
def change_team_member(%TeamMember{} = team_member, attrs \\ %{}) do
TeamMember.changeset(team_member, attrs)
end
end
24 changes: 24 additions & 0 deletions lib/safira/teams/team.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
defmodule Safira.Teams.Team do
@moduledoc """
Team schema.
"""
use Safira.Schema

@required_fields ~w(name priority)a

schema "teams" do
field :name, :string
field :priority, :integer
has_many :team_members, Safira.Teams.TeamMember

timestamps(type: :utc_datetime)
end

@doc false
def changeset(team, attrs) do
team
|> cast(attrs, @required_fields)
|> validate_required(@required_fields)
|> foreign_key_constraint(:name)
end
end
33 changes: 33 additions & 0 deletions lib/safira/teams/team_member.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
defmodule Safira.Teams.TeamMember do
@moduledoc """
Team member schema.
"""
use Safira.Schema

@required_fields ~w(name team_id)a
@optional_fields ~w(url)a

schema "team_members" do
field :name, :string
belongs_to :team, Safira.Teams.Team
field :url, :string
field :image, Uploaders.Member.Type

timestamps(type: :utc_datetime)
end

@doc false
def changeset(team_member, attrs) do
team_member
|> cast(attrs, @required_fields ++ @optional_fields)
|> validate_required(@required_fields)
|> unique_constraint(:name)
|> validate_url(:url)
end

@doc false
def image_changeset(team_member, attrs) do
team_member
|> cast_attachments(attrs, [:image])
end
end
28 changes: 28 additions & 0 deletions lib/safira/uploaders/member.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
defmodule Safira.Uploaders.Member do
@moduledoc """
Member image uploader.
"""
use Safira.Uploader

alias Safira.Teams.TeamMember

@versions [:original]
@extension_whitelist ~w(.jpg .jpeg .png)

def validate({file, _}) do
file_extension = file.file_name |> Path.extname() |> String.downcase()
Enum.member?(extension_whitelist(), file_extension)
end

def storage_dir(_, {_file, %TeamMember{} = team_member}) do
"uploads/team/members/#{team_member.id}"
end

def filename(version, _) do
version
end

def extension_whitelist do
@extension_whitelist
end
end
10 changes: 5 additions & 5 deletions lib/safira_web/config.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ defmodule SafiraWeb.Config do
url: "/schedule",
feature_flag: "schedule_enabled"
},
# %{
# title: "Team",
# url: "/team",
# feature_flag: "team_enabled"
# },
%{
title: "Team",
url: "/team",
feature_flag: "team_enabled"
},
%{
title: "Challenges",
url: "/challenges",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ defmodule SafiraWeb.Backoffice.EventLive.FormComponent do
import SafiraWeb.Components.Forms

alias Safira.Event

alias SafiraWeb.Helpers

@impl true
Expand Down
Loading

0 comments on commit d9e1649

Please sign in to comment.