@@ -32,7 +32,7 @@ const resetPasswordAndDeleteSession = async userId => {
32
32
await Parse . Object . destroyAll ( sessions , { useMasterKey : true } ) ;
33
33
}
34
34
} ;
35
- export async function deleteUser ( userId , adminId ) {
35
+ export async function deleteUser ( userId , adminId , adminTenantId , isOrgAdmin , orgPtr ) {
36
36
const userPointer = { __type : 'Pointer' , className : '_User' , objectId : userId } ;
37
37
let userDetails = {
38
38
UserRole : 'not found' ,
@@ -47,20 +47,29 @@ export async function deleteUser(userId, adminId) {
47
47
const Users = Parse . Object . extend ( 'contracts_Users' ) ;
48
48
const userQuery = new Parse . Query ( Users ) ;
49
49
userQuery . equalTo ( 'UserId' , userPointer ) ;
50
- if ( adminId ) {
50
+ if ( adminTenantId ) {
51
+ userQuery . equalTo ( 'TenantId' , adminTenantId ) ;
52
+ if ( isOrgAdmin && orgPtr ) {
53
+ userQuery . equalTo ( 'OrganizationId' , orgPtr ) ;
54
+ }
55
+ } else if ( adminId ) {
51
56
userQuery . equalTo ( 'CreatedBy' , { __type : 'Pointer' , className : '_User' , objectId : adminId } ) ;
52
57
}
53
58
const userResult = await userQuery . first ( { useMasterKey : true } ) ;
54
59
userDetails = { ...userDetails , UserId : userId } ;
55
60
if ( ! userResult ) {
56
- const errorMessage = 'User not found.' ;
61
+ const errorMessage = isOrgAdmin ? 'Unauthorized.' : 'User not found.' ;
57
62
return { code : 400 , message : errorMessage } ;
58
63
}
59
64
const contractsUserId = userResult . id ;
60
65
const tenantId = userResult . get ( 'TenantId' ) ?. id ;
61
66
const teamIds = userResult . get ( 'TeamIds' ) || [ ] ;
62
67
const organizationId = userResult . get ( 'OrganizationId' ) ?. id ;
63
68
const isAdmin = userResult ?. get ( 'UserRole' ) === 'contracts_Admin' ? true : false ;
69
+ if ( isOrgAdmin && isAdmin ) {
70
+ const errorMessage = 'Unauthorized.' ;
71
+ return { code : 400 , message : errorMessage } ;
72
+ }
64
73
userDetails = {
65
74
...userDetails ,
66
75
UserRole : userResult ?. get ( 'UserRole' ) ,
@@ -267,6 +276,21 @@ export const deleteUserPost = async (req, res) => {
267
276
return res . send ( errorMessage ) ;
268
277
}
269
278
279
+ if ( extUser ?. get ( 'UserRole' ) !== 'contracts_Admin' ) {
280
+ const errorMessage =
281
+ 'This action is not permitted. Kindly contact your administrator to request account deletion.' ;
282
+ return res . send ( errorMessage ) ;
283
+ }
284
+
285
+ const extUsers = new Parse . Query ( 'contracts_Users' ) ;
286
+ extUsers . equalTo ( 'TenantId' , extUser ?. get ( 'TenantId' ) ) ;
287
+ extUsers . notEqualTo ( 'UserRole' , 'contracts_Admin' ) ;
288
+ const isTeamUsers = await extUsers . first ( { useMasterKey : true } ) ;
289
+ if ( isTeamUsers ) {
290
+ const errorMessage = `To delete this account, start by removing all team users associated with it. Once all users are removed, you'll be able to permanently delete the account.` ;
291
+ return res . send ( errorMessage ) ;
292
+ }
293
+
270
294
// Get stored OTP info
271
295
const savedOtp = extUser . get ( 'DeleteOTP' ) || '' ;
272
296
const expiry = extUser . get ( 'DeleteOTPExpiry' ) ;
@@ -352,7 +376,30 @@ export const deleteUserByAdmin = async (req, res) => {
352
376
const errorMessage = 'User not found.' ;
353
377
return res . status ( 400 ) . json ( { message : errorMessage } ) ;
354
378
}
355
- const response = await deleteUser ( userId , adminId ) ;
379
+
380
+ if ( adminId === userId ) {
381
+ return res . status ( 400 ) . json ( { message : 'You cannot delete your own account.' } ) ;
382
+ }
383
+ // 2. ext user details
384
+ const extUserQuery = new Parse . Query ( 'contracts_Users' ) ;
385
+ extUserQuery . equalTo ( 'UserId' , { __type : 'Pointer' , className : '_User' , objectId : adminId } ) ;
386
+ const extUser = await extUserQuery . first ( { useMasterKey : true } ) ;
387
+ if ( ! extUser ) {
388
+ const errorMessage = 'User not found.' ;
389
+ return res . status ( 400 ) . json ( { message : errorMessage } ) ;
390
+ }
391
+ const isAdmin =
392
+ extUser ?. get ( 'UserRole' ) === 'contracts_Admin' ||
393
+ extUser ?. get ( 'UserRole' ) === 'contracts_OrgAdmin'
394
+ ? true
395
+ : false ;
396
+ const isOrgAdmin = extUser ?. get ( 'UserRole' ) === 'contracts_OrgAdmin' ;
397
+ const tenantId = extUser ?. get ( 'TenantId' ) ;
398
+ const orgPtr = isOrgAdmin && extUser ?. get ( 'OrganizationId' ) ;
399
+ if ( ! isAdmin ) {
400
+ return res . status ( 400 ) . json ( { message : 'Unauthorized.' } ) ;
401
+ }
402
+ const response = await deleteUser ( userId , adminId , tenantId , isOrgAdmin , orgPtr ) ;
356
403
const code = response ?. code || 400 ;
357
404
const message = response ?. message || 'An error occurred while deleting your account.' ;
358
405
return res . status ( code ) . json ( { message : message } ) ;
0 commit comments