72 lines
2.1 KiB
TypeScript
72 lines
2.1 KiB
TypeScript
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'
|
|
})
|
|
});
|