7
7
use App \Enums \Role ;
8
8
use App \Events \MemberMadeToPlaceholder ;
9
9
use App \Exceptions \Api \CanNotRemoveOwnerFromOrganization ;
10
+ use App \Exceptions \Api \ChangingRoleOfPlaceholderIsNotAllowed ;
10
11
use App \Exceptions \Api \ChangingRoleToPlaceholderIsNotAllowed ;
11
12
use App \Exceptions \Api \EntityStillInUseApiException ;
12
13
use App \Exceptions \Api \OnlyOwnerCanChangeOwnership ;
14
+ use App \Exceptions \Api \OnlyPlaceholdersCanBeMergedIntoAnotherMember ;
13
15
use App \Exceptions \Api \OrganizationNeedsAtLeastOneOwner ;
16
+ use App \Exceptions \Api \ThisPlaceholderCanNotBeInvitedUseTheMergeToolInsteadException ;
17
+ use App \Exceptions \Api \UserIsAlreadyMemberOfOrganizationApiException ;
14
18
use App \Exceptions \Api \UserNotPlaceholderApiException ;
15
19
use App \Http \Requests \V1 \Member \MemberIndexRequest ;
20
+ use App \Http \Requests \V1 \Member \MemberMergeIntoRequest ;
16
21
use App \Http \Requests \V1 \Member \MemberUpdateRequest ;
17
22
use App \Http \Resources \V1 \Member \MemberCollection ;
18
23
use App \Http \Resources \V1 \Member \MemberResource ;
21
26
use App \Service \BillableRateService ;
22
27
use App \Service \InvitationService ;
23
28
use App \Service \MemberService ;
29
+ use App \Service \UserService ;
24
30
use Illuminate \Auth \Access \AuthorizationException ;
25
31
use Illuminate \Http \JsonResponse ;
26
32
use Illuminate \Http \Resources \Json \JsonResource ;
33
+ use Illuminate \Support \Facades \DB ;
34
+ use Illuminate \Support \Str ;
27
35
28
36
class MemberController extends Controller
29
37
{
@@ -63,6 +71,7 @@ public function index(Organization $organization, MemberIndexRequest $request):
63
71
* @throws OrganizationNeedsAtLeastOneOwner
64
72
* @throws OnlyOwnerCanChangeOwnership
65
73
* @throws ChangingRoleToPlaceholderIsNotAllowed
74
+ * @throws ChangingRoleOfPlaceholderIsNotAllowed
66
75
*
67
76
* @operationId updateMember
68
77
*/
@@ -105,7 +114,7 @@ public function destroy(Organization $organization, Member $member, MemberServic
105
114
/**
106
115
* Make a member a placeholder member
107
116
*
108
- * @throws AuthorizationException|CanNotRemoveOwnerFromOrganization
117
+ * @throws AuthorizationException|CanNotRemoveOwnerFromOrganization|ChangingRoleOfPlaceholderIsNotAllowed
109
118
*/
110
119
public function makePlaceholder (Organization $ organization , Member $ member , MemberService $ memberService ): JsonResponse
111
120
{
@@ -114,6 +123,9 @@ public function makePlaceholder(Organization $organization, Member $member, Memb
114
123
if ($ member ->role === Role::Owner->value ) {
115
124
throw new CanNotRemoveOwnerFromOrganization ;
116
125
}
126
+ if ($ member ->role === Role::Placeholder->value ) {
127
+ throw new ChangingRoleOfPlaceholderIsNotAllowed ;
128
+ }
117
129
118
130
$ memberService ->makeMemberToPlaceholder ($ member );
119
131
@@ -122,10 +134,37 @@ public function makePlaceholder(Organization $organization, Member $member, Memb
122
134
return response ()->json (null , 204 );
123
135
}
124
136
137
+ /**
138
+ * @throws AuthorizationException
139
+ * @throws OnlyPlaceholdersCanBeMergedIntoAnotherMember
140
+ * @throws \Throwable
141
+ */
142
+ public function mergeInto (Organization $ organization , Member $ member , MemberMergeIntoRequest $ request ): JsonResponse
143
+ {
144
+ $ this ->checkPermission ($ organization , 'members:merge-into ' , $ member );
145
+
146
+ $ user = $ member ->user ;
147
+ if ($ member ->role !== Role::Placeholder->value || ! $ user ->is_placeholder ) {
148
+ throw new OnlyPlaceholdersCanBeMergedIntoAnotherMember ;
149
+ }
150
+ $ memberTo = Member::findOrFail ($ request ->getMemberId ());
151
+
152
+ DB ::transaction (function () use ($ organization , $ member , $ user , $ memberTo ): void {
153
+ app (UserService::class)->assignOrganizationEntitiesToDifferentMember ($ organization , $ user , $ memberTo ->user , $ memberTo );
154
+ $ member ->delete ();
155
+ $ user ->delete ();
156
+ });
157
+
158
+ return response ()->json (null , 204 );
159
+ }
160
+
125
161
/**
126
162
* Invite a placeholder member to become a real member of the organization
127
163
*
128
- * @throws AuthorizationException|UserNotPlaceholderApiException
164
+ * @throws AuthorizationException
165
+ * @throws UserNotPlaceholderApiException
166
+ * @throws UserIsAlreadyMemberOfOrganizationApiException
167
+ * @throws ThisPlaceholderCanNotBeInvitedUseTheMergeToolInsteadException
129
168
*
130
169
* @operationId invitePlaceholder
131
170
*/
@@ -138,6 +177,10 @@ public function invitePlaceholder(Organization $organization, Member $member, In
138
177
throw new UserNotPlaceholderApiException ;
139
178
}
140
179
180
+ if (Str::endsWith ($ user ->email , '@solidtime-import.test ' )) {
181
+ throw new ThisPlaceholderCanNotBeInvitedUseTheMergeToolInsteadException ;
182
+ }
183
+
141
184
$ invitationService ->inviteUser ($ organization , $ user ->email , Role::Employee);
142
185
143
186
return response ()->json (null , 204 );
0 commit comments