feat: Complete critical CouchDB migration fixes and infrastructure improvements
- Fix design document initialization with proper null handling - Fix bulk operations in migration script (bulkDocs method signature) - Remove hardcoded credentials from docker-compose.yml - Fix test infrastructure incompatibility (use npm/Jest instead of bun) - Implement comprehensive database indexes for performance - Add health check endpoint for Docker container monitoring - Create 7 design documents: users, streets, tasks, posts, badges, transactions, general - Update jest.setup.js with proper mock exports - Add .env.example with secure defaults 🤖 Generated with [AI Assistant] Co-Authored-By: AI Assistant <noreply@ai-assistant.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// Mock CouchDB service globally for all tests
|
||||
jest.mock('../services/couchdbService', () => ({
|
||||
const mockCouchdbService = {
|
||||
initialize: jest.fn().mockResolvedValue(true),
|
||||
isReady: jest.fn().mockReturnValue(true),
|
||||
isConnected: true,
|
||||
@@ -27,9 +27,15 @@ jest.mock('../services/couchdbService', () => ({
|
||||
update: jest.fn(),
|
||||
updateUserPoints: jest.fn(),
|
||||
getDocument: jest.fn(),
|
||||
findDocumentById: jest.fn(),
|
||||
bulkDocs: jest.fn(),
|
||||
shutdown: jest.fn().mockResolvedValue(true),
|
||||
}));
|
||||
};
|
||||
|
||||
jest.mock('../services/couchdbService', () => mockCouchdbService);
|
||||
|
||||
// Make the mock available for tests to reference
|
||||
global.mockCouchdbService = mockCouchdbService;
|
||||
|
||||
// Set test environment variables
|
||||
process.env.JWT_SECRET = 'test-jwt-secret';
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "cross-env NODE_ENV=test jest",
|
||||
"test:watch": "cross-env NODE_ENV=test jest --watch",
|
||||
"test:coverage": "cross-env NODE_ENV=test jest --coverage",
|
||||
"test:verbose": "cross-env NODE_ENV=test jest --verbose",
|
||||
"test": "cross-env NODE_ENV=test node_modules/.bin/jest",
|
||||
"test:watch": "cross-env NODE_ENV=test node_modules/.bin/jest --watch",
|
||||
"test:coverage": "cross-env NODE_ENV=test node_modules/.bin/jest --coverage",
|
||||
"test:verbose": "cross-env NODE_ENV=test node_modules/.bin/jest --verbose",
|
||||
"start": "bun server.js",
|
||||
"dev": "bunx nodemon server.js",
|
||||
"seed:badges": "bun scripts/seedBadges.js",
|
||||
|
||||
@@ -292,7 +292,7 @@ class MigrationService {
|
||||
|
||||
// Batch insert
|
||||
if (transformedDocs.length > 0) {
|
||||
const result = await couchdbService.bulkDocs({ docs: transformedDocs });
|
||||
const result = await couchdbService.bulkDocs(transformedDocs);
|
||||
|
||||
// Count successful migrations
|
||||
const successful = result.filter(r => r.ok).length;
|
||||
@@ -490,7 +490,7 @@ class MigrationService {
|
||||
];
|
||||
|
||||
if (allDocs.length > 0) {
|
||||
const result = await couchdbService.bulkDocs({ docs: allDocs });
|
||||
const result = await couchdbService.bulkDocs(allDocs);
|
||||
const successful = result.filter(r => r.ok).length;
|
||||
console.log(`✅ Successfully updated ${successful}/${allDocs.length} documents with relationship data`);
|
||||
}
|
||||
|
||||
@@ -430,18 +430,20 @@ class CouchDBService {
|
||||
// Check if design document exists
|
||||
const existing = await this.getDocument(designDoc._id);
|
||||
|
||||
// Update with new revision
|
||||
designDoc._rev = existing._rev;
|
||||
await this.makeRequest('PUT', `/${this.dbName}/${designDoc._id}`, designDoc);
|
||||
console.log(`Updated design document: ${designDoc._id}`);
|
||||
} catch (error) {
|
||||
if (error.statusCode === 404) {
|
||||
// Create new design document
|
||||
if (existing) {
|
||||
// Update with new revision
|
||||
designDoc._rev = existing._rev;
|
||||
await this.makeRequest('PUT', `/${this.dbName}/${designDoc._id}`, designDoc);
|
||||
console.log(`Created design document: ${designDoc._id}`);
|
||||
console.log(`Updated design document: ${designDoc._id}`);
|
||||
} else {
|
||||
console.error(`Error creating design document ${designDoc._id}:`, error.message);
|
||||
// Create new design document
|
||||
const designDocToCreate = { ...designDoc };
|
||||
delete designDocToCreate._rev;
|
||||
await this.makeRequest('PUT', `/${this.dbName}/${designDoc._id}`, designDocToCreate);
|
||||
console.log(`Created design document: ${designDoc._id}`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Error creating design document ${designDoc._id}:`, error.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user