Skip to content

Commit f34e6f5

Browse files
committed
feat: implement authentication middleware for route protection
1 parent 57d829a commit f34e6f5

File tree

9 files changed

+42
-34
lines changed

9 files changed

+42
-34
lines changed

src/app.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import documentRoutes from "./routes/document.routes";
1010
import projectMemberRoutes from "./routes/project-member.routes";
1111
import documentPermissions from "./routes/document-permission.routes";
1212

13-
import { auth } from "./middleware/auth.middleware";
14-
1513
const app = express();
1614

1715
app.use(express.json());
@@ -29,8 +27,6 @@ app.get("/", (req, res) => {
2927
res.send("Welcome to the API");
3028
});
3129

32-
app.use(auth);
33-
3430
app.use("/api/users", userRoutes);
3531
app.use("/api/projects", projectRoutes);
3632
app.use("/api/document-categories", documentCategoryRoutes);

src/controllers/user.controller.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as generator from "../utils/generator";
44
import { nodeEnv } from "../config";
55
import prisma from "../db/prisma";
66
import * as response from "../utils/response";
7+
import { ZodError } from "zod";
78

89
export const register = async (
910
req: Request,
@@ -65,21 +66,13 @@ export const login = async (
6566

6667
const token = generator.generateJwt(user.email, user.id);
6768

68-
res.cookie("token", token, {
69-
httpOnly: true,
70-
secure: nodeEnv === "production",
71-
sameSite: "lax",
72-
path: "/",
73-
expires: new Date(Date.now() + 1000 * 60 * 60 * 24),
74-
});
75-
7669
return response.successResponse(res, "Logged in successfully.", {
77-
id: user.id,
78-
email: user.email,
79-
fullName: user.fullName,
70+
token,
8071
});
8172
} catch (error) {
82-
console.error(error);
73+
if (error instanceof ZodError) {
74+
return response.zodErrorResponse(res, error);
75+
}
8376
return response.errorResponse(res, "Internal server error.");
8477
}
8578
};

src/middleware/auth.middleware.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,22 @@ import { Request, Response, NextFunction } from "express";
33

44
export const auth = (req: Request, res: Response, next: NextFunction): void => {
55
try {
6-
const token = req.cookies?.token;
6+
const authHeader = req.headers.authorization;
7+
if (!authHeader) {
8+
res.status(401).json({ error: "Authentication token missing" });
9+
return;
10+
}
11+
12+
const token = authHeader.split(" ")[1];
713
if (!token) {
814
res.status(401).json({ error: "Authentication token missing" });
915
return;
1016
}
17+
1118
const decoded = jwt.verify(token, process.env.JWT_SECRET as string);
19+
1220
(req as JwtPayload).user = decoded;
21+
1322
next();
1423
} catch (error) {
1524
res.status(401).json({ error: "Invalid or expired token" });

src/routes/document-category.routes.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,32 @@
11
import { Router } from "express";
22
import * as documentCategoryController from "../controllers/document-category.controller";
3+
import { auth } from "../middleware/auth.middleware";
34

45
const router = Router();
56

67
router.post(
78
"/document-categories",
9+
auth,
810
documentCategoryController.createDocumentCategory
911
);
1012
router.get(
1113
"/document-categories/project/:projectId",
14+
auth,
1215
documentCategoryController.getDocumentCategoriesByProject
1316
);
1417
router.get(
1518
"/document-categories/:id",
19+
auth,
1620
documentCategoryController.getDocumentCategoryById
1721
);
1822
router.put(
1923
"/document-categories/:id",
24+
auth,
2025
documentCategoryController.updateDocumentCategory
2126
);
2227
router.delete(
2328
"/document-categories/:id",
29+
auth,
2430
documentCategoryController.deleteDocumentCategory
2531
);
2632

src/routes/document-permission.routes.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import {
44
getDocumentPermissions,
55
removeDocumentPermission,
66
} from "../controllers/document-permission.controller";
7+
import { auth } from "../middleware/auth.middleware";
78

89
const router = express.Router();
910

10-
router.post("/document-permissions", addDocumentPermission);
11-
router.get("/document-permissions/:documentId", getDocumentPermissions);
11+
router.post("/document-permissions", auth, addDocumentPermission);
12+
router.get("/document-permissions/:documentId", auth, getDocumentPermissions);
1213
router.delete(
1314
"/document-permissions/:documentId/:userId",
15+
auth,
1416
removeDocumentPermission
1517
);
1618

src/routes/document.routes.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ import {
66
updateDocument,
77
deleteDocument,
88
} from "../controllers/document.controller";
9+
import { auth } from "../middleware/auth.middleware";
910

1011
const router = express.Router();
1112

12-
router.post("/documents", createDocument);
13-
router.get("/documents/category/:categoryId", getDocumentsByCategory);
14-
router.get("/documents/:id", getDocumentById);
15-
router.put("/documents/:id", updateDocument);
16-
router.delete("/documents/:id", deleteDocument);
13+
router.post("/documents", auth, createDocument);
14+
router.get("/documents/category/:categoryId", auth, getDocumentsByCategory);
15+
router.get("/documents/:id", auth, getDocumentById);
16+
router.put("/documents/:id", auth, updateDocument);
17+
router.delete("/documents/:id", auth, deleteDocument);
1718

1819
export default router;

src/routes/project-member.routes.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import {
44
getProjectMembers,
55
removeProjectMember,
66
} from "../controllers/project-member.controller";
7+
import { auth } from "../middleware/auth.middleware";
78

89
const router = express.Router();
910

10-
router.post("/project-members", addProjectMember);
11-
router.get("/project-members/:projectId", getProjectMembers);
12-
router.delete("/project-members/:projectId/:userId", removeProjectMember);
11+
router.post("/project-members", auth, addProjectMember);
12+
router.get("/project-members/:projectId", auth, getProjectMembers);
13+
router.delete("/project-members/:projectId/:userId", auth, removeProjectMember);
1314

1415
export default router;

src/routes/project.routes.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ import {
66
updateProject,
77
deleteProject,
88
} from "../controllers/project.controller";
9+
import { auth } from "../middleware/auth.middleware";
910

1011
const router = Router();
1112

12-
router.post("/", createProject);
13-
router.get("/", getProjects);
14-
router.get("/:id", getProjectById);
15-
router.put("/:id", updateProject);
16-
router.delete("/:id", deleteProject);
13+
router.post("/", auth, createProject);
14+
router.get("/", auth, getProjects);
15+
router.get("/:id", auth, getProjectById);
16+
router.put("/:id", auth, updateProject);
17+
router.delete("/:id", auth, deleteProject);
1718

1819
export default router;

src/routes/user.routes.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,4 @@ router.post("/register", uc.register);
99
router.post("/me", uc.getMe);
1010
router.post("/logout", auth, uc.logout);
1111

12-
13-
export default router;
12+
export default router;

0 commit comments

Comments
 (0)