feat: introduce Joi validation schemas and integrate them across various controllers for categories, lessons, courses, chapters, announcements, and admin course approvals.
This commit is contained in:
parent
c5aa195b13
commit
b56f604890
14 changed files with 553 additions and 28 deletions
72
Backend/src/validators/announcements.validator.ts
Normal file
72
Backend/src/validators/announcements.validator.ts
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
import Joi from 'joi';
|
||||
|
||||
/**
|
||||
* Validator for creating an announcement
|
||||
*/
|
||||
export const CreateAnnouncementValidator = Joi.object({
|
||||
title: Joi.object({
|
||||
th: Joi.string().required().messages({
|
||||
'any.required': 'Thai title is required'
|
||||
}),
|
||||
en: Joi.string().required().messages({
|
||||
'any.required': 'English title is required'
|
||||
})
|
||||
}).required().messages({
|
||||
'any.required': 'Title is required'
|
||||
}),
|
||||
content: Joi.object({
|
||||
th: Joi.string().required().messages({
|
||||
'any.required': 'Thai content is required'
|
||||
}),
|
||||
en: Joi.string().required().messages({
|
||||
'any.required': 'English content is required'
|
||||
})
|
||||
}).required().messages({
|
||||
'any.required': 'Content is required'
|
||||
}),
|
||||
status: Joi.string()
|
||||
.valid('DRAFT', 'PUBLISHED', 'ARCHIVED')
|
||||
.required()
|
||||
.messages({
|
||||
'any.only': 'Status must be one of: DRAFT, PUBLISHED, ARCHIVED',
|
||||
'any.required': 'Status is required'
|
||||
}),
|
||||
is_pinned: Joi.boolean()
|
||||
.required()
|
||||
.messages({
|
||||
'any.required': 'is_pinned is required'
|
||||
}),
|
||||
published_at: Joi.string()
|
||||
.isoDate()
|
||||
.optional()
|
||||
.messages({
|
||||
'string.isoDate': 'published_at must be a valid ISO date string'
|
||||
})
|
||||
});
|
||||
|
||||
/**
|
||||
* Validator for updating an announcement
|
||||
*/
|
||||
export const UpdateAnnouncementValidator = Joi.object({
|
||||
title: Joi.object({
|
||||
th: Joi.string().optional(),
|
||||
en: Joi.string().optional()
|
||||
}).optional(),
|
||||
content: Joi.object({
|
||||
th: Joi.string().optional(),
|
||||
en: Joi.string().optional()
|
||||
}).optional(),
|
||||
status: Joi.string()
|
||||
.valid('DRAFT', 'PUBLISHED', 'ARCHIVED')
|
||||
.optional()
|
||||
.messages({
|
||||
'any.only': 'Status must be one of: DRAFT, PUBLISHED, ARCHIVED'
|
||||
}),
|
||||
is_pinned: Joi.boolean().optional(),
|
||||
published_at: Joi.string()
|
||||
.isoDate()
|
||||
.optional()
|
||||
.messages({
|
||||
'string.isoDate': 'published_at must be a valid ISO date string'
|
||||
})
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue