Files
Checkmate/Server/validation/joi.js
T

420 lines
11 KiB
JavaScript
Raw Normal View History

2024-05-10 13:36:04 -07:00
const joi = require("joi");
2024-09-03 15:00:30 -07:00
const { normalize } = require("path");
//****************************************
// Custom Validators
//****************************************
const roleValidatior = (role) => (value, helpers) => {
2024-08-26 13:29:11 -07:00
const hasRole = role.some((role) => value.includes(role));
2024-08-26 10:00:34 -07:00
if (!hasRole) {
throw new Joi.ValidationError(
`You do not have the required authorization. Required roles: ${roles.join(", ")}`
);
}
return value;
};
2024-05-29 10:59:29 -07:00
//****************************************
// Auth
//****************************************
const loginValidation = joi.object({
2024-08-23 10:35:08 -07:00
email: joi
.string()
.email()
.required()
.custom((value, helpers) => {
const lowercasedValue = value.toLowerCase();
if (value !== lowercasedValue) {
return helpers.message("Email must be in lowercase");
}
return lowercasedValue;
}),
password: joi
.string()
.min(8)
.required()
.pattern(
2024-07-18 20:31:47 -04:00
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*()])[A-Za-z0-9!@#$%^&*()]+$/
),
});
const registrationBodyValidation = joi.object({
2024-07-22 12:45:33 -04:00
firstName: joi
2024-07-18 20:31:47 -04:00
.string()
.required()
.pattern(/^[A-Za-z]+$/),
2024-07-22 12:45:33 -04:00
lastName: joi
2024-07-18 20:31:47 -04:00
.string()
.required()
.pattern(/^[A-Za-z]+$/),
email: joi
.string()
.email()
.required()
.custom((value, helpers) => {
const lowercasedValue = value.toLowerCase();
if (value !== lowercasedValue) {
return helpers.message("Email must be in lowercase");
}
return lowercasedValue;
}),
password: joi
.string()
.min(8)
.required()
.pattern(
2024-07-18 20:31:47 -04:00
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*()])[A-Za-z0-9!@#$%^&*()]+$/
),
profileImage: joi.any(),
2024-08-21 11:50:26 -07:00
role: joi
.array()
2024-08-26 10:00:34 -07:00
.items(joi.string().valid("superadmin", "admin", "user"))
2024-08-21 11:50:26 -07:00
.min(1)
.required(),
2024-08-26 13:29:11 -07:00
teamId: joi.string().allow("").required(),
});
2024-05-29 10:59:29 -07:00
const editUserParamValidation = joi.object({
userId: joi.string().required(),
});
const editUserBodyValidation = joi.object({
2024-07-22 12:45:33 -04:00
firstName: joi.string().pattern(/^[A-Za-z]+$/),
lastName: joi.string().pattern(/^[A-Za-z]+$/),
2024-07-03 10:23:16 -07:00
profileImage: joi.any(),
newPassword: joi
.string()
.min(8)
.pattern(
2024-07-18 20:31:47 -04:00
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*()])[A-Za-z0-9!@#$%^&*()]+$/
),
password: joi
.string()
.min(8)
.pattern(
2024-07-18 20:31:47 -04:00
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*()])[A-Za-z0-9!@#$%^&*()]+$/
),
deleteProfileImage: joi.boolean(),
role: joi.array(),
2024-05-29 10:59:29 -07:00
});
2024-06-11 14:46:39 -07:00
const recoveryValidation = joi.object({
email: joi
.string()
.email({ tlds: { allow: false } })
.required(),
});
const recoveryTokenValidation = joi.object({
recoveryToken: joi.string().required(),
});
const newPasswordValidation = joi.object({
recoveryToken: joi.string().required(),
password: joi
.string()
.min(8)
.required()
.pattern(
2024-07-18 20:31:47 -04:00
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*()])[A-Za-z0-9!@#$%^&*()]+$/
),
2024-06-11 14:46:39 -07:00
confirm: joi.string(),
});
2024-07-02 12:16:33 +03:30
const deleteUserParamValidation = joi.object({
email: joi.string().email().required(),
2024-06-28 20:13:07 +03:30
});
const inviteRoleValidation = joi.object({
2024-08-26 10:00:34 -07:00
roles: joi.custom(roleValidatior(["admin", "superadmin"])).required(),
});
const inviteBodyValidation = joi.object({
email: joi.string().trim().email().required().messages({
"string.empty": "Email is required",
"string.email": "Must be a valid email address",
}),
role: joi.array().required(),
2024-08-26 13:29:11 -07:00
teamId: joi.string().required(),
});
const inviteVerifciationBodyValidation = joi.object({
token: joi.string().required(),
});
2024-05-29 10:59:29 -07:00
//****************************************
// Monitors
//****************************************
2024-07-26 18:56:39 -07:00
const getMonitorByIdParamValidation = joi.object({
2024-05-10 13:36:04 -07:00
monitorId: joi.string().required(),
});
2024-07-26 18:56:39 -07:00
const getMonitorByIdQueryValidation = joi.object({
status: joi.boolean(),
sortOrder: joi.string().valid("asc", "desc"),
limit: joi.number(),
2024-08-13 10:32:29 -07:00
dateRange: joi.string().valid("day", "week", "month"),
numToDisplay: joi.number(),
2024-08-08 11:20:54 -07:00
normalize: joi.boolean(),
2024-07-26 18:56:39 -07:00
});
const getMonitorsByTeamIdValidation = joi.object({
teamId: joi.string().required(),
2024-05-10 13:59:33 -07:00
});
const getMonitorsByTeamIdQueryValidation = joi.object({
2024-07-26 18:56:39 -07:00
status: joi.boolean(),
sortOrder: joi.string().valid("asc", "desc"),
limit: joi.number(),
2024-08-08 11:20:54 -07:00
normalize: joi.boolean(),
2024-07-26 18:56:39 -07:00
type: joi
.alternatives()
.try(
joi.string().valid("http", "ping", "pagespeed"),
joi.array().items(joi.string().valid("http", "ping", "pagespeed"))
),
2024-09-04 17:37:30 -07:00
page: joi.number(),
rowsPerPage: joi.number(),
2024-07-26 18:56:39 -07:00
});
2024-09-03 15:11:17 -07:00
const getMonitorStatsByIdParamValidation = joi.object({
2024-09-03 15:00:30 -07:00
monitorId: joi.string().required(),
});
2024-09-03 15:11:17 -07:00
const getMonitorStatsByIdQueryValidation = joi.object({
2024-09-03 15:00:30 -07:00
status: joi.string(),
limit: joi.number(),
sortOrder: joi.string().valid("asc", "desc"),
dateRange: joi.string().valid("day", "week", "month"),
numToDisplay: joi.number(),
normalize: joi.boolean(),
});
2024-09-03 15:11:17 -07:00
const getCertificateParamValidation = joi.object({
monitorId: joi.string().required(),
});
const createMonitorBodyValidation = joi.object({
_id: joi.string(),
userId: joi.string().required(),
2024-08-26 19:25:19 -07:00
teamId: joi.string().required(),
name: joi.string().required(),
description: joi.string().required(),
type: joi.string().required(),
url: joi.string().required(),
isActive: joi.boolean(),
interval: joi.number(),
notifications: joi.array().items(joi.object()),
});
2024-07-24 12:08:42 -07:00
const editMonitorBodyValidation = joi.object({
name: joi.string(),
description: joi.string(),
interval: joi.number(),
notifications: joi.array().items(joi.object()),
2024-07-24 12:08:42 -07:00
});
const pauseMonitorParamValidation = joi.object({
monitorId: joi.string().required(),
});
const getMonitorAggregateStatsParamValidation = joi.object({
monitorId: joi.string().required(),
});
const getMonitorAggregateStatsQueryValidation = joi.object({
dateRange: joi.string().valid("day", "week", "month"),
});
2024-05-29 10:59:29 -07:00
//****************************************
// Alerts
//****************************************
2024-05-27 11:57:25 -07:00
2024-05-28 11:39:55 -07:00
const createAlertParamValidation = joi.object({
monitorId: joi.string().required(),
});
const createAlertBodyValidation = joi.object({
checkId: joi.string().required(),
monitorId: joi.string().required(),
userId: joi.string().required(),
status: joi.boolean(),
message: joi.string(),
notifiedStatus: joi.boolean(),
acknowledgeStatus: joi.boolean(),
});
const getAlertsByUserIdParamValidation = joi.object({
userId: joi.string().required(),
});
const getAlertsByMonitorIdParamValidation = joi.object({
monitorId: joi.string().required(),
});
const getAlertByIdParamValidation = joi.object({
alertId: joi.string().required(),
});
const editAlertParamValidation = joi.object({
alertId: joi.string().required(),
});
const editAlertBodyValidation = joi.object({
status: joi.boolean(),
message: joi.string(),
notifiedStatus: joi.boolean(),
acknowledgeStatus: joi.boolean(),
});
const deleteAlertParamValidation = joi.object({
alertId: joi.string().required(),
});
2024-05-29 10:59:29 -07:00
//****************************************
// Checks
//****************************************
const createCheckParamValidation = joi.object({
monitorId: joi.string().required(),
});
const createCheckBodyValidation = joi.object({
monitorId: joi.string().required(),
status: joi.boolean().required(),
responseTime: joi.number().required(),
statusCode: joi.number().required(),
message: joi.string().required(),
});
const getChecksParamValidation = joi.object({
monitorId: joi.string().required(),
});
2024-08-08 12:37:02 -07:00
const getChecksQueryValidation = joi.object({
sortOrder: joi.string().valid("asc", "desc"),
limit: joi.number(),
dateRange: joi.string().valid("day", "week", "month"),
filter: joi.string().valid("all", "down", "resolve"),
2024-08-08 13:19:37 -07:00
page: joi.number(),
rowsPerPage: joi.number(),
2024-08-08 12:37:02 -07:00
});
const getTeamChecksParamValidation = joi.object({
teamId: joi.string().required(),
});
const getTeamChecksQueryValidation = joi.object({
sortOrder: joi.string().valid("asc", "desc"),
limit: joi.number(),
dateRange: joi.string().valid("day", "week", "month"),
filter: joi.string().valid("all", "down", "resolve"),
page: joi.number(),
rowsPerPage: joi.number(),
});
2024-05-29 10:59:29 -07:00
const deleteChecksParamValidation = joi.object({
monitorId: joi.string().required(),
});
2024-08-30 10:04:47 -07:00
const deleteChecksByTeamIdParamValidation = joi.object({
teamId: joi.string().required(),
});
2024-07-17 15:09:46 -07:00
//****************************************
// PageSpeedCheckValidation
//****************************************
2024-07-17 15:19:27 -07:00
const getPageSpeedCheckParamValidation = joi.object({
monitorId: joi.string().required(),
});
//Validation schema for the monitorId parameter
2024-07-17 15:19:27 -07:00
const createPageSpeedCheckParamValidation = joi.object({
monitorId: joi.string().required(),
});
//Validation schema for the monitorId body
const createPageSpeedCheckBodyValidation = joi.object({
url: joi.string().required(),
2024-07-17 15:19:27 -07:00
});
const deletePageSpeedCheckParamValidation = joi.object({
2024-07-17 15:09:46 -07:00
monitorId: joi.string().required(),
});
2024-07-30 10:01:52 -07:00
//****************************************
// MaintenanceWindowValidation
//****************************************
const createMaintenanceWindowParamValidation = joi.object({
monitorId: joi.string().required(),
});
const createMaintenanceWindowBodyValidation = joi.object({
userId: joi.string().required(),
active: joi.boolean().required(),
oneTime: joi.boolean().required(),
start: joi.date().required(),
end: joi.date().required(),
expiry: joi.date(),
});
const getMaintenanceWindowsByUserIdParamValidation = joi.object({
userId: joi.string().required(),
});
const getMaintenanceWindowsByMonitorIdParamValidation = joi.object({
monitorId: joi.string().required(),
});
2024-05-10 13:59:33 -07:00
module.exports = {
roleValidatior,
loginValidation,
registrationBodyValidation,
2024-06-11 14:46:39 -07:00
recoveryValidation,
recoveryTokenValidation,
newPasswordValidation,
inviteRoleValidation,
inviteBodyValidation,
inviteVerifciationBodyValidation,
createMonitorBodyValidation,
2024-07-26 18:56:39 -07:00
getMonitorByIdParamValidation,
getMonitorByIdQueryValidation,
getMonitorsByTeamIdValidation,
getMonitorsByTeamIdQueryValidation,
2024-09-03 15:07:11 -07:00
getMonitorStatsByIdParamValidation,
getMonitorStatsByIdQueryValidation,
2024-09-03 15:11:17 -07:00
getCertificateParamValidation,
getMonitorAggregateStatsParamValidation,
getMonitorAggregateStatsQueryValidation,
2024-07-24 12:08:42 -07:00
editMonitorBodyValidation,
pauseMonitorParamValidation,
2024-05-27 11:57:25 -07:00
editUserParamValidation,
editUserBodyValidation,
2024-05-28 11:39:55 -07:00
createAlertParamValidation,
createAlertBodyValidation,
getAlertsByUserIdParamValidation,
getAlertsByMonitorIdParamValidation,
getAlertByIdParamValidation,
editAlertParamValidation,
editAlertBodyValidation,
deleteAlertParamValidation,
2024-05-29 10:59:29 -07:00
createCheckParamValidation,
createCheckBodyValidation,
getChecksParamValidation,
2024-08-08 12:37:02 -07:00
getChecksQueryValidation,
getTeamChecksParamValidation,
getTeamChecksQueryValidation,
2024-05-29 10:59:29 -07:00
deleteChecksParamValidation,
2024-08-30 10:04:47 -07:00
deleteChecksByTeamIdParamValidation,
deleteUserParamValidation,
2024-07-17 15:19:27 -07:00
getPageSpeedCheckParamValidation,
createPageSpeedCheckParamValidation,
deletePageSpeedCheckParamValidation,
createPageSpeedCheckBodyValidation,
2024-07-30 10:01:52 -07:00
createMaintenanceWindowParamValidation,
createMaintenanceWindowBodyValidation,
getMaintenanceWindowsByUserIdParamValidation,
getMaintenanceWindowsByMonitorIdParamValidation,
2024-05-10 13:59:33 -07:00
};