@@ -32,7 +32,7 @@ const resetPasswordAndDeleteSession = async userId => {
3232 await Parse . Object . destroyAll ( sessions , { useMasterKey : true } ) ;
3333 }
3434} ;
35- export async function deleteUser ( userId , adminId ) {
35+ export async function deleteUser ( userId , adminId , adminTenantId , isOrgAdmin , orgPtr ) {
3636 const userPointer = { __type : 'Pointer' , className : '_User' , objectId : userId } ;
3737 let userDetails = {
3838 UserRole : 'not found' ,
@@ -47,20 +47,29 @@ export async function deleteUser(userId, adminId) {
4747 const Users = Parse . Object . extend ( 'contracts_Users' ) ;
4848 const userQuery = new Parse . Query ( Users ) ;
4949 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 ) {
5156 userQuery . equalTo ( 'CreatedBy' , { __type : 'Pointer' , className : '_User' , objectId : adminId } ) ;
5257 }
5358 const userResult = await userQuery . first ( { useMasterKey : true } ) ;
5459 userDetails = { ...userDetails , UserId : userId } ;
5560 if ( ! userResult ) {
56- const errorMessage = 'User not found.' ;
61+ const errorMessage = isOrgAdmin ? 'Unauthorized.' : 'User not found.' ;
5762 return { code : 400 , message : errorMessage } ;
5863 }
5964 const contractsUserId = userResult . id ;
6065 const tenantId = userResult . get ( 'TenantId' ) ?. id ;
6166 const teamIds = userResult . get ( 'TeamIds' ) || [ ] ;
6267 const organizationId = userResult . get ( 'OrganizationId' ) ?. id ;
6368 const isAdmin = userResult ?. get ( 'UserRole' ) === 'contracts_Admin' ? true : false ;
69+ if ( isOrgAdmin && isAdmin ) {
70+ const errorMessage = 'Unauthorized.' ;
71+ return { code : 400 , message : errorMessage } ;
72+ }
6473 userDetails = {
6574 ...userDetails ,
6675 UserRole : userResult ?. get ( 'UserRole' ) ,
@@ -267,6 +276,21 @@ export const deleteUserPost = async (req, res) => {
267276 return res . send ( errorMessage ) ;
268277 }
269278
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+
270294 // Get stored OTP info
271295 const savedOtp = extUser . get ( 'DeleteOTP' ) || '' ;
272296 const expiry = extUser . get ( 'DeleteOTPExpiry' ) ;
@@ -352,7 +376,30 @@ export const deleteUserByAdmin = async (req, res) => {
352376 const errorMessage = 'User not found.' ;
353377 return res . status ( 400 ) . json ( { message : errorMessage } ) ;
354378 }
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 ) ;
356403 const code = response ?. code || 400 ;
357404 const message = response ?. message || 'An error occurred while deleting your account.' ;
358405 return res . status ( code ) . json ( { message : message } ) ;
0 commit comments