Skip to content

Commit dc16a2c

Browse files
Complete CRUD
1 parent effa102 commit dc16a2c

File tree

4 files changed

+147
-44
lines changed

4 files changed

+147
-44
lines changed
Lines changed: 85 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import express from "express";
22
import { QuestionDao } from "../models/questions";
33
import { ApiResponse, EMPTY_OBJECT, StatusMessageType } from "../types";
4+
import { handleCustomError, handleServerError } from "../utils";
45

56
// GET /questions/:id
67
export const getQuestion = async (
@@ -10,28 +11,18 @@ export const getQuestion = async (
1011
try {
1112
const id = req.params.id;
1213
if (!id) {
13-
const response: ApiResponse = {
14-
payload: EMPTY_OBJECT,
15-
statusMessage: {
16-
type: StatusMessageType.ERROR,
17-
message: "No ID provided",
18-
},
19-
};
20-
21-
res.status(400).json(response);
14+
handleCustomError(res, {
15+
type: StatusMessageType.ERROR,
16+
message: "Question ID must be provided",
17+
});
2218
}
2319

2420
const question = await QuestionDao.getQuestionById(id);
2521
if (!question) {
26-
const response: ApiResponse = {
27-
payload: EMPTY_OBJECT,
28-
statusMessage: {
29-
type: StatusMessageType.ERROR,
30-
message: "No question found",
31-
},
32-
};
33-
34-
res.status(404).json(response);
22+
handleCustomError(res, {
23+
type: StatusMessageType.ERROR,
24+
message: "Question not found",
25+
});
3526
}
3627

3728
const response: ApiResponse = {
@@ -40,16 +31,7 @@ export const getQuestion = async (
4031
};
4132
res.status(200).json(response);
4233
} catch (error) {
43-
console.log(error);
44-
const response: ApiResponse = {
45-
payload: EMPTY_OBJECT,
46-
statusMessage: {
47-
type: StatusMessageType.ERROR,
48-
message: "Something went wrong",
49-
},
50-
};
51-
52-
res.status(500).json(response);
34+
handleServerError(error, res);
5335
}
5436
};
5537

@@ -61,33 +43,93 @@ export const createQuestion = async (
6143
try {
6244
const { title, description } = req.body;
6345
if (!title || !description) {
64-
const response: ApiResponse = {
65-
payload: EMPTY_OBJECT,
66-
statusMessage: {
67-
type: StatusMessageType.ERROR,
68-
message: "Title or description must provided",
69-
},
70-
};
71-
72-
res.status(400).json(response);
46+
handleCustomError(res, {
47+
type: StatusMessageType.ERROR,
48+
message: "Title and description must be provided",
49+
});
7350
}
7451

7552
const question = await QuestionDao.createQuestion(title, description);
7653
const response: ApiResponse = {
7754
payload: question,
78-
statusMessage: null,
55+
statusMessage: {
56+
type: StatusMessageType.SUCCESS,
57+
message: "Question created successfully",
58+
},
7959
};
8060
res.status(201).json(response);
8161
} catch (error) {
82-
console.log(error);
62+
handleServerError(error, res);
63+
}
64+
};
65+
66+
// PUT /questions/:id
67+
export const updateQuestion = async (
68+
req: express.Request,
69+
res: express.Response
70+
) => {
71+
try {
72+
const id = req.params.id;
73+
const { title, description } = req.body;
74+
if (!id || !title || !description) {
75+
handleCustomError(res, {
76+
type: StatusMessageType.ERROR,
77+
message: "Question ID, title, and description must be provided",
78+
});
79+
}
80+
81+
const question = await QuestionDao.updateQuestion(id, title, description);
82+
if (!question) {
83+
handleCustomError(res, {
84+
type: StatusMessageType.ERROR,
85+
message: "Question not found",
86+
});
87+
}
88+
8389
const response: ApiResponse = {
84-
payload: EMPTY_OBJECT,
90+
payload: question,
8591
statusMessage: {
86-
type: StatusMessageType.ERROR,
87-
message: "Something went wrong",
92+
type: StatusMessageType.SUCCESS,
93+
message: "Question updated successfully",
8894
},
8995
};
96+
res.status(200).json(response);
97+
} catch (error) {
98+
handleServerError(error, res);
99+
}
100+
};
101+
102+
// DELETE /questions/:id
103+
export const deleteQuestion = async (
104+
req: express.Request,
105+
res: express.Response
106+
) => {
107+
try {
108+
const id = req.params.id;
109+
if (!id) {
110+
handleCustomError(res, {
111+
type: StatusMessageType.ERROR,
112+
message: "Question ID must be provided",
113+
});
114+
}
115+
116+
const question = await QuestionDao.deleteQuestion(id);
117+
if (!question) {
118+
handleCustomError(res, {
119+
type: StatusMessageType.ERROR,
120+
message: "Question not found",
121+
});
122+
}
90123

91-
res.status(500).json(response);
124+
const response: ApiResponse = {
125+
payload: question,
126+
statusMessage: {
127+
type: StatusMessageType.SUCCESS,
128+
message: "Question deleted successfully",
129+
},
130+
};
131+
res.status(200).json(response);
132+
} catch (error) {
133+
handleServerError(error, res);
92134
}
93135
};

questions/src/models/questions.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,33 @@ const QuestionModel = mongoose.model("Question", QuestionSchema);
99

1010
const getQuestionById = async (id: string) =>
1111
QuestionModel.findById(id).then((question) => question?.toObject());
12+
1213
const createQuestion = async (title: string, description: string) => {
1314
const question = new QuestionModel({ title, description });
1415
return question.save().then((question) => question.toObject());
1516
};
1617

18+
const updateQuestion = async (
19+
id: string,
20+
title: string,
21+
description: string
22+
) => {
23+
const updatedQuestion = await QuestionModel.findByIdAndUpdate(
24+
id,
25+
{ title, description },
26+
{ new: true }
27+
);
28+
return updatedQuestion?.toObject();
29+
};
30+
31+
const deleteQuestion = async (id: string) => {
32+
const deletedQuestion = await QuestionModel.findByIdAndDelete(id);
33+
return deletedQuestion?.toObject();
34+
};
35+
1736
export const QuestionDao = {
1837
getQuestionById,
1938
createQuestion,
39+
updateQuestion,
40+
deleteQuestion,
2041
};

questions/src/router/questions.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1-
import { createQuestion, getQuestion } from "../controllers/questions";
21
import express from "express";
2+
import {
3+
createQuestion,
4+
deleteQuestion,
5+
getQuestion,
6+
updateQuestion,
7+
} from "../controllers/questions";
38

49
export default (router: express.Router) => {
510
router.get("/questions/:id", getQuestion);
611
router.post("/questions", createQuestion);
12+
router.put("/questions/:id", updateQuestion);
13+
router.delete("/questions/:id", deleteQuestion);
714
};

questions/src/utils/index.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import express from "express";
2+
import {
3+
ApiResponse,
4+
EMPTY_OBJECT,
5+
StatusMessage,
6+
StatusMessageType,
7+
} from "../types";
8+
9+
export const handleCustomError = (
10+
res: express.Response,
11+
statusMessage: StatusMessage
12+
) => {
13+
const response: ApiResponse = {
14+
payload: EMPTY_OBJECT,
15+
statusMessage,
16+
};
17+
18+
res.status(400).json(response);
19+
};
20+
21+
export const handleServerError = (error: Error, res: express.Response) => {
22+
console.log(error);
23+
24+
const response: ApiResponse = {
25+
payload: EMPTY_OBJECT,
26+
statusMessage: {
27+
type: StatusMessageType.ERROR,
28+
message: "Something went wrong! Please try again later.",
29+
},
30+
};
31+
32+
res.status(500).json(response);
33+
};

0 commit comments

Comments
 (0)