Skip to content

Commit 4439aef

Browse files
committed
feat: add project member management with CRUD operations
1 parent 2bbaafb commit 4439aef

File tree

3 files changed

+133
-0
lines changed

3 files changed

+133
-0
lines changed

src/app.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import projectRoutes from "./routes/project.routes";
77
import userRoutes from "./routes/user.routes";
88
import documentCategoryRoutes from "./routes/document-category.routes";
99
import documentRoutes from "./routes/document.routes";
10+
import projectMemberRoutes from "./routes/project-member.routes";
11+
1012
import { auth } from "./middleware/auth.middleware";
1113

1214
const app = express();
@@ -22,11 +24,16 @@ app.use(
2224
})
2325
);
2426

27+
app.get("/", (req, res) => {
28+
res.send("Welcome to the API");
29+
});
30+
2531
app.use(auth);
2632

2733
app.use("/api/users", userRoutes);
2834
app.use("/api/projects", projectRoutes);
2935
app.use("/api/document-categories", documentCategoryRoutes);
3036
app.use("/api/documents", documentRoutes);
37+
app.use("/api/project-members", projectMemberRoutes);
3138

3239
export default app;
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import { Request, Response, NextFunction } from "express";
2+
import prisma from "../db/prisma";
3+
import * as response from "../utils/response";
4+
5+
export const addProjectMember = async (
6+
req: Request,
7+
res: Response,
8+
next: NextFunction
9+
): Promise<void> => {
10+
try {
11+
const { userId, projectId, roleId } = req.body;
12+
13+
const existingMember = await prisma.projectMember.findUnique({
14+
where: {
15+
userId_projectId: {
16+
userId,
17+
projectId,
18+
},
19+
},
20+
});
21+
22+
if (existingMember) {
23+
return response.errorResponse(
24+
res,
25+
"User is already a member of this project."
26+
);
27+
}
28+
29+
const projectMember = await prisma.projectMember.create({
30+
data: {
31+
userId,
32+
projectId,
33+
roleId,
34+
},
35+
});
36+
37+
return response.successResponse(res, "Project member added successfully.", {
38+
projectMember,
39+
});
40+
} catch (error) {
41+
console.error(error);
42+
response.errorResponse(res, "Internal server error.");
43+
}
44+
};
45+
46+
export const getProjectMembers = async (
47+
req: Request,
48+
res: Response,
49+
next: NextFunction
50+
): Promise<void> => {
51+
try {
52+
const { projectId } = req.params;
53+
54+
const members = await prisma.projectMember.findMany({
55+
where: { projectId },
56+
include: {
57+
user: true,
58+
role: true,
59+
},
60+
});
61+
62+
if (members.length === 0) {
63+
return response.errorResponse(res, "No members found for this project.");
64+
}
65+
66+
return response.successResponse(
67+
res,
68+
"Project members fetched successfully.",
69+
{ members }
70+
);
71+
} catch (error) {
72+
console.error(error);
73+
response.errorResponse(res, "Internal server error.");
74+
}
75+
};
76+
77+
export const removeProjectMember = async (
78+
req: Request,
79+
res: Response,
80+
next: NextFunction
81+
): Promise<void> => {
82+
try {
83+
const { userId, projectId } = req.params;
84+
85+
const projectMember = await prisma.projectMember.findUnique({
86+
where: {
87+
userId_projectId: {
88+
userId,
89+
projectId,
90+
},
91+
},
92+
});
93+
94+
if (!projectMember) {
95+
return response.errorResponse(res, "Project member not found.");
96+
}
97+
98+
await prisma.projectMember.delete({
99+
where: {
100+
id: projectMember.id,
101+
},
102+
});
103+
104+
return response.successResponse(
105+
res,
106+
"Project member removed successfully."
107+
);
108+
} catch (error) {
109+
console.error(error);
110+
response.errorResponse(res, "Internal server error.");
111+
}
112+
};
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import express from "express";
2+
import {
3+
addProjectMember,
4+
getProjectMembers,
5+
removeProjectMember,
6+
} from "../controllers/project-member.controller";
7+
8+
const router = express.Router();
9+
10+
router.post("/project-members", addProjectMember);
11+
router.get("/project-members/:projectId", getProjectMembers);
12+
router.delete("/project-members/:projectId/:userId", removeProjectMember);
13+
14+
export default router;

0 commit comments

Comments
 (0)