11'use server' ;
22
3+ import { serverApi } from '@/lib/api-server' ;
34import { db } from '@db' ;
45import { revalidatePath , revalidateTag } from 'next/cache' ;
56import { z } from 'zod' ;
@@ -14,7 +15,7 @@ export const removeEmployeeRoleOrMember = authActionClient
1415 . metadata ( {
1516 name : 'remove-employee-role-or-member' ,
1617 track : {
17- event : 'remove_employee' , // Changed event name
18+ event : 'remove_employee' ,
1819 channel : 'organization' ,
1920 } ,
2021 } )
@@ -37,22 +38,7 @@ export const removeEmployeeRoleOrMember = authActionClient
3738 const { memberId } = parsedInput ;
3839
3940 try {
40- // 1. Permission Check: Ensure current user is admin or owner
41- const currentUserMember = await db . member . findFirst ( {
42- where : {
43- organizationId : organizationId ,
44- userId : currentUserId ,
45- } ,
46- } ) ;
47-
48- if ( ! currentUserMember || ! [ 'admin' , 'owner' ] . includes ( currentUserMember . role ) ) {
49- return {
50- success : false ,
51- error : 'Permission denied: Only admins or owners can remove employees.' ,
52- } ;
53- }
54-
55- // 2. Fetch Target Member
41+ // Fetch target member to determine action
5642 const targetMember = await db . member . findFirst ( {
5743 where : {
5844 id : memberId ,
@@ -67,56 +53,45 @@ export const removeEmployeeRoleOrMember = authActionClient
6753 } ;
6854 }
6955
70- // 3. Check if target has 'employee' or 'contractor' role
71- const roles = targetMember . role . split ( ',' ) . filter ( Boolean ) ; // Handle empty strings/commas
56+ const roles = targetMember . role . split ( ',' ) . filter ( Boolean ) ;
7257 if ( ! roles . includes ( 'employee' ) && ! roles . includes ( 'contractor' ) ) {
7358 return {
7459 success : false ,
7560 error : 'Target member does not have the employee or contractor role.' ,
7661 } ;
7762 }
7863
79- // 4. Logic: Remove role or delete member
8064 if ( roles . length === 1 && ( roles [ 0 ] === 'employee' || roles [ 0 ] === 'contractor' ) ) {
81- // Only has employee or contractor role - delete member fully
65+ // Only has employee/contractor role — deactivate via API
66+ // The API handles session cleanup, assignment clearing, and notifications
67+ const result = await serverApi . delete ( `/v1/people/${ memberId } ` ) ;
8268
83- // Cannot remove owner (shouldn't happen if only role is employee, but safety check)
84- if ( targetMember . role === 'owner' ) {
69+ if ( result . error ) {
8570 return {
8671 success : false ,
87- error : 'Cannot remove the organization owner.' ,
72+ error : result . error ,
8873 } ;
8974 }
90- // Cannot remove self
91- if ( targetMember . userId === currentUserId ) {
92- return {
93- success : false ,
94- error : 'You cannot remove yourself.' ,
95- } ;
96- }
97-
98- await db . $transaction ( [
99- db . member . delete ( { where : { id : memberId } } ) ,
100- db . session . deleteMany ( {
101- where : { userId : targetMember . userId } ,
102- } ) ,
103- ] ) ;
10475
105- // Revalidate
10676 revalidatePath ( `/${ organizationId } /people/all` ) ;
10777 revalidateTag ( `user_${ currentUserId } ` , 'max' ) ;
10878
10979 return { success : true , data : { removed : true } } ;
11080 } else {
111- // Has other roles - just remove ' employee' role
81+ // Has other roles — just remove the employee role via API
11282 const updatedRoles = roles . filter ( ( role ) => role !== 'employee' ) . join ( ',' ) ;
11383
114- await db . member . update ( {
115- where : { id : memberId } ,
116- data : { role : updatedRoles } ,
84+ const result = await serverApi . patch ( `/v1/people/${ memberId } ` , {
85+ role : updatedRoles ,
11786 } ) ;
11887
119- // Revalidate
88+ if ( result . error ) {
89+ return {
90+ success : false ,
91+ error : result . error ,
92+ } ;
93+ }
94+
12095 revalidatePath ( `/${ organizationId } /people/all` ) ;
12196 revalidateTag ( `user_${ currentUserId } ` , 'max' ) ;
12297
0 commit comments