diff --git a/lib/atomic/accounts.ex b/lib/atomic/accounts.ex index 6ce244d5e..4cb1af4b2 100644 --- a/lib/atomic/accounts.ex +++ b/lib/atomic/accounts.ex @@ -74,6 +74,7 @@ defmodule Atomic.Accounts do {:error, %Ecto.Changeset{}} """ + def register_user(attrs) do %User{} |> User.registration_changeset(attrs) diff --git a/lib/atomic/accounts/collaborator_department.ex b/lib/atomic/accounts/collaborator_department.ex new file mode 100644 index 000000000..5acdb542a --- /dev/null +++ b/lib/atomic/accounts/collaborator_department.ex @@ -0,0 +1,29 @@ +defmodule Atomic.Accounts.CollaboratorDepartment do + @moduledoc """ + A relation representing a collaborator who belongs to a department + """ + use Atomic.Schema + + alias Atomic.Departments.Department + alias Atomic.Accounts.User + + @required_fields ~w(collaborator_id department_id)a + + schema "collaborator_departments" do + belongs_to :collaborator, User + belongs_to :department, Department + timestamps() + end + + def changeset(collaborator_departments, attrs) do + collaborator_departments + |> cast(attrs, @required_fields) + |> validate_required(@required_fields) + end + + def create_changeset(collaborator_departments, attrs) do + collaborator_departments + |> cast(attrs, @required_fields) + |> validate_required(@required_fields) + end +end diff --git a/lib/atomic/accounts/user.ex b/lib/atomic/accounts/user.ex index c86714ba5..7cfd22751 100644 --- a/lib/atomic/accounts/user.ex +++ b/lib/atomic/accounts/user.ex @@ -4,6 +4,8 @@ defmodule Atomic.Accounts.User do """ use Atomic.Schema + alias Atomic.Accounts.CollaboratorDepartment + alias Atomic.Accounts.Course alias Atomic.Activities.Enrollment alias Atomic.Organizations.{Membership, Organization} @@ -24,8 +26,8 @@ defmodule Atomic.Accounts.User do belongs_to :course, Course field :profile_picture, ProfilePicture.Type field :role, Ecto.Enum, values: @roles - has_many :enrollments, Enrollment + many_to_many :collaborators, User, join_through: CollaboratorDepartment, on_replace: :delete many_to_many :organizations, Organization, join_through: Membership diff --git a/lib/atomic/departments/department.ex b/lib/atomic/departments/department.ex index 8b9c4e01f..421a14900 100644 --- a/lib/atomic/departments/department.ex +++ b/lib/atomic/departments/department.ex @@ -3,7 +3,9 @@ defmodule Atomic.Departments.Department do A department of an organization """ use Atomic.Schema + alias Atomic.Accounts.CollaboratorDepartment alias Atomic.Organizations.Organization + alias Atomic.Accounts.User alias Atomic.Activities.{Activity, ActivityDepartment} @required_fields ~w(name organization_id)a @@ -12,7 +14,7 @@ defmodule Atomic.Departments.Department do schema "departments" do field :name, :string - + many_to_many :collaborators, User, join_through: CollaboratorDepartment many_to_many :activities, Activity, join_through: ActivityDepartment, on_replace: :delete belongs_to :organization, Organization, on_replace: :delete_if_exists diff --git a/priv/repo/migrations/20230114142351_create_collaborator_departments.exs b/priv/repo/migrations/20230114142351_create_collaborator_departments.exs new file mode 100644 index 000000000..91809529f --- /dev/null +++ b/priv/repo/migrations/20230114142351_create_collaborator_departments.exs @@ -0,0 +1,14 @@ +defmodule Atomic.Repo.Migrations.CreateCollaboratorDepartments do + use Ecto.Migration + + def change do + create table(:collaborator_departments, primary_key: false) do + add :id, :binary_id, primary_key: true + + add :collaborator_id, references(:users, on_delete: :nothing, type: :binary_id) + add :department_id, references(:departments, on_delete: :nothing, type: :binary_id) + + timestamps() + end + end +end diff --git a/priv/repo/seeds/accounts.exs b/priv/repo/seeds/accounts.exs index a73986b84..1c980ae6b 100644 --- a/priv/repo/seeds/accounts.exs +++ b/priv/repo/seeds/accounts.exs @@ -1,6 +1,7 @@ defmodule Atomic.Repo.Seeds.Accounts do alias Atomic.Accounts alias Atomic.Accounts.{Course, User} + alias Atomic.Accounts.User alias Atomic.Repo def run do @@ -163,7 +164,7 @@ defmodule Atomic.Repo.Seeds.Accounts do "course_id" => Enum.random(courses).id } - case Accounts.register_user(user) do + case insert_user(user) do {:error, changeset} -> Mix.shell().error(Kernel.inspect(changeset.errors))