add tags controller and routes

This commit is contained in:
Alex Holliday committed 2026-05-19 11:15:42 -07:00
1 parent b1871b31a5
commit 451c752170
2 files changed
+126

No files matched your search

+98
View File
@@ -0,0 +1,98 @@
import { Request, Response, NextFunction } from "express";
import { ITagsService } from "@/service/index.js";
import { requireTeamId } from "./controllerUtils.js";
import {
createTagBodyValidation,
editTagBodyValidation,
getTagByIdParamValidation,
editTagParamValidation,
deleteTagParamValidation,
} from "@/validation/index.js";
export interface ITagsController {
createTag: (req: Request, res: Response, next: NextFunction) => Promise<Response | void>;
getTagById: (req: Request, res: Response, next: NextFunction) => Promise<Response | void>;
getTagsByTeamId: (req: Request, res: Response, next: NextFunction) => Promise<Response | void>;
editTag: (req: Request, res: Response, next: NextFunction) => Promise<Response | void>;
deleteTag: (req: Request, res: Response, next: NextFunction) => Promise<Response | void>;
}
class TagsController implements ITagsController {
constructor(private tagsService: ITagsService) {}
createTag = async (req: Request, res: Response, next: NextFunction) => {
try {
const validatedBody = createTagBodyValidation.parse(req.body);
const teamId = requireTeamId(req.user?.teamId);
const tag = await this.tagsService.createTag(validatedBody, teamId);
return res.status(200).json({
success: true,
msg: "Tag created successfully",
data: tag,
});
} catch (error) {
next(error);
}
};
getTagById = async (req: Request, res: Response, next: NextFunction) => {
try {
const teamId = requireTeamId(req.user?.teamId);
const { id: tagId } = getTagByIdParamValidation.parse(req.params);
const tag = await this.tagsService.getTag(tagId, teamId);
return res.status(200).json({
success: true,
msg: "Tag retrieved successfully",
data: tag,
});
} catch (error) {
next(error);
}
};
getTagsByTeamId = async (req: Request, res: Response, next: NextFunction) => {
try {
const teamId = requireTeamId(req.user?.teamId);
const tags = await this.tagsService.getTagsByTeamId(teamId);
return res.status(200).json({
success: true,
msg: "Tags retrieved successfully",
data: tags,
});
} catch (error) {
next(error);
}
};
editTag = async (req: Request, res: Response, next: NextFunction) => {
try {
const teamId = requireTeamId(req.user?.teamId);
const { id: tagId } = editTagParamValidation.parse(req.params);
const validatedBody = editTagBodyValidation.parse(req.body);
const updatedTag = await this.tagsService.updateTag(tagId, teamId, validatedBody);
return res.status(200).json({
success: true,
msg: "Tag updated successfully",
data: updatedTag,
});
} catch (error) {
next(error);
}
};
deleteTag = async (req: Request, res: Response, next: NextFunction) => {
try {
const teamId = requireTeamId(req.user?.teamId);
const { id: tagId } = deleteTagParamValidation.parse(req.params);
await this.tagsService.deleteTag(tagId, teamId);
return res.status(200).json({
success: true,
msg: "Tag deleted successfully",
});
} catch (error) {
next(error);
}
};
}
export default TagsController;
+28
View File
@@ -0,0 +1,28 @@
import { ITagsController } from "@/controllers/tagController.js";
import { Router } from "express";
class TagRoutes {
private router: Router;
private tagController: ITagsController;
constructor(tagController: ITagsController) {
this.router = Router();
this.tagController = tagController;
this.initializeRoutes();
}
initializeRoutes() {
this.router.post("/", this.tagController.createTag);
this.router.get("/team", this.tagController.getTagsByTeamId);
this.router.get("/:id", this.tagController.getTagById);
this.router.delete("/:id", this.tagController.deleteTag);
this.router.patch("/:id", this.tagController.editTag);
}
getRouter() {
return this.router;
}
}
export default TagRoutes;