gamoraa-mongostore
Version:
Plugin provides firestore kind of functionality but based on mongodb.
472 lines • 24.2 kB
JavaScript
"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