UNPKG

gamoraa-mongostore

Version:

Plugin provides firestore kind of functionality but based on mongodb.

472 lines 24.2 kB
"use strict"; 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 path_1 = __importDefault(require("path")); const stream_1 = require("stream"); const grpc_boom_1 = __importDefault(require("grpc-boom")); const types_1 = require("./types"); const service_utils_1 = require("./utils/service-utils"); const transform_utils_1 = require("./utils/transform-utils"); /** * */ const FIRESTORE_PROTO_PATH = path_1.default.join(__dirname, '../../proto/mongo_store.proto'); function mongoStoreService(server, config, done) { return __awaiter(this, void 0, void 0, function* () { const modelsMap = service_utils_1.createModelsMap(config.modelsOptions || []); const serviceContext = server.addService(FIRESTORE_PROTO_PATH, 'MongoStoreService', { /** * * @param context */ create: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } // const { model, create, readRoles, writeRoles } = modelsMap[colName]; if ((_a = create) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Create, readRoles, writeRoles, create); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const doc = yield service_utils_1.createDocument(model, context.request); context.send({ data: JSON.stringify(doc) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ insertMany: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, insertMany, readRoles, writeRoles } = modelsMap[colName]; if ((_a = insertMany) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Create, readRoles, writeRoles, insertMany); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const doc = yield service_utils_1.insertManyDocuments(model, context.request); context.send({ data: JSON.stringify(doc) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ findById: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, findById, readRoles, writeRoles } = modelsMap[colName]; if ((_a = findById) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Read, readRoles, writeRoles, findById); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const doc = yield service_utils_1.findByIdDocument(model, context.request); context.send({ data: JSON.stringify(doc) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ findOne: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, findOne, readRoles, writeRoles } = modelsMap[colName]; if ((_a = findOne) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Read, readRoles, writeRoles, findOne); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const doc = yield service_utils_1.findOneDocument(model, context.request); context.send({ data: JSON.stringify(doc) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ find: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, find, readRoles, writeRoles } = modelsMap[colName]; if ((_a = find) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Read, readRoles, writeRoles, find); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const doc = yield service_utils_1.findDocuments(model, context.request); context.send({ data: JSON.stringify(doc) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ findAndStreamResponse: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, findAndStreamResponse, readRoles, writeRoles, } = modelsMap[colName]; if ((_a = findAndStreamResponse) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Read, readRoles, writeRoles, findAndStreamResponse); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const cursor = service_utils_1.findDocumentsAndStreamResponse(model, context.request).map(transform_utils_1.transformResponse); stream_1.pipeline(cursor, context.call, err => { }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ findLive: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, findLive, readRoles, writeRoles } = modelsMap[colName]; if ((_a = findLive) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Read, readRoles, writeRoles, findLive); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const doc = yield service_utils_1.findDocuments(model, context.request); context.write({ data: JSON.stringify(doc) }); const changeStream = service_utils_1.findDocumentsLive(model, context.request); stream_1.pipeline(changeStream, new transform_utils_1.ChangeStreamToFindRecordsTransform(model, context.request), context.call, err => { }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ findByIdAndUpdate: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, findByIdAndUpdate, readRoles, writeRoles, } = modelsMap[colName]; if ((_a = findByIdAndUpdate) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Update, readRoles, writeRoles, findByIdAndUpdate); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const doc = yield service_utils_1.findByIdAndUpdateDocument(model, context.request); context.send({ data: JSON.stringify(doc) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ findOneAndUpdate: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, findOneAndUpdate, readRoles, writeRoles, } = modelsMap[colName]; if ((_a = findOneAndUpdate) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Update, readRoles, writeRoles, findOneAndUpdate); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const doc = yield service_utils_1.findOneAndUpdateDocument(model, context.request); context.send({ data: JSON.stringify(doc) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ updateMany: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, updateMany, readRoles, writeRoles } = modelsMap[colName]; if ((_a = updateMany) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Update, readRoles, writeRoles, updateMany); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const doc = yield service_utils_1.updateManyDocuments(model, context.request); context.send({ data: JSON.stringify(doc) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ findByIdAndDelete: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, findByIdAndDelete, readRoles, writeRoles, } = modelsMap[colName]; if ((_a = findByIdAndDelete) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Delete, readRoles, writeRoles, findByIdAndDelete); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const doc = yield service_utils_1.findByIdAndDeleteDocument(model, context.request); context.send({ data: JSON.stringify(doc) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ findOneAndDelete: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, findOneAndDelete, readRoles, writeRoles, } = modelsMap[colName]; if ((_a = findOneAndDelete) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Delete, readRoles, writeRoles, findOneAndDelete); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const doc = yield service_utils_1.findOneAndDeleteDocument(model, context.request); context.send({ data: JSON.stringify(doc) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ deleteMany: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, deleteMany, readRoles, writeRoles } = modelsMap[colName]; if ((_a = deleteMany) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Delete, readRoles, writeRoles, deleteMany); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const doc = yield service_utils_1.deleteManyDocuments(model, context.request); context.send({ data: JSON.stringify(doc) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ countDocuments: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, countDocuments, readRoles, writeRoles, } = modelsMap[colName]; if ((_a = countDocuments) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Read, readRoles, writeRoles, countDocuments); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const count = yield service_utils_1.countDocumentsUtil(model, context.request); context.send({ data: JSON.stringify(count) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ estimatedDocumentCount: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, estimatedDocumentCount, readRoles, writeRoles, } = modelsMap[colName]; if ((_a = estimatedDocumentCount) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Read, readRoles, writeRoles, estimatedDocumentCount); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const count = yield service_utils_1.estimatedDocumentCountUtil(model, context.request); context.send({ data: JSON.stringify(count) }); } catch (error) { context.halt(error); } }); }, /** * * @param context */ watch: function (context) { var _a; return __awaiter(this, void 0, void 0, function* () { const colName = context.request.collection; const err = service_utils_1.checkModelExist(colName, modelsMap); if (err) { return context.halt(err); } const { model, watch, readRoles, writeRoles } = modelsMap[colName]; if ((_a = watch) === null || _a === void 0 ? void 0 : _a.disable) { return context.halt(grpc_boom_1.default.notFound('Not found')); } const routeMiddlewares = service_utils_1.createRouteMiddlewares(types_1.ActionType.Read, readRoles, writeRoles, watch); try { yield service_utils_1.executeRouteMiddlewares(context, routeMiddlewares); const readStream = service_utils_1.watchUtil(model, context.request).stream({ transform: transform_utils_1.transformResponse }); stream_1.pipeline(readStream, context.call, err => { }); } catch (error) { context.halt(error); } }); }, }); if (config.middleware) { serviceContext.with(config.middleware); } done(); }); } exports.default = mongoStoreService; //# sourceMappingURL=mongo-store-service.js.map