Skip to content

Instantly share code, notes, and snippets.

@snewcomer
Created April 30, 2019 04:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save snewcomer/4b4d05e23282726173447eae69a564dc to your computer and use it in GitHub Desktop.
Save snewcomer/4b4d05e23282726173447eae69a564dc to your computer and use it in GitHub Desktop.
project-user-m2m
def join_project(%Project{} = project, %User{} = me) do
project = Repo.preload(project, :users)
users =
project.users ++ [me]
|> Enum.map(&Ecto.Changeset.change/1)
event
|> change_project()
|> put_assoc(:users, users)
|> Repo.update()
end
def leave_project(%Project{} = project, %User{} = me) do
project = Repo.preload(project, :users)
Multi.new()
|> Multi.run(:remove_m2m, fn _, _ ->
case Repo.get_by(ProjectUser, project_id: project.id, user_id: me.id) do
%ProjectUser{} = pu -> Repo.delete(pu)
nil -> nil
end
{:ok, nil}
end)
|> Multi.run(:update_users, fn _, _ ->
users =
project.users -- [me]
|> Enum.map(&Ecto.Changeset.change/1)
{:ok, users}
end)
|> Multi.run(:update_project, fn _, %{update_users: users} ->
project
|> change_project()
|> put_assoc(:users, users)
|> Repo.update()
end)
|> Repo.transaction()
|> case do
{:ok, %{update_project: project}} -> {:ok, project}
{:error, :update_project, changeset, _} -> {:error, changeset}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment