Packages
ami
0.1.7
0.3.9
0.3.8
retired
0.3.7
retired
0.3.6
retired
0.3.5
retired
0.3.4
retired
0.3.3
retired
0.3.2
retired
0.3.1
retired
0.3.0
retired
0.2.9
retired
0.2.8
retired
0.2.7
retired
0.2.6
retired
0.2.5
retired
0.2.3
retired
0.2.2
retired
0.2.1
retired
0.2.0
retired
0.1.9
retired
0.1.8
retired
0.1.7
retired
0.1.6
retired
0.1.5
retired
0.1.4
retired
Package containing all AMI Models shared between micro-services.
Retired package: Security issue - retiring
Current section
Files
Jump to
Current section
Files
lib/ami/buddyship.ex
defmodule Ami.Buddyship do
use Ecto.Schema
import Ecto.{
Query,
Changeset
}
alias Ami.{
Course,
CoursePeriod,
Enrollment,
User,
Repo
}
schema "buddyships" do
@timestamps_opts [type: :naive_datetime_usec]
field(:relationship_to_user, :string)
field(:name, :string)
field(:email, :string)
field(:status, :integer)
field(:created_at, :utc_datetime_usec)
field(:updated_at, :utc_datetime_usec)
belongs_to(:user, User)
belongs_to(:buddy, User, foreign_key: :buddy_id)
belongs_to(:course_period, CoursePeriod)
belongs_to(:course, Course)
has_one(:enrollment, Enrollment, on_delete: :nilify_all)
end
def buddyship_status(status) do
case status do
0 -> "awaiting buddy response"
1 -> "Buddy is: "
2 -> "removed"
3 -> "refused invitation"
end
end
def find_or_initialize_changeset(buddyship, params \\ %{}) do
buddyship
|> cast(params, [
:user_id,
:relationship_to_user,
:name,
:email,
:course_period_id,
:course_id,
:created_at,
:updated_at
])
|> validate_relevance(params)
|> validate_required([:course_id, :user_id, :course_period_id, :email])
end
def update(buddyship, params \\ %{}) do
Ecto.Changeset.change(buddyship, params) |> Repo.update()
end
def changeset(buddyship, params \\ %{}) do
buddyship
|> cast(params, [
:user_id,
:buddy_id,
:relationship_to_user,
:name,
:email,
:course_period_id,
:course_id,
:status,
:created_at,
:updated_at
])
|> validate_required([:course_id, :user_id, :buddy_id, :course_period_id])
end
def staled_buddyships_for(user_id) do
Repo.all(
from(
b in __MODULE__,
where: b.user_id == ^user_id,
where: b.status == 0,
where: b.created_at <= ^Timex.shift(DateTime.utc_now(), days: -3)
)
)
end
defp validate_relevance(changeset, params) do
user = Repo.get(User, params["user_id"])
tobebuddy = Repo.one(from(u in User, where: u.email == ^params["email"]))
existing_buddyship =
cond do
is_nil(tobebuddy) ->
Repo.one(
from(
b in __MODULE__,
where: b.user_id == ^params["user_id"],
where: b.course_id == ^params["course_id"],
where: b.email == ^params["email"],
where: b.course_period_id == ^params["course_period_id"]
)
)
!is_nil(tobebuddy) ->
Repo.one(
from(
b in __MODULE__,
where: b.user_id == ^params["user_id"],
where: b.course_id == ^params["course_id"],
where: b.buddy_id == ^tobebuddy.id,
where: b.course_period_id == ^params["course_period_id"]
)
)
end
if !is_nil(existing_buddyship), do: Repo.delete(existing_buddyship)
cond do
user.email != params["email"] && !is_nil(tobebuddy) ->
cast(changeset, %{buddy_id: tobebuddy.id}, [:buddy_id])
user.email != params["email"] && is_nil(tobebuddy) ->
cast(changeset, %{email: params["email"]}, [:email])
user.email == params["email"] ->
add_error(
changeset,
:email,
"You cannot add yourself as a buddy"
)
end
end
end