!C99Shell v. 2.5 [PHP 8 Update] [24.05.2025]!

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
2025 x86_64
 

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
Free 25.88 GB of 117.98 GB (21.93%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Self remove    Logout    


Viewing file:     validation.js (10.24 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
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 ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.5 [PHP 8 Update] [24.05.2025] | Generation time: 0.0038 ]--