Software: Apache. PHP/8.1.30 uname -a: Linux server1.tuhinhossain.com 5.15.0-163-generic #173-Ubuntu SMP Tue Oct 14 17:51:00 UTC uid=1002(picotech) gid=1003(picotech) groups=1003(picotech),0(root) Safe-mode: OFF (not secure) /home/picotech/domains/note.picotech.app/public_html/src/middleware/ drwxr-xr-x | |
| Viewing file: Select action/file-type: const { body, param, query } = require('express-validator');
const { validate } = require('./validator');
// Add auth validations
exports.authValidations = {
sendRegistrationOTP: [
body('email').isEmail().withMessage('Invalid email address'),
body('name').trim().isLength({ min: 2 }).withMessage('Name is required'),
validate
],
verifyOTP: [
body('email').isEmail().withMessage('Invalid email address'),
body('otp').isLength({ min: 6, max: 6 }).isNumeric().withMessage('OTP must be 6 digits'),
validate
],
register: [
body('email').isEmail().withMessage('Invalid email address'),
body('password')
.isLength({ min: 5, max: 100 })
.withMessage('Password must be at least 5 characters')
.matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]/)
.withMessage('Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character'),
body('name').trim().isLength({ min: 2 }).withMessage('Name is required'),
validate
],
login: [
body('email').isEmail().withMessage('Invalid email address'),
body('password').notEmpty().withMessage('Password is required'),
validate
],
refreshToken: [
body('refreshToken').notEmpty().withMessage('Refresh token is required'),
validate
],
forgotPassword: [
body('email').isEmail().withMessage('Invalid email address'),
validate
],
resetPassword: [
body('token').notEmpty().withMessage('Reset token is required'),
body('password')
.isLength({ min: 12, max: 100 })
.withMessage('Password must be at least 12 characters')
.matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]/)
.withMessage('Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character'),
validate
],
};
// Add meeting validations
exports.meetingValidations = {
create: [
body('title').trim().isLength({ min: 1, max: 255 }).withMessage('Title is required'),
body('description').optional().trim().isLength({ max: 1000 }).withMessage('Description too long'),
body('start_time').optional().isISO8601().withMessage('Invalid start time format'),
body('end_time').optional().isISO8601().withMessage('Invalid end time format'),
body('attendees').optional().isArray().withMessage('Attendees must be an array'),
body('location').optional().trim().isLength({ max: 500 }).withMessage('Location too long'),
body('meeting_url').optional().trim().isLength({ max: 500 }).withMessage('Meeting URL too long'),
body('tags').optional().isArray().withMessage('Tags must be an array'),
body('labels').optional().isArray().withMessage('Labels must be an array'),
body('calendar_source').optional().isIn(['manual', 'google', 'microsoft', 'apple']).withMessage('Invalid calendar source'),
body('external_id').optional().trim().isLength({ max: 255 }).withMessage('External ID too long'),
validate
],
update: [
param('id').isInt().withMessage('Invalid meeting ID'),
body('title').optional().trim().isLength({ min: 1, max: 255 }).withMessage('Invalid title'),
body('description').optional().trim().isLength({ max: 1000 }).withMessage('Description too long'),
body('start_time').optional().isISO8601().withMessage('Invalid start time format'),
body('end_time').optional().isISO8601().withMessage('Invalid end time format'),
body('status').optional().isIn(['active', 'completed', 'cancelled']).withMessage('Invalid status'),
body('attendees').optional().isArray().withMessage('Attendees must be an array'),
body('location').optional().trim().isLength({ max: 500 }).withMessage('Location too long'),
body('meeting_url').optional().trim().isLength({ max: 500 }).withMessage('Meeting URL too long'),
body('tags').optional().isArray().withMessage('Tags must be an array'),
body('labels').optional().isArray().withMessage('Labels must be an array'),
validate
],
list: [
query('page').optional().isInt({ min: 1 }).withMessage('Page must be a positive integer'),
query('limit').optional().isInt({ min: 1, max: 100 }).withMessage('Limit must be between 1 and 100'),
query('status').optional().isIn(['all', 'scheduled', 'in_progress', 'completed', 'cancelled','active']).withMessage('Invalid status filter'),
query('from').optional().isISO8601().withMessage('Invalid from date'),
query('to').optional().isISO8601().withMessage('Invalid to date'),
validate
],
get: [
param('id').isInt().withMessage('Invalid meeting ID'),
validate
],
delete: [
param('id').isInt().withMessage('Invalid meeting ID'),
validate
],
complete: [
param('id').isInt().withMessage('Invalid meeting ID'),
body('end_time').optional().isISO8601().withMessage('Invalid end time'),
body('duration').optional().isInt({ min: 1 }).withMessage('Duration must be positive'),
body('summary').optional().trim().isLength({ max: 5000 }).withMessage('Summary too long'),
body('participants_count').optional().isInt({ min: 0 }).withMessage('Invalid participants count'),
validate
]
};
// Add note validations
exports.noteValidations = {
list: [
param('meetingId').isInt().withMessage('Invalid meeting ID'),
validate
],
create: [
param('meetingId').isInt().withMessage('Invalid meeting ID'),
body('content_blocks').optional().isArray().withMessage('Content blocks must be an array'),
body('tags').optional().isArray().withMessage('Tags must be an array'),
body('status').optional().isIn(['draft', 'published']).withMessage('Invalid status'),
validate
],
update: [
param('id').isInt().withMessage('Invalid note ID'),
body('meetingId').isInt().withMessage('Invalid meeting ID'),
body('title').optional().trim().isLength({ max: 255 }).withMessage('Title must be max 255 characters'),
body('content_blocks').optional().isArray().withMessage('Content blocks must be an array'),
body('tags').optional().isArray().withMessage('Tags must be an array'),
body('status').optional().isIn(['draft', 'published']).withMessage('Invalid status'),
body('priority').optional().isIn(['low', 'medium', 'high', 'urgent']).withMessage('Invalid priority'),
body('color').optional().matches(/^#[0-9A-F]{6}$/i).withMessage('Color must be a valid hex color'),
body('is_pinned').optional().isBoolean().withMessage('is_pinned must be a boolean'),
validate
],
get: [
param('id').isInt().withMessage('Invalid note ID'),
validate
],
delete: [
param('id').isInt().withMessage('Invalid note ID'),
validate
],
search: [
query('q').optional().trim().isLength({ min: 1 }).withMessage('Search query too short'),
query('meetingId').optional().isInt().withMessage('Invalid meeting ID'),
query('status').optional().isIn(['draft', 'published']).withMessage('Invalid status filter'),
query('tags').optional().isArray().withMessage('Tags must be an array'),
query('from').optional().isISO8601().withMessage('Invalid from date'),
query('to').optional().isISO8601().withMessage('Invalid to date'),
query('page').optional().isInt({ min: 1 }).withMessage('Page must be a positive integer'),
query('limit').optional().isInt({ min: 1, max: 100 }).withMessage('Limit must be between 1 and 100'),
validate
]
};
// Add recording validations
exports.recordingValidations = {
upload: [
param('meetingId').isInt().withMessage('Invalid meeting ID'),
body('duration').optional().isFloat().withMessage('Duration must be a number'),
validate
],
get: [
param('meetingId').isInt().withMessage('Invalid meeting ID'),
validate
],
list: [
param('meetingId').isInt().withMessage('Invalid meeting ID'),
query('status').optional().isIn(['uploading', 'processing', 'completed', 'failed']).withMessage('Invalid status filter'),
query('page').optional().isInt({ min: 1 }).withMessage('Page must be a positive integer'),
query('limit').optional().isInt({ min: 1, max: 100 }).withMessage('Limit must be between 1 and 100'),
validate
],
delete: [
param('id').isInt().withMessage('Invalid recording ID'),
validate
],
};
// Add transcript validations
exports.transcriptValidations = {
generate: [
param('recordingId').isInt().withMessage('Invalid recording ID'),
validate
],
update: [
param('recordingId').isInt().withMessage('Invalid recording ID'),
body('content').optional().notEmpty().withMessage('Content cannot be empty'),
body('speaker_data').optional().isArray().withMessage('Speaker data must be an array'),
validate
],
get: [
param('recordingId').isInt().withMessage('Invalid recording ID'),
validate
],
getTransacript: [
param('meetingId').isInt().withMessage('Invalid meeting ID'),
validate
],
search: [
query('q').notEmpty().withMessage('Search query is required'),
query('page').optional().isInt({ min: 1 }).withMessage('Page must be a positive integer'),
query('limit').optional().isInt({ min: 1, max: 100 }).withMessage('Limit must be between 1 and 100'),
query('language').optional().isIn(['en', 'es', 'fr', 'de', 'it', 'pt', 'ru', 'ja', 'ko', 'zh', 'ar', 'hi']).withMessage('Invalid language filter'),
validate
],
};
// Add summary validations
exports.summaryValidations = {
generate: [
param('meetingId').isInt().withMessage('Invalid meeting ID'),
validate
],
update: [
param('meetingId').isInt().withMessage('Invalid meeting ID'),
body('overview').optional().trim().isLength({ min: 10, max: 5000 }).withMessage('Overview must be 10-5000 characters'),
body('decisions').optional().isArray().withMessage('Decisions must be an array'),
body('action_items').optional().isArray().withMessage('Action items must be an array'),
body('risks').optional().isArray().withMessage('Risks must be an array'),
body('questions').optional().isArray().withMessage('Questions must be an array'),
body('priority').optional().isIn(['low', 'medium', 'high', 'urgent']).withMessage('Invalid priority'),
body('visibility').optional().isIn(['private', 'team', 'organization', 'public']).withMessage('Invalid visibility setting'),
validate
],
get: [
param('meetingId').isInt().withMessage('Invalid meeting ID'),
validate
],
approve: [
param('meetingId').isInt().withMessage('Invalid meeting ID'),
validate
],
}; |
:: Command execute :: | |
--[ c99shell v. 2.5 [PHP 8 Update] [24.05.2025] | Generation time: 0.0038 ]-- |