Skip to content

Commit 00b4be9

Browse files
committed
Interview Routes Added
1 parent 6e98532 commit 00b4be9

4 files changed

Lines changed: 233 additions & 0 deletions

File tree

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import { Request, Response, NextFunction } from "express";
2+
import * as interviewService from "../services/interview.service";
3+
import { ApiError } from "../utils/apiError";
4+
5+
export const getInterviews = async (req: Request, res: Response, next: NextFunction) => {
6+
const interviews = await interviewService.getInterviews();
7+
8+
res.status(200).json({
9+
success: true,
10+
data: interviews,
11+
});
12+
};
13+
14+
export const getInterviewById = async (req: Request, res: Response, next: NextFunction) => {
15+
const interviewId = parseInt(req.params.id);
16+
17+
if (!interviewId) {
18+
throw new ApiError("Invalid interview ID", 400);
19+
}
20+
21+
const interview = await interviewService.getInterviewById(interviewId);
22+
23+
if (!interview) {
24+
throw new ApiError("Interview experience not found", 404);
25+
}
26+
27+
res.status(200).json({
28+
success: true,
29+
data: interview,
30+
});
31+
};
32+
33+
34+
export const createInterview = async (req: Request, res: Response, next: NextFunction) => {
35+
const memberId = req.params.memberId;
36+
37+
if (!memberId) {
38+
throw new ApiError("Member ID is required", 400);
39+
}
40+
41+
const { company, role, verdict, content, isAnonymous } = req.body;
42+
43+
if (!company || !role || !verdict || !content || isAnonymous === undefined) {
44+
throw new ApiError("All fields are required", 400);
45+
}
46+
47+
const interview = await interviewService.createInterview(memberId, {
48+
company,
49+
role,
50+
verdict,
51+
content,
52+
isAnonymous,
53+
});
54+
55+
res.status(201).json({
56+
success: true,
57+
data: interview,
58+
});
59+
};
60+
61+
export const updateInterviewById = async (req: Request, res: Response, next: NextFunction) => {
62+
const interviewId = parseInt(req.params.id);
63+
64+
if (!interviewId) {
65+
throw new ApiError("Invalid interview ID", 400);
66+
}
67+
68+
const { memberId, company, role, verdict, content, isAnonymous } = req.body;
69+
70+
if (!memberId) {
71+
throw new ApiError("Member ID is required for verification", 400);
72+
}
73+
74+
const existingInterview = await interviewService.getInterviewById(interviewId);
75+
76+
if (!existingInterview) {
77+
throw new ApiError("Interview experience not found", 404);
78+
}
79+
80+
if (existingInterview.memberId !== memberId) {
81+
throw new ApiError("You are not authorized to update this interview experience", 403);
82+
}
83+
84+
const updatedInterview = await interviewService.updateInterviewById(interviewId, {
85+
memberId,
86+
company,
87+
role,
88+
verdict,
89+
content,
90+
isAnonymous,
91+
});
92+
93+
res.status(200).json({
94+
success: true,
95+
data: updatedInterview,
96+
});
97+
};
98+
99+
100+
export const deleteInterviewById = async (req: Request, res: Response, next: NextFunction) => {
101+
const interviewId = parseInt(req.params.id);
102+
103+
if (!interviewId) {
104+
throw new ApiError("Invalid interview ID", 400);
105+
}
106+
107+
const existingInterview = await interviewService.getInterviewById(interviewId);
108+
109+
if (!existingInterview) {
110+
throw new ApiError("Interview experience not found", 404);
111+
}
112+
113+
await interviewService.deleteInterviewById(interviewId);
114+
115+
res.status(200).json({
116+
success: true,
117+
message: "Interview experience deleted successfully",
118+
});
119+
};
120+
121+

src/routes/interviews.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import express from 'express';
2+
import * as interviewCtrl from '../controllers/interview.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 interviewRouter(upload: Multer, supabase: SupabaseClient) {
11+
const router = express.Router();
12+
13+
14+
router.get('/', interviewCtrl.getInterviews);
15+
router.get('/:id', interviewCtrl.getInterviewById);
16+
router.post('/:memberId', interviewCtrl.createInterview);
17+
router.patch('/:id',interviewCtrl.updateInterviewById);
18+
router.delete('/:id',interviewCtrl.deleteInterviewById);
19+
20+
21+
// router.get('/:acheivementId',interviewCtrl.getAchievementById);
22+
// router.patch('/:acheivementId',interviewCtrl.updateAchievementById);
23+
// router.delete('/:acheivementId',interviewCtrl.deleteAchievementById);
24+
25+
26+
27+
return router
28+
}

src/services/interview.service.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { prisma } from "../db/client"
2+
import { InterviewCreateInput, InterviewUpdateInput } from "../types/interview.types";
3+
4+
export const getInterviews = async () => {
5+
return await prisma.interviewExperience.findMany({
6+
orderBy: {
7+
id: "desc",
8+
},
9+
});
10+
};
11+
12+
export const getInterviewById = async (interviewId: number) => {
13+
return await prisma.interviewExperience.findUnique({
14+
where: {
15+
id: interviewId,
16+
},
17+
});
18+
};
19+
20+
export const createInterview = async (memberId: string, interviewData: InterviewCreateInput) => {
21+
const interview = await prisma.interviewExperience.create({
22+
data: {
23+
company: interviewData.company,
24+
role: interviewData.role,
25+
verdict: interviewData.verdict,
26+
content: interviewData.content,
27+
isAnonymous: interviewData.isAnonymous,
28+
memberId: memberId,
29+
},
30+
});
31+
32+
return interview;
33+
};
34+
35+
export const updateInterviewById = async (interviewId: number, updateData: InterviewUpdateInput) => {
36+
const { memberId, ...fieldsToUpdate } = updateData;
37+
38+
const updatedInterview = await prisma.interviewExperience.update({
39+
where: {
40+
id: interviewId,
41+
},
42+
data: fieldsToUpdate,
43+
});
44+
45+
return updatedInterview;
46+
};
47+
48+
export const deleteInterviewById = async (interviewId: number) => {
49+
await prisma.interviewExperience.delete({
50+
where: {
51+
id: interviewId,
52+
},
53+
});
54+
};
55+
56+

src/types/interview.types.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
export interface InterviewResponse {
2+
id: number;
3+
company: string;
4+
role: string;
5+
verdict: "Selected" | "Rejected" | "Pending";
6+
content: string;
7+
isAnonymous: boolean;
8+
memberId: string;
9+
}
10+
11+
export interface InterviewCreateInput {
12+
company: string;
13+
role: string;
14+
verdict: "Selected" | "Rejected" | "Pending";
15+
content: string;
16+
isAnonymous: boolean;
17+
}
18+
19+
export interface InterviewUpdateInput {
20+
company?: string;
21+
role?: string;
22+
verdict?: "Selected" | "Rejected" | "Pending";
23+
content?: string;
24+
isAnonymous?: boolean;
25+
memberId: string; // For verification, not stored again in Prisma
26+
}
27+
28+

0 commit comments

Comments
 (0)