File size: 4,664 Bytes
8da2481 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | defmodule PlausibleWeb.InvitationController do
use PlausibleWeb, :controller
alias Plausible.Teams
plug PlausibleWeb.RequireAccountPlug
plug PlausibleWeb.Plugs.AuthorizeSiteAccess,
[:owner, :admin] when action in [:remove_invitation]
def accept_invitation(conn, %{"invitation_id" => invitation_id} = params) do
current_user = conn.assigns.current_user
team = conn.assigns.current_team
result =
if params["skip_site_members_transfer"] == "true" do
Teams.Invitations.Accept.accept_transfer_no_members(invitation_id, current_user, team)
else
Teams.Invitations.Accept.accept(invitation_id, current_user, team)
end
case result do
{:ok, result} ->
team = result.team
site =
case result do
%{guest_memberships: [guest_membership]} ->
Plausible.Repo.preload(guest_membership, :site).site
%{guest_memberships: []} ->
nil
%{site: site} ->
site
end
if site do
conn
|> put_flash(:success, "You now have access to #{site.domain}")
|> redirect(to: Routes.stats_path(conn, :stats, site.domain, []))
else
conn
|> put_flash(:success, "You now have access to \"#{team.name}\" team")
|> redirect(to: Routes.site_path(conn, :index, __team: team.identifier))
end
{:error, :invitation_not_found} ->
conn
|> put_flash(:error, "Invitation missing or already accepted")
|> redirect(to: "/sites")
{:error, :transfer_to_self} ->
conn
|> put_flash(:error, "The site is already in the current team")
|> redirect(to: "/sites")
{:error, :permission_denied} ->
conn
|> put_flash(:error, "You can't add sites in the current team")
|> redirect(to: "/sites")
{:error, :no_plan} ->
conn
|> put_flash(:error, "No existing subscription")
|> redirect(to: "/sites")
{:error, {:over_plan_limits, limits}} ->
conn
|> put_flash(
:error,
"Plan limits exceeded: #{PlausibleWeb.TextHelpers.pretty_list(limits)}."
)
|> redirect(to: "/sites")
{:error, _} ->
conn
|> put_flash(:error, "Something went wrong, please try again")
|> redirect(to: "/sites")
end
end
def reject_invitation(conn, %{"invitation_id" => invitation_id}) do
case Teams.Invitations.Reject.reject(invitation_id, conn.assigns.current_user) do
{:ok, _invitation} ->
conn
|> put_flash(:success, "You have rejected the invitation")
|> redirect(to: "/sites")
{:error, :invitation_not_found} ->
conn
|> put_flash(:error, "Invitation missing or already accepted")
|> redirect(to: "/sites")
end
end
def remove_invitation(conn, %{"invitation_id" => invitation_id}) do
case Teams.Invitations.RemoveFromSite.remove(invitation_id, conn.assigns.site) do
{:ok, invitation_or_transfer} ->
{site, email} =
case invitation_or_transfer do
%Plausible.Teams.GuestInvitation{} = guest_invitation ->
{guest_invitation.site, guest_invitation.team_invitation.email}
%Plausible.Teams.SiteTransfer{} = site_transfer ->
{site_transfer.site, site_transfer.email}
end
conn
|> put_flash(:success, "You have removed the invitation for #{email}")
|> redirect(to: Routes.site_path(conn, :settings_people, site.domain))
{:error, :invitation_not_found} ->
conn
|> put_flash(:error, "Invitation missing or already removed")
|> redirect(to: Routes.site_path(conn, :settings_people, conn.assigns.site.domain))
end
end
def remove_team_invitation(conn, %{"invitation_id" => invitation_id}) do
%{current_team: team, current_user: current_user} = conn.assigns
case Teams.Invitations.RemoveFromTeam.remove(team, invitation_id, current_user) do
{:ok, invitation} ->
conn
|> put_flash(:success, "You have removed the invitation for #{invitation.email}")
|> redirect(to: Routes.settings_path(conn, :team_general))
{:error, :invitation_not_found} ->
conn
|> put_flash(:error, "Invitation missing or already removed")
|> redirect(to: Routes.settings_path(conn, :team_general))
{:error, :permission_denied} ->
conn
|> put_flash(:error, "You are not allowed to remove invitations")
|> redirect(to: Routes.settings_path(conn, :team_general))
end
end
end
|