video-accessibility/scripts/mongodb-init.js
michael e6578e0ccf add approved_source and qc_feedback job statuses to MongoDB schema
- Add migration to update jobs collection validator with new statuses
- Update mongodb-init.js for fresh deployments
- Fix deploy.sh to properly run migrations with 'python migrate.py up'

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-22 13:12:14 -06:00

147 lines
5.5 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// =============================================================================
// MongoDB Initialization Script for Accessible Video Platform
// =============================================================================
// Run this script ONCE after starting the MongoDB container
// Usage: docker-compose exec mongodb mongosh < scripts/mongodb-init.js
// =============================================================================
// Connect to the accessible_video database
db = db.getSiblingDB('accessible_video');
print('=============================================================================');
print('MongoDB Initialization for Accessible Video Platform');
print('=============================================================================');
// -----------------------------------------------------------------------------
// Create Collections with Validation
// -----------------------------------------------------------------------------
print('\n1. Creating collections with schema validation...');
// Jobs collection
db.createCollection('jobs', {
validator: {
$jsonSchema: {
bsonType: 'object',
required: ['_id', 'title', 'status', 'client_id', 'created_at', 'updated_at'],
properties: {
_id: { bsonType: 'string' },
title: { bsonType: 'string' },
status: {
enum: ['created', 'ingesting', 'ai_processing', 'pending_qc',
'approved_english', 'approved_source', 'rejected', 'qc_feedback',
'translating', 'tts_generating', 'pending_final_review', 'completed']
},
client_id: { bsonType: 'string' },
created_at: { bsonType: 'date' },
updated_at: { bsonType: 'date' }
}
}
}
});
print(' Created jobs collection');
// Users collection
db.createCollection('users', {
validator: {
$jsonSchema: {
bsonType: 'object',
required: ['_id', 'email', 'hashed_password', 'role', 'created_at'],
properties: {
_id: { bsonType: 'string' },
email: { bsonType: 'string' },
hashed_password: { bsonType: 'string' },
role: { enum: ['client', 'reviewer', 'admin'] },
is_active: { bsonType: 'bool' },
created_at: { bsonType: 'date' }
}
}
}
});
print(' Created users collection');
// Audit logs collection
db.createCollection('audit_logs');
print(' Created audit_logs collection');
// -----------------------------------------------------------------------------
// Create Indexes for Performance
// -----------------------------------------------------------------------------
print('\n2. Creating indexes for optimized queries...');
// Jobs collection indexes
db.jobs.createIndex({ 'status': 1, 'created_at': -1 }, { name: 'idx_status_created' });
print(' Created index: jobs.idx_status_created');
db.jobs.createIndex({ 'client_id': 1 }, { name: 'idx_client_id' });
print(' Created index: jobs.idx_client_id');
db.jobs.createIndex({ 'created_at': -1 }, { name: 'idx_created_at' });
print(' Created index: jobs.idx_created_at');
// Users collection indexes
db.users.createIndex({ 'email': 1 }, { unique: true, name: 'idx_email_unique' });
print(' Created index: users.idx_email_unique (unique)');
db.users.createIndex({ 'role': 1 }, { name: 'idx_role' });
print(' Created index: users.idx_role');
// Audit logs collection indexes
db.audit_logs.createIndex({ 'timestamp': -1 }, { name: 'idx_timestamp' });
print(' Created index: audit_logs.idx_timestamp');
db.audit_logs.createIndex({ 'action': 1, 'timestamp': -1 }, { name: 'idx_action_timestamp' });
print(' Created index: audit_logs.idx_action_timestamp');
db.audit_logs.createIndex({ 'user_id': 1, 'timestamp': -1 }, { name: 'idx_user_timestamp' });
print(' Created index: audit_logs.idx_user_timestamp');
db.audit_logs.createIndex({ 'severity': 1, 'timestamp': -1 }, { name: 'idx_severity_timestamp' });
print(' Created index: audit_logs.idx_severity_timestamp');
db.audit_logs.createIndex({ 'resource_type': 1, 'resource_id': 1 }, { name: 'idx_resource' });
print(' Created index: audit_logs.idx_resource');
// Text search index for audit logs
db.audit_logs.createIndex(
{
'description': 'text',
'details': 'text',
'error_message': 'text'
},
{
name: 'idx_text_search',
weights: {
'description': 10,
'details': 5,
'error_message': 8
}
}
);
print(' Created index: audit_logs.idx_text_search (full-text)');
// -----------------------------------------------------------------------------
// Display Database Statistics
// -----------------------------------------------------------------------------
print('\n3. Database initialization complete!');
print('\nDatabase statistics:');
print('-------------------');
const stats = db.stats();
print('Database: ' + stats.db);
print('Collections: ' + stats.collections);
print('Indexes: ' + stats.indexes);
print('Data Size: ' + (stats.dataSize / 1024).toFixed(2) + ' KB');
print('Storage Size: ' + (stats.storageSize / 1024).toFixed(2) + ' KB');
print('\nCollections created:');
db.getCollectionNames().forEach(function(collName) {
const collStats = db.getCollection(collName).stats();
const indexCount = db.getCollection(collName).getIndexes().length;
print(' - ' + collName + ' (indexes: ' + indexCount + ')');
});
print('\n=============================================================================');
print('Next steps:');
print('1. Run migrations: docker-compose exec api python migrate.py');
print('2. Create admin user: docker-compose exec api python create_test_users.py');
print('=============================================================================');