streamby-core
Version:
StreamBy middleware framework for media storage management
91 lines (90 loc) • 4.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.nosqlAdapter = exports.createNoSQLRawExportCollection = exports.createNoSQLExportCollection = exports.ensureCollectionsExist = void 0;
const mongodb_1 = require("mongodb");
const ensureCollectionsExist = async (client) => {
const db = client.db();
// Ensure 'projects' collection exists and define its schema implicitly
// Schema: { _id: ObjectId, name: string, description: string, dbType: string, createdAt: Date, updatedAt: Date, members: [{ userId: string, archived: boolean }] }
const projectsCollection = db.collection('projects');
await projectsCollection.findOne({}); // Attempt to find one to ensure collection is created if it doesn't exist
console.log('✅ "projects" collection ensured to exist.');
// Ensure 'exports' collection exists and define its schema implicitly
// Schema: { _id: ObjectId, projectId: ObjectId, status: string, filePath: string, createdAt: Date, updatedAt: Date }
const exportsCollection = db.collection('exports');
await exportsCollection.findOne({}); // Attempt to find one to ensure collection is created if it doesn't exist
console.log('✅ "exports" collection ensured to exist.');
};
exports.ensureCollectionsExist = ensureCollectionsExist;
const createNoSQLExportCollection = async (connection, projectId, exportName, fields) => {
const db = connection.db();
const slug = exportName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
const collectionName = `export_${projectId}_${slug}`;
// Create the collection implicitly by inserting the metadata document
const metadataDocument = {
__metadata: {
fields,
createdAt: new Date(),
updatedAt: new Date(),
},
};
await db.collection(collectionName).insertOne(metadataDocument);
console.log(`✅ Collection '${collectionName}' created with metadata.`);
return { collectionName, exportId: collectionName };
};
exports.createNoSQLExportCollection = createNoSQLExportCollection;
const createNoSQLRawExportCollection = async (connection, projectId, exportName, method, jsonData) => {
const db = connection.db();
const slug = exportName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
const collectionName = `raw_export_${projectId}_${slug}`;
// Insert the raw JSON data directly into the new collection
const result = await db.collection(collectionName).insertOne({ json: jsonData, name: exportName, method, collectionName, createdAt: new Date(), updatedAt: new Date() });
console.log(`✅ Raw collection '${collectionName}' created with provided JSON data.`);
return { collectionName, exportId: result.insertedId.toHexString() };
};
exports.createNoSQLRawExportCollection = createNoSQLRawExportCollection;
exports.nosqlAdapter = {
find: async (connection, tableName, filter) => {
const db = connection.db();
const result = await db.collection(tableName).find(filter).toArray();
return result;
},
findOne: async (connection, tableName, filter) => {
const db = connection.db();
let processedFilter = { ...filter };
if (processedFilter._id && typeof processedFilter._id === 'string') {
processedFilter._id = new mongodb_1.ObjectId(processedFilter._id);
}
const result = await db.collection(tableName).findOne(processedFilter);
return result;
},
create: async (connection, tableName, data) => {
const db = connection.db();
const result = await db.collection(tableName).insertOne(data);
return { ...data, _id: result.insertedId };
},
update: async (connection, tableName, filter, data) => {
const db = connection.db();
let processedFilter = { ...filter };
if (processedFilter._id && typeof processedFilter._id === 'string') {
processedFilter._id = new mongodb_1.ObjectId(processedFilter._id);
}
// Check if the update data contains MongoDB update operators (e.g., $set, $push)
const isUpdateOperator = Object.keys(data).some(key => key.startsWith('$'));
const updateDocument = isUpdateOperator ? data : { $set: data };
const result = await db.collection(tableName).findOneAndUpdate(processedFilter, updateDocument, { returnDocument: 'after' });
if (!result) {
return null;
}
return result;
},
delete: async (connection, tableName, filter) => {
const db = connection.db();
let processedFilter = { ...filter };
if (processedFilter._id && typeof processedFilter._id === 'string') {
processedFilter._id = new mongodb_1.ObjectId(processedFilter._id);
}
const result = await db.collection(tableName).deleteMany(processedFilter);
return result.deletedCount;
},
};