11import { ProjectRole } from "@prisma/client" ;
2- import { getCookieUser } from "@src/lib/session" ;
3- import { ApiContext , apiHandler } from "@src/lib/utils/api-handler" ;
2+ import { apiHandler , AuthApiContext } from "@src/lib/utils/api-handler" ;
43import {
54 ForbiddenError ,
65 BodyFieldError ,
76 ProjectNotFoundError ,
87 Success ,
9- UnauthorizedError ,
108 SuccessNoContent ,
119 NotFoundError ,
1210 validate ,
@@ -32,15 +30,9 @@ const QuerySchema = z.object({
3230 *
3331 * Returns a project member given its userId and associated projectId
3432 */
35- async function getProjectMember ( req : NextRequest , { routeParams } : ApiContext ) {
36- // We query the user role for this poject, throw 404 in case it doesn't belong to it
37- const cookie = await getCookieUser ( ) ;
38- if ( ! cookie || ! cookie . id ) {
39- throw new UnauthorizedError ( ) ;
40- }
41-
33+ async function getProjectMember ( req : NextRequest , { routeParams, user } : AuthApiContext ) {
4234 const { projectId } = validate ( QuerySchema , routeParams ) ;
43- const member = await ProjectService . getMembership ( projectId , cookie . id ) ;
35+ const member = await ProjectService . getMembership ( projectId , user . id ) ;
4436 if ( ! member ) {
4537 throw new ProjectNotFoundError ( ) ;
4638 }
@@ -53,23 +45,18 @@ async function getProjectMember(req: NextRequest, { routeParams }: ApiContext) {
5345 *
5446 * Updates a project member role
5547 */
56- async function updateProjectMemberRole ( req : NextRequest , { routeParams } : ApiContext ) {
57- const cookie = await getCookieUser ( ) ;
58- if ( ! cookie || ! cookie . id ) {
59- throw new UnauthorizedError ( ) ;
60- }
61-
48+ async function updateProjectMemberRole ( req : NextRequest , { routeParams, user } : AuthApiContext ) {
6249 const body = await req . json ( ) ;
6350 const { role } = validate ( UpdateRoleSchema , body ) ;
6451 const { userId : userToUpdateId , projectId } = validate ( QuerySchema , routeParams ) ;
6552
66- const isSelf = cookie . id === userToUpdateId ;
53+ const isSelf = user . id === userToUpdateId ;
6754 if ( isSelf ) throw new ForbiddenError ( "You cannot update your own role" ) ;
6855
6956 if ( ! Roles . isValid ( role ) ) throw new BodyFieldError ( "Unknown role" ) ;
7057 const newRole = role as ProjectRole ;
7158
72- const member = await ProjectService . getMembership ( projectId , cookie . id ) ;
59+ const member = await ProjectService . getMembership ( projectId , user . id ) ;
7360 if ( ! member ) {
7461 throw new ProjectNotFoundError ( ) ;
7562 }
@@ -86,7 +73,10 @@ async function updateProjectMemberRole(req: NextRequest, { routeParams }: ApiCon
8673 throw new ForbiddenError ( "You cannot assign the same role to another user" ) ;
8774 }
8875
89- if ( ! Roles . hasRoleOrGreater ( member . role , newRole ) || ! Roles . hasRoleOrGreater ( member . role , memberToUpdate . role ) ) {
76+ if (
77+ ! Roles . hasRoleOrGreater ( member . role , newRole ) ||
78+ ! Roles . hasRoleOrGreater ( member . role , memberToUpdate . role )
79+ ) {
9080 throw new ForbiddenError ( "User does not have sufficient permissions" ) ;
9181 }
9282
@@ -99,27 +89,19 @@ async function updateProjectMemberRole(req: NextRequest, { routeParams }: ApiCon
9989 *
10090 * Removes a member from a project. A user can leave the project itself.
10191 */
102- async function deleteProjectMember ( req : NextRequest , { routeParams } : ApiContext ) {
103- const cookie = await getCookieUser ( ) ;
104- if ( ! cookie || ! cookie . id ) {
105- throw new UnauthorizedError ( ) ;
106- }
107-
92+ async function deleteProjectMember ( req : NextRequest , { routeParams, user } : AuthApiContext ) {
10893 const { userId : userToDelete , projectId } = validate ( QuerySchema , routeParams ) ;
109- const member = await ProjectService . getMembership ( projectId , cookie . id ) ;
94+ const member = await ProjectService . getMembership ( projectId , user . id ) ;
11095 if ( ! member ) {
11196 throw new NotFoundError ( ) ;
11297 }
11398
114- const isSelf = cookie . id === userToDelete ;
99+ const isSelf = user . id === userToDelete ;
115100 if ( isSelf ) {
116101 if ( member . role !== ProjectRole . OWNER ) {
117- // No need to check roles, any non-owner member can leave the project on its own
118102 await ProjectService . deleteProjectMember ( projectId , userToDelete ) ;
119103 return Success ( { redirectUrl : "/projects" } ) ;
120104 } else {
121- // An owner cannot leave its project as a collaborator
122- // He either needs to transfer ownership or delete project
123105 throw new ForbiddenError ( "Owner cannot leave project" ) ;
124106 }
125107 }
0 commit comments