Skip to content

Commit 6e98532

Browse files
committed
Achievements Routes Added
1 parent 3e8c0d7 commit 6e98532

5 files changed

Lines changed: 176 additions & 2 deletions

File tree

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { NextFunction, Request, Response } from "express";
2+
import * as achievementService from "../services/achievement.service";
3+
import { ApiError } from "../utils/apiError";
4+
5+
export const getAchievements = async (req: Request, res: Response, next: NextFunction) => {
6+
const achievements = await achievementService.getAchievements();
7+
8+
if (!achievements || achievements.length === 0) {
9+
throw new ApiError("No achievements found", 404);
10+
}
11+
12+
res.status(200).json({
13+
success: true,
14+
count: achievements.length,
15+
data: achievements,
16+
});
17+
};
18+
19+
20+
export const getAchievementById = async (req: Request, res: Response, next: NextFunction) => {
21+
const achievementId = parseInt(req.params.achievementId);
22+
23+
const achievement = await achievementService.getAchievementById(achievementId);
24+
25+
if (!achievement) {
26+
throw new ApiError("Achievement not found", 404);
27+
}
28+
29+
res.status(200).json({
30+
success: true,
31+
data: achievement,
32+
});
33+
};
34+
35+
36+
export const updateAchievementById = async (req: Request, res: Response, next: NextFunction) => {
37+
const achievementId = parseInt(req.params.achievementId);
38+
39+
if (!achievementId) {
40+
throw new ApiError("Invalid achievement ID", 400);
41+
}
42+
43+
const { title, achievedAt, imageUrl} = req.body;
44+
45+
const existingAchievement = await achievementService.getAchievementById(achievementId);
46+
47+
if (!existingAchievement) {
48+
throw new ApiError("Achievement not found", 404);
49+
}
50+
51+
const updatedAchievement = await achievementService.updateAchievementById(achievementId, {
52+
title,
53+
achievedAt,
54+
imageUrl,
55+
});
56+
57+
res.status(200).json({
58+
success: true,
59+
data: updatedAchievement,
60+
});
61+
};
62+
63+
64+
export const deleteAchievementById = async (req: Request, res: Response, next: NextFunction) => {
65+
const achievementId = parseInt(req.params.achievementId);
66+
67+
const existingAchievement = await achievementService.getAchievementById(achievementId);
68+
69+
if (!existingAchievement) {
70+
throw new ApiError("Achievement not found", 404);
71+
}
72+
73+
await achievementService.deleteAchievementById(achievementId);
74+
75+
res.status(200).json({
76+
success: true,
77+
message: "Achievement deleted successfully",
78+
});
79+
};
80+

src/db/client.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ import { PrismaClient } from "../generated/prisma";
22

33
const prisma = new PrismaClient();
44

5-
export { prisma };
5+
export { prisma };
6+

src/routes/achievements.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import express from 'express';
2+
import * as acheivementsCtrl from '../controllers/achievement.controller';
3+
import { supabase } from '../app';
4+
import { Multer } from 'multer';
5+
import { NextFunction } from 'express-serve-static-core';
6+
import { SupabaseClient } from '@supabase/supabase-js';
7+
8+
9+
10+
export default function acheivementsRouter(upload: Multer, supabase: SupabaseClient) {
11+
const router = express.Router();
12+
13+
14+
router.get('/', acheivementsCtrl.getAchievements);
15+
router.get('/:acheivementId',acheivementsCtrl.getAchievementById);
16+
router.patch('/:acheivementId',acheivementsCtrl.updateAchievementById);
17+
router.delete('/:acheivementId',acheivementsCtrl.deleteAchievementById);
18+
19+
20+
21+
return router
22+
}

src/routes/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
import { Router } from 'express'
22
import { Multer } from 'multer'
33
import { SupabaseClient } from '@supabase/supabase-js'
4-
import membersRouter from './members'
4+
// import membersRouter from './members'
55
import projectsRouter from './projects'
6+
import acheivementsRouter from './achievements'
7+
import interviewRouter from './interviews'
8+
69
// bakiche tumhi import kara mala kantala ala
710

811
export default function routes(upload: Multer, supabase: SupabaseClient) {
912
const router = Router()
1013

1114
// router.use('/members', membersRouter(upload, supabase))
1215
router.use('/projects', projectsRouter(upload, supabase))
16+
// router.use('/projects', projectsRouter(upload, supabase))
17+
router.use('/acheivements' ,acheivementsRouter(upload, supabase));
18+
router.use('/interviews', interviewRouter(upload, supabase));
1319
// … mount other routers, just write xyzRouter() if the routes in that router don't need multer or supabase
1420

1521
return router
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { prisma } from "../db/client";
2+
3+
4+
export interface AchievementUpdateInput {
5+
title?: string;
6+
achievedAt?: string;
7+
imageUrl?: string | null;
8+
}
9+
10+
11+
export const getAchievements = async () => {
12+
return await prisma.achievement.findMany({
13+
orderBy: {
14+
achievedAt: "desc",
15+
},
16+
});
17+
};
18+
19+
export const getAchievementById = async (achievementId : number) => {
20+
return await prisma.achievement.findFirst({
21+
where: {
22+
id: Number(achievementId),
23+
},
24+
select: {
25+
id: true,
26+
title: true,
27+
achievedAt: true,
28+
imageUrl: true,
29+
members: {
30+
select: {
31+
member: {
32+
select: {
33+
id: true,
34+
name: true,
35+
email: true,
36+
profilePhoto: true,
37+
},
38+
},
39+
},
40+
},
41+
},
42+
});
43+
};
44+
45+
46+
export const updateAchievementById = async (achievementId : number, updateContent : AchievementUpdateInput) => {
47+
return await prisma.achievement.update({
48+
where: {
49+
id: Number(achievementId),
50+
},
51+
data: updateContent
52+
});
53+
};
54+
55+
export const deleteAchievementById = async (achievementId: number) => {
56+
await prisma.achievement.delete({
57+
where: {
58+
id: achievementId,
59+
},
60+
});
61+
};
62+
63+
64+
65+

0 commit comments

Comments
 (0)