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