UNPKG

mongorai

Version:

Light MongoDB client for the web. Minimalistic UI used React with minimum dependencies.

242 lines (241 loc) 8.36 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.api = void 0; const express = __importStar(require("express")); const bodyParser = __importStar(require("body-parser")); const index_js_1 = require("../lib/index.js"); const index_js_2 = require("../middlewares/index.js"); exports.api = express.Router(); exports.api.get('/readonly', async (_, res) => { return res.json({ ok: true, readOnly: (process.env.MONGORAI_READ_ONLY_MODE === 'true'), }); }); exports.api.get('/servers', async (_, res) => { const servers = await index_js_1.Init.mongoManager.getServersJson(); return res.json(servers); }); exports.api.put('/servers', bodyParser.json(), async (req, res, next) => { try { await index_js_1.Init.hostsManager.add(req.body.url); await index_js_1.Init.mongoManager.load(); } catch (err) { return next(err); } return res.json({ ok: true }); }); exports.api.delete('/servers/:server', async (req, res, next) => { try { await index_js_1.Init.hostsManager.remove(req.params.server); index_js_1.Init.mongoManager.removeServer(req.params.server); } catch (err) { return next(err); } return res.json({ ok: true }); }); exports.api.get('/servers/:server/databases', async (req, res, next) => { const server = req.params.server; try { const databases = await index_js_1.Init.mongoManager.getDatabasesJson(server); return res.json(databases); } catch (err) { return next(err); } }); exports.api.get('/servers/:server/databases/:database/collections', async (req, res, next) => { const server = req.params.server; const database = req.params.database; try { const collections = await index_js_1.Init.mongoManager.getCollectionsJson(server, database); return res.json(collections); } catch (err) { return next(err); } }); exports.api.get('/servers/:server/databases/:database/collections/:collection/documents/:document', async (req, res, next) => { const server = req.params.server; const database = req.params.database; const collection = req.params.collection; const document = req.params.document; try { const c = await index_js_1.Init.mongoManager.getCollection(server, database, collection); if (!c) { return next(new Error(`Collection not found: ${server}.${database}.${collection}`)); } const doc = await c.findOne(document); if (!doc) { return next(new Error("This document does not exist")); } return res.json({ ok: true, document: doc }); } catch (err) { return next(err); } }); exports.api.post('/servers/:server/databases/:database/collections/:collection/documents/:document', index_js_2.writeEnabled, bodyParser.json(), async (req, res, next) => { const server = req.params.server; const database = req.params.database; const collection = req.params.collection; const document = req.params.document; const partial = req.query.partial === 'true'; try { const c = await index_js_1.Init.mongoManager.getCollection(server, database, collection); if (!c) { return next(new Error(`Collection not found: ${server}.${database}.${collection}`)); } const update = await c.updateOne(document, req.body, partial); return res.json({ ok: true, update: update }); } catch (err) { return next(err); } }); exports.api.delete('/servers/:server/databases/:database/collections/:collection/documents/:document', index_js_2.writeEnabled, async (req, res, next) => { const server = req.params.server; const database = req.params.database; const collection = req.params.collection; const document = req.params.document; try { const c = await index_js_1.Init.mongoManager.getCollection(server, database, collection); if (!c) { return next(new Error(`Collection not found: ${server}.${database}.${collection}`)); } await c.removeOne(document); return res.json({ ok: true }); } catch (err) { return next(err); } }); exports.api.get('/servers/:server/databases/:database/collections/:collection/query', async (req, res, next) => { const server = req.params.server; const database = req.params.database; const collection = req.params.collection; let dbQuery = (!req.query?.q || req.query?.q === '') ? {} : req.query.q; if (typeof dbQuery !== "object") { try { dbQuery = JSON.parse(String(dbQuery)); } catch (err) { return next(new Error(`Invalid query: ${dbQuery}`)); } } let sort = req.query.sort || "{}"; if (sort && typeof sort !== "object") { try { sort = JSON.parse(sort); } catch (err) { return next(new Error(`Invalid order: ${sort}`)); } } let project = req.query.project || ""; if (project && typeof project !== "object") { try { project = JSON.parse(project); } catch (err) { return next(new Error(`Invalid project: ${project}`)); } } let limit = parseInt(req.query.limit, 10); if (isNaN(limit)) { limit = 20; } let skip = parseInt(req.query.skip, 10); if (isNaN(skip)) { skip = 0; } const findedCollection = await index_js_1.Init.mongoManager.getCollection(server, database, collection); if (!findedCollection) { return next(new Error(`Collection not found: ${server}.${database}.${collection}`)); } try { const results = await findedCollection.find(dbQuery, project, sort, limit, skip); return res.json({ ok: true, results: results }); } catch (err) { return next(err); } }); exports.api.get('/servers/:server/databases/:database/collections/:collection/count', async (req, res, next) => { const server = req.params.server; const database = req.params.database; const collection = req.params.collection; let query = req.query.q; if (typeof query !== "object") { try { query = JSON.parse(query); } catch (err) { return next(new Error(`Invalid query: ${query}`)); } } const findedCollection = await index_js_1.Init.mongoManager.getCollection(server, database, collection); if (!findedCollection) { return next(new Error(`Collection not found: ${server}.${database}.${collection}`)); } try { const count = await findedCollection.count(query); return res.json({ ok: true, count: count }); } catch (err) { return next(err); } });