Skip to content

Commit e2c8cbd

Browse files
authored
Merge pull request #1907 from Real-Dev-Squad/develop
Dev to main sync
2 parents 2cd6aab + fa25398 commit e2c8cbd

File tree

17 files changed

+1080
-515
lines changed

17 files changed

+1080
-515
lines changed

constants/oooRequest.ts

Lines changed: 0 additions & 20 deletions
This file was deleted.

constants/request.ts

Lines changed: 0 additions & 9 deletions
This file was deleted.

constants/requests.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
export const REQUEST_STATE = {
2+
APPROVED: "APPROVED",
3+
PENDING: "PENDING",
4+
REJECTED: "REJECTED",
5+
};
6+
7+
export const LOG_ACTION = {
8+
CREATE: "create",
9+
ERRORS: "errors",
10+
UPDATE: "update",
11+
};
12+
13+
export const REQUEST_TYPE = {
14+
OOO: "OOO",
15+
ALL: "ALL",
16+
};
17+
18+
export const REQUEST_LOG_TYPE = {
19+
REQUEST_CREATED: "REQUEST_CREATED",
20+
REQUEST_APPROVED: "REQUEST_APPROVED",
21+
REQUEST_REJECTED: "REQUEST_REJECTED",
22+
REQUEST_BLOCKED: "REQUEST_BLOCKED",
23+
REQUEST_CANCELLED: "REQUEST_CANCELLED",
24+
};
25+
26+
export const REQUEST_CREATED_SUCCESSFULLY = "Request created successfully";
27+
export const REQUEST_APPROVED_SUCCESSFULLY = "Request approved successfully";
28+
export const REQUEST_REJECTED_SUCCESSFULLY = "Request rejected successfully";
29+
export const REQUEST_FETCHED_SUCCESSFULLY = "Request fetched successfully";
30+
31+
export const REQUEST_ALREADY_APPROVED = "Request already approved";
32+
export const REQUEST_ALREADY_REJECTED = "Request already rejected";
33+
34+
export const ERROR_WHILE_FETCHING_REQUEST = "Error while fetching request";
35+
export const ERROR_WHILE_CREATING_REQUEST = "Error while creating request";
36+
export const ERROR_WHILE_UPDATING_REQUEST = "Error while updating request";
37+
38+
export const REQUEST_DOES_NOT_EXIST = "Request does not exist";
39+
export const REQUEST_ALREADY_PENDING = "Request already exists please wait for approval or rejection";

controllers/oooRequests.ts

Lines changed: 0 additions & 105 deletions
This file was deleted.

controllers/requests.ts

Lines changed: 119 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,124 @@
1-
import { OooRequestResponse, OooRequestCreateRequest, OooRequestUpdateRequest } from "../types/oooRequest";
2-
import { REQUEST_TYPE } from "../constants/request";
3-
import { createOooRequestController, updateOooRequestController } from "./oooRequests";
1+
import {
2+
ERROR_WHILE_FETCHING_REQUEST,
3+
ERROR_WHILE_CREATING_REQUEST,
4+
ERROR_WHILE_UPDATING_REQUEST,
5+
REQUEST_REJECTED_SUCCESSFULLY,
6+
REQUEST_APPROVED_SUCCESSFULLY,
7+
REQUEST_FETCHED_SUCCESSFULLY,
8+
REQUEST_CREATED_SUCCESSFULLY,
9+
REQUEST_STATE,
10+
LOG_ACTION,
11+
REQUEST_LOG_TYPE,
12+
} from "../constants/requests";
13+
import { createRequest, getRequests, updateRequest } from "../models/requests";
14+
import { addLog } from "../models/logs";
415

5-
export const createRequestController = async (
6-
req: OooRequestCreateRequest,
7-
res: OooRequestResponse
8-
) => {
9-
const type = req.body.type;
10-
switch (type) {
11-
case REQUEST_TYPE.OOO:
12-
return await createOooRequestController(req as OooRequestCreateRequest, res as OooRequestResponse);
13-
default:
14-
return res.boom.badRequest("Invalid request type");
16+
export const createRequestController = async (req: any, res: any) => {
17+
const requestBody = req.body;
18+
const userId = req?.userData?.id;
19+
if (!userId) {
20+
return res.boom.unauthorized();
21+
}
22+
23+
try {
24+
const requestResult = await createRequest({ requestedBy: userId, ...requestBody });
25+
if ("error" in requestResult) {
26+
const requestLog = {
27+
type: REQUEST_LOG_TYPE.REQUEST_BLOCKED,
28+
meta: {
29+
action: LOG_ACTION.ERRORS,
30+
createdBy: userId,
31+
createdAt: Date.now(),
32+
},
33+
body: {
34+
error: requestResult.error,
35+
...requestBody,
36+
},
37+
};
38+
await addLog(requestLog.type, requestLog.meta, requestLog.body);
39+
40+
return res.boom.badRequest(requestResult.error);
41+
} else {
42+
const requestLog = {
43+
type: REQUEST_LOG_TYPE.REQUEST_CREATED,
44+
meta: {
45+
requestId: requestResult.id,
46+
action: LOG_ACTION.CREATE,
47+
createdBy: userId,
48+
createdAt: Date.now(),
49+
},
50+
body: requestResult,
51+
};
52+
await addLog(requestLog.type, requestLog.meta, requestLog.body);
53+
return res.status(201).json({
54+
message: REQUEST_CREATED_SUCCESSFULLY,
55+
data: {
56+
id: requestResult.id,
57+
...requestResult,
58+
},
59+
});
60+
}
61+
} catch (err) {
62+
logger.error(ERROR_WHILE_CREATING_REQUEST, err);
63+
return res.boom.badImplementation(ERROR_WHILE_CREATING_REQUEST);
64+
}
65+
};
66+
67+
export const updateRequestController = async (req: any, res: any) => {
68+
const requestBody = req.body;
69+
const userId = req?.userData?.id;
70+
const requestId = req.params.id;
71+
if (!userId) {
72+
return res.boom.unauthorized();
73+
}
74+
75+
try {
76+
const requestResult = await updateRequest(requestId, requestBody, userId);
77+
if ("error" in requestResult) {
78+
return res.boom.badRequest(requestResult.error);
79+
}
80+
const [logType, returnMessage] =
81+
requestResult.state === REQUEST_STATE.APPROVED
82+
? [REQUEST_LOG_TYPE.REQUEST_APPROVED, REQUEST_APPROVED_SUCCESSFULLY]
83+
: [REQUEST_LOG_TYPE.REQUEST_REJECTED, REQUEST_REJECTED_SUCCESSFULLY];
84+
85+
const requestLog = {
86+
type: logType,
87+
meta: {
88+
requestId: requestId,
89+
action: LOG_ACTION.UPDATE,
90+
createdBy: userId,
91+
createdAt: Date.now(),
92+
},
93+
body: requestResult,
94+
};
95+
await addLog(requestLog.type, requestLog.meta, requestLog.body);
96+
return res.status(201).json({
97+
message: returnMessage,
98+
data: {
99+
id: requestResult.id,
100+
...requestResult,
101+
},
102+
});
103+
} catch (err) {
104+
logger.error(ERROR_WHILE_UPDATING_REQUEST, err);
105+
return res.boom.badImplementation(ERROR_WHILE_UPDATING_REQUEST);
15106
}
16107
};
17108

18-
export const updateRequestController = async (
19-
req: OooRequestUpdateRequest,
20-
res: OooRequestResponse
21-
) => {
22-
const type = req.body.type;
23-
switch (type) {
24-
case REQUEST_TYPE.OOO:
25-
return await updateOooRequestController(req as OooRequestUpdateRequest, res as OooRequestResponse);
26-
default:
27-
return res.boom.badRequest("Invalid request type");
109+
export const getRequestsController = async (req: any, res: any) => {
110+
const { query } = req;
111+
try {
112+
const requests = await getRequests(query);
113+
if (!requests) {
114+
return res.status(204).send();
115+
}
116+
return res.status(200).send({
117+
message: REQUEST_FETCHED_SUCCESSFULLY,
118+
data: requests,
119+
});
120+
} catch (err) {
121+
logger.error(ERROR_WHILE_FETCHING_REQUEST, err);
122+
return res.boom.badImplementation(ERROR_WHILE_FETCHING_REQUEST);
28123
}
29-
};
124+
};

middlewares/validators/oooRequests.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import joi from "joi";
22
import { NextFunction } from "express";
3-
import { REQUEST_STATE, REQUEST_TYPE } from "../../constants/request";
3+
import { REQUEST_STATE, REQUEST_TYPE } from "../../constants/requests";
44
import { OooRequestCreateRequest, OooRequestResponse,OooRequestUpdateRequest } from "../../types/oooRequest";
55

66
export const createOooStatusRequestValidator = async (

middlewares/validators/requests.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
import joi from "joi";
12
import { NextFunction } from "express";
2-
import { REQUEST_TYPE } from "../../constants/request";
3+
import { REQUEST_STATE, REQUEST_TYPE } from "../../constants/requests";
34
import { OooRequestCreateRequest, OooRequestResponse, OooRequestUpdateRequest } from "../../types/oooRequest";
45
import { createOooStatusRequestValidator, updateOooStatusRequestValidator } from "./oooRequests";
56

@@ -37,6 +38,7 @@ export const updateRequestsMiddleware = async (
3738
next: NextFunction
3839
) => {
3940
const type = req.body.type;
41+
4042
// TODO: Remove this check once feature is tested and ready to be used
4143
if ( req.query.dev !== "true") {
4244
return res.boom.badRequest("Please use feature flag to make this requests");
@@ -58,3 +60,36 @@ export const updateRequestsMiddleware = async (
5860
res.boom.badRequest(errorMessages);
5961
}
6062
};
63+
64+
export const getRequestsMiddleware = async (req: OooRequestCreateRequest, res: OooRequestResponse, next: NextFunction) => {
65+
const schema = joi.object().keys({
66+
dev: joi.bool().sensitive(), // TODO: Remove this validator once feature is tested and ready to be used
67+
id: joi.string().optional(),
68+
type: joi
69+
.string()
70+
.valid(REQUEST_TYPE.OOO, REQUEST_TYPE.ALL)
71+
.optional(),
72+
requestedBy: joi.string().insensitive().optional(),
73+
state: joi
74+
.string()
75+
.valid(REQUEST_STATE.APPROVED, REQUEST_STATE.PENDING, REQUEST_STATE.REJECTED)
76+
.optional(),
77+
page: joi.number().integer().min(0),
78+
next: joi
79+
.string()
80+
.optional(),
81+
prev: joi
82+
.string()
83+
.optional(),
84+
size: joi.number().integer().positive().min(1).max(100).optional(),
85+
});
86+
87+
try {
88+
await schema.validateAsync(req.query);
89+
next();
90+
} catch (error) {
91+
const errorMessages = error.details.map((detail) => detail.message);
92+
logger.error(`Error while validating request query : ${errorMessages}`);
93+
res.boom.badRequest(errorMessages);
94+
}
95+
};

0 commit comments

Comments
 (0)