@@ -23,43 +23,36 @@ defmodule Plausible.Site.Memberships.AcceptInvitation do
2323
2424 require Logger
2525
26- @ spec transfer_ownership ( Site . t ( ) , Auth.User . t ( ) ) ::
27- { :ok , Site.Membership . t ( ) }
28- | { :error ,
29- Billing.Quota.Limits . over_limits_error ( )
30- | Ecto.Changeset . t ( )
31- | :transfer_to_self
32- | :no_plan }
33- def transfer_ownership ( site , user ) do
34- site = Repo . preload ( site , :owner )
35-
36- with :ok <- Invitations . ensure_transfer_valid ( site , user , :owner ) ,
37- :ok <- Invitations . ensure_can_take_ownership ( site , user ) do
38- membership = get_or_create_owner_membership ( site , user )
39-
40- multi = add_and_transfer_ownership ( site , membership , user )
41-
42- case Repo . transaction ( multi ) do
43- { :ok , changes } ->
44- Plausible.Teams.Invitations . transfer_site_sync ( site , user )
45-
46- membership = Repo . preload ( changes . membership , [ :site , :user ] )
47-
48- { :ok , membership }
49-
50- { :error , _operation , error , _changes } ->
51- { :error , error }
26+ @ type transfer_error ( ) ::
27+ Billing.Quota.Limits . over_limits_error ( )
28+ | Ecto.Changeset . t ( )
29+ | :transfer_to_self
30+ | :no_plan
31+
32+ @ type accept_error ( ) ::
33+ :invitation_not_found
34+ | Billing.Quota.Limits . over_limits_error ( )
35+ | Ecto.Changeset . t ( )
36+ | :no_plan
37+
38+ @ spec bulk_transfer_ownership_direct ( Auth.User . t ( ) , [ Site . t ( ) ] , Auth.User . t ( ) ) ::
39+ { :ok , [ Site.Membership . t ( ) ] } | { :error , transfer_error ( ) }
40+ def bulk_transfer_ownership_direct ( current_user , sites , new_owner ) do
41+ Repo . transaction ( fn ->
42+ for site <- sites do
43+ case transfer_ownership ( current_user , site , new_owner ) do
44+ { :ok , membership } ->
45+ membership
46+
47+ { :error , error } ->
48+ Repo . rollback ( error )
49+ end
5250 end
53- end
51+ end )
5452 end
5553
5654 @ spec accept_invitation ( String . t ( ) , Auth.User . t ( ) ) ::
57- { :ok , Site.Membership . t ( ) }
58- | { :error ,
59- :invitation_not_found
60- | Billing.Quota.Limits . over_limits_error ( )
61- | Ecto.Changeset . t ( )
62- | :no_plan }
55+ { :ok , Site.Membership . t ( ) } | { :error , accept_error ( ) }
6356 def accept_invitation ( invitation_id , user ) do
6457 with { :ok , invitation } <- Invitations . find_for_user ( invitation_id , user ) do
6558 if invitation . role == :owner do
@@ -70,11 +63,45 @@ defmodule Plausible.Site.Memberships.AcceptInvitation do
7063 end
7164 end
7265
66+ defp transfer_ownership ( current_user , site , new_owner ) do
67+ with :ok <-
68+ Plausible.Teams.Adapter.Read.Invitations . ensure_transfer_valid (
69+ current_user ,
70+ site ,
71+ new_owner ,
72+ :owner
73+ ) ,
74+ :ok <- Plausible.Teams.Adapter.Read.Ownership . ensure_can_take_ownership ( site , new_owner ) do
75+ membership = get_or_create_owner_membership ( site , new_owner )
76+
77+ multi = add_and_transfer_ownership ( site , membership , new_owner )
78+
79+ case Repo . transaction ( multi ) do
80+ { :ok , changes } ->
81+ Plausible.Teams.Invitations . transfer_site_sync ( site , new_owner )
82+
83+ membership = Repo . preload ( changes . membership , [ :site , :user ] )
84+
85+ { :ok , membership }
86+
87+ { :error , _operation , error , _changes } ->
88+ { :error , error }
89+ end
90+ end
91+ end
92+
7393 defp do_accept_ownership_transfer ( invitation , user ) do
7494 membership = get_or_create_membership ( invitation , user )
75- site = Repo . preload ( invitation . site , :owner )
76-
77- with :ok <- Invitations . ensure_can_take_ownership ( site , user ) do
95+ site = invitation . site
96+
97+ with :ok <-
98+ Plausible.Teams.Adapter.Read.Invitations . ensure_transfer_valid (
99+ user ,
100+ site ,
101+ user ,
102+ :owner
103+ ) ,
104+ :ok <- Plausible.Teams.Adapter.Read.Ownership . ensure_can_take_ownership ( site , user ) do
78105 site
79106 |> add_and_transfer_ownership ( membership , user )
80107 |> Multi . delete ( :invitation , invitation )
0 commit comments