@forzalabs/remora
Version:
A powerful CLI tool for seamless data translation.
81 lines (80 loc) • 4.24 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const AdminManager_1 = __importDefault(require("../auth/AdminManager"));
const Affirm_1 = __importDefault(require("../core/Affirm"));
const UserManager_1 = __importDefault(require("../engines/UserManager"));
const Helper_1 = __importDefault(require("../helper/Helper"));
const DatabaseEngine_1 = __importDefault(require("./DatabaseEngine"));
const DatabaseStructure_1 = __importDefault(require("./DatabaseStructure"));
const bcryptjs_1 = __importDefault(require("bcryptjs"));
class DatabaseInitializerClass {
constructor() {
this.initialize = () => __awaiter(this, void 0, void 0, function* () {
try {
yield DatabaseEngine_1.default.connect();
yield this.createCollections();
yield this.primeCollections();
}
catch (error) {
console.error('Error initializing database:', error);
throw error;
}
});
this.createCollections = () => __awaiter(this, void 0, void 0, function* () {
const db = DatabaseEngine_1.default.db();
// Get list of existing collections
const collections = yield db.listCollections().toArray();
const existingCollections = collections.map(col => col.name);
// Check and create required collections from SETTINGS
for (const collection of DatabaseStructure_1.default.collections) {
const name = collection.name;
if (!existingCollections.includes(name)) {
console.log(`Creating collection: ${name}`);
yield db.createCollection(name);
for (const index of collection.indexes) {
console.log(`Setting up index ${JSON.stringify(index)}`);
yield db.collection(name).createIndex(index);
}
}
}
console.log('Collections creation completed');
});
this.primeCollections = () => __awaiter(this, void 0, void 0, function* () {
// Create the default user of the system
(0, Affirm_1.default)(process.env.ROOT_TEMP_PASSWORD, 'Wrong system config: missing root user temp password');
const rootUser = yield DatabaseEngine_1.default.findOne(AdminManager_1.default.COLLECTION, { isRoot: true });
if (!rootUser) {
const salt = yield bcryptjs_1.default.genSalt(10);
const passHash = yield bcryptjs_1.default.hash(process.env.ROOT_TEMP_PASSWORD, salt);
const newRootUser = {
_id: Helper_1.default.uuid(),
_signature: '',
auth: { oid: null, provider: 'password' },
email: 'root@remora.com',
lastLogin: new Date().toJSON(),
name: 'Root',
roles: ['root'],
isRoot: true,
rootPasswordHash: passHash
};
console.log('Creating the default root user');
yield UserManager_1.default.update(newRootUser);
}
console.log('Collections priming completed');
});
}
}
const DatabaseInitializer = new DatabaseInitializerClass();
exports.default = DatabaseInitializer;