adpa-enterprise-framework-automation
Version:
Modular, standards-compliant Node.js/TypeScript automation framework for enterprise requirements, project, and data management. Provides CLI and API for BABOK v3, PMBOK 7th Edition, and DMBOK 2.0 (in progress). Production-ready Express.js API with TypeSpe
193 lines • 9.54 kB
JavaScript
import Joi from 'joi';
// Review Status enum validation
const reviewStatusSchema = Joi.string().valid('pending_assignment', 'assigned', 'in_review', 'feedback_provided', 'approved', 'rejected', 'revision_requested', 'completed');
// Reviewer Role enum validation
const reviewerRoleSchema = Joi.string().valid('subject_matter_expert', 'technical_reviewer', 'compliance_officer', 'project_manager', 'business_analyst', 'quality_assurance', 'stakeholder');
// Review Priority enum validation
const reviewPrioritySchema = Joi.string().valid('low', 'medium', 'high', 'critical');
// Feedback Type enum validation
const feedbackTypeSchema = Joi.string().valid('content_accuracy', 'technical_compliance', 'formatting', 'completeness', 'clarity', 'stakeholder_alignment', 'regulatory_compliance');
// Review Decision enum validation
const reviewDecisionSchema = Joi.string().valid('approve', 'reject', 'request_revision');
// Create Review Request Schema
export const createReviewSchema = Joi.object({
documentId: Joi.string().required(),
documentName: Joi.string().required(),
documentType: Joi.string().required(),
documentPath: Joi.string().required(),
projectId: Joi.string().required(),
priority: reviewPrioritySchema.default('medium'),
dueDate: Joi.date().iso().optional(),
requiredRoles: Joi.array().items(reviewerRoleSchema).optional(),
specificReviewers: Joi.array().items(Joi.string()).optional(),
workflowId: Joi.string().optional(),
metadata: Joi.object().optional()
});
// Assign Reviewer Request Schema
export const assignReviewerSchema = Joi.object({
reviewerId: Joi.string().required(),
role: reviewerRoleSchema.required(),
estimatedHours: Joi.number().min(1).max(40).optional(),
dueDate: Joi.date().iso().optional()
});
// Review Feedback Schema
const reviewFeedbackSchema = Joi.object({
type: feedbackTypeSchema.required(),
severity: Joi.string().valid('info', 'minor', 'major', 'critical').required(),
section: Joi.string().optional(),
lineNumber: Joi.number().min(1).optional(),
title: Joi.string().required(),
description: Joi.string().required(),
suggestion: Joi.string().optional(),
originalText: Joi.string().optional(),
suggestedText: Joi.string().optional()
});
// Submit Feedback Request Schema
export const submitFeedbackSchema = Joi.object({
roundNumber: Joi.number().min(1).required(),
feedback: Joi.array().items(reviewFeedbackSchema).required(),
decision: reviewDecisionSchema.required(),
overallComments: Joi.string().optional(),
qualityScore: Joi.number().min(0).max(100).optional()
});
// Update Review Status Schema
export const updateReviewStatusSchema = Joi.object({
status: reviewStatusSchema.required(),
comments: Joi.string().optional()
});
// Review Search Parameters Schema
export const reviewSearchSchema = Joi.object({
status: Joi.alternatives().try(reviewStatusSchema, Joi.array().items(reviewStatusSchema)).optional(),
priority: Joi.alternatives().try(reviewPrioritySchema, Joi.array().items(reviewPrioritySchema)).optional(),
documentType: Joi.alternatives().try(Joi.string(), Joi.array().items(Joi.string())).optional(),
projectId: Joi.string().optional(),
reviewerId: Joi.string().optional(),
dateFrom: Joi.date().iso().optional(),
dateTo: Joi.date().iso().optional(),
limit: Joi.number().min(1).max(100).default(20),
offset: Joi.number().min(0).default(0),
sortBy: Joi.string().valid('createdAt', 'dueDate', 'priority', 'status').default('createdAt'),
sortOrder: Joi.string().valid('asc', 'desc').default('desc')
});
// Reviewer Profile Schemas
export const createReviewerProfileSchema = Joi.object({
userId: Joi.string().required(),
name: Joi.string().required(),
email: Joi.string().email().required(),
title: Joi.string().required(),
department: Joi.string().required(),
organization: Joi.string().required(),
roles: Joi.array().items(reviewerRoleSchema).min(1).required(),
expertise: Joi.array().items(Joi.string()).min(1).required(),
certifications: Joi.array().items(Joi.string()).default([]),
experienceYears: Joi.number().min(0).required(),
availability: Joi.object({
hoursPerWeek: Joi.number().min(1).max(168).required(),
timeZone: Joi.string().required(),
workingHours: Joi.object({
start: Joi.string().pattern(/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/).required(),
end: Joi.string().pattern(/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/).required()
}).required(),
workingDays: Joi.array().items(Joi.number().min(0).max(6)).required(),
unavailableDates: Joi.array().items(Joi.date().iso()).default([]),
maxConcurrentReviews: Joi.number().min(1).default(3)
}).optional(),
preferences: Joi.object({
preferredDocumentTypes: Joi.array().items(Joi.string()).default([]),
preferredProjectTypes: Joi.array().items(Joi.string()).default([]),
notificationPreferences: Joi.object({
email: Joi.boolean().default(true),
inApp: Joi.boolean().default(true),
sms: Joi.boolean().default(false)
}).default(),
reminderFrequency: Joi.string().valid('none', 'daily', 'weekly').default('daily')
}).optional()
});
export const updateReviewerProfileSchema = Joi.object({
name: Joi.string().optional(),
email: Joi.string().email().optional(),
title: Joi.string().optional(),
department: Joi.string().optional(),
organization: Joi.string().optional(),
roles: Joi.array().items(reviewerRoleSchema).min(1).optional(),
expertise: Joi.array().items(Joi.string()).min(1).optional(),
certifications: Joi.array().items(Joi.string()).optional(),
experienceYears: Joi.number().min(0).optional(),
availability: Joi.object({
hoursPerWeek: Joi.number().min(1).max(168).optional(),
timeZone: Joi.string().optional(),
workingHours: Joi.object({
start: Joi.string().pattern(/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/).optional(),
end: Joi.string().pattern(/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/).optional()
}).optional(),
workingDays: Joi.array().items(Joi.number().min(0).max(6)).optional(),
unavailableDates: Joi.array().items(Joi.date().iso()).optional(),
maxConcurrentReviews: Joi.number().min(1).optional()
}).optional(),
preferences: Joi.object({
preferredDocumentTypes: Joi.array().items(Joi.string()).optional(),
preferredProjectTypes: Joi.array().items(Joi.string()).optional(),
notificationPreferences: Joi.object({
email: Joi.boolean().optional(),
inApp: Joi.boolean().optional(),
sms: Joi.boolean().optional()
}).optional(),
reminderFrequency: Joi.string().valid('none', 'daily', 'weekly').optional()
}).optional(),
isActive: Joi.boolean().optional()
});
export const updateAvailabilitySchema = Joi.object({
hoursPerWeek: Joi.number().min(1).max(168).required(),
timeZone: Joi.string().required(),
workingHours: Joi.object({
start: Joi.string().pattern(/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/).required(),
end: Joi.string().pattern(/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/).required()
}).required(),
workingDays: Joi.array().items(Joi.number().min(0).max(6)).required(),
unavailableDates: Joi.array().items(Joi.date().iso()).default([]),
maxConcurrentReviews: Joi.number().min(1).required()
});
export const updatePreferencesSchema = Joi.object({
preferredDocumentTypes: Joi.array().items(Joi.string()).required(),
preferredProjectTypes: Joi.array().items(Joi.string()).required(),
notificationPreferences: Joi.object({
email: Joi.boolean().required(),
inApp: Joi.boolean().required(),
sms: Joi.boolean().required()
}).required(),
reminderFrequency: Joi.string().valid('none', 'daily', 'weekly').required()
});
// Reviewer Search Parameters Schema
export const reviewerSearchSchema = Joi.object({
roles: Joi.alternatives().try(reviewerRoleSchema, Joi.array().items(reviewerRoleSchema)).optional(),
expertise: Joi.alternatives().try(Joi.string(), Joi.array().items(Joi.string())).optional(),
department: Joi.string().optional(),
organization: Joi.string().optional(),
minExperience: Joi.number().min(0).optional(),
minQualityScore: Joi.number().min(0).max(100).optional(),
limit: Joi.number().min(1).max(100).default(20),
offset: Joi.number().min(0).default(0),
sortBy: Joi.string().default('metrics.averageQualityScore'),
sortOrder: Joi.string().valid('asc', 'desc').default('desc')
});
// Available Reviewers Query Schema
export const availableReviewersSchema = Joi.object({
role: reviewerRoleSchema.required(),
documentType: Joi.string().optional()
});
// Analytics Query Schema
export const analyticsQuerySchema = Joi.object({
startDate: Joi.date().iso().optional(),
endDate: Joi.date().iso().optional()
});
// Review Stats Query Schema
export const reviewStatsSchema = Joi.object({
projectId: Joi.string().optional(),
reviewerId: Joi.string().optional()
});
// Leaderboard Query Schema
export const leaderboardQuerySchema = Joi.object({
metric: Joi.string().valid('averageQualityScore', 'onTimeCompletionRate', 'completedReviews', 'feedbackQualityScore', 'thoroughnessScore').default('averageQualityScore'),
limit: Joi.number().min(1).max(50).default(10)
});
//# sourceMappingURL=reviewSchemas.js.map