UNPKG

axiodb

Version:

The Pure JavaScript Alternative to SQLite. Embedded NoSQL database for Node.js with MongoDB-style queries, zero native dependencies, built-in InMemoryCache, and web GUI. Perfect for desktop apps, CLI tools, and embedded systems. No compilation, no platfor

484 lines 26.8 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 }); /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable prefer-const */ const outers_1 = require("outers"); const responseBuilder_helper_1 = __importDefault(require("../../helper/responseBuilder.helper")); /** * CRUD Controller class for handling database operations */ class CRUDController { constructor(AxioDBInstance) { this.AxioDBInstance = AxioDBInstance; } /** * Retrieves all documents from a specified collection with pagination. * * @param request - The Fastify request object containing query parameters * @param request.query.dbName - The name of the database to query * @param request.query.collectionName - The name of the collection to query * @param request.query.page - The page number for pagination (starts from 1) * * @returns A response object with: * - Status code 200 and documents data if successful * - Status code 400 if database name, collection name, or page number is invalid * - Status code 404 if no documents are found * * @example * // GET /documents?dbName=users&collectionName=profiles&page=1 */ getAllDocuments(request) { return __awaiter(this, void 0, void 0, function* () { // Extracting parameters from the request body let { dbName, collectionName, page } = request.query; page = parseInt(String(page)); // Validating extracted parameters if (!dbName || typeof dbName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid database name"); } if (!collectionName || typeof collectionName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid collection name"); } if (typeof page !== "number" || page < 1) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid page number"); } const skip = (page - 1) * 10; const databaseInstance = yield this.AxioDBInstance.createDB(dbName); const DB_Collection = yield databaseInstance.createCollection(collectionName); // Find All Data const allDocuments = yield DB_Collection.query({}) .Limit(10) .Sort({ updatedAt: -1 }) .Skip(skip) .exec(); if (!allDocuments.data) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.NOT_FOUND, "No documents found"); } return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.OK, "Documents retrieved successfully", allDocuments); }); } /** * Retrieves documents from a specified collection based on a query with pagination. * * @param request - The Fastify request object containing query parameters and body data. * @param request.query - Query parameters for the database and collection. * @param request.query.dbName - The name of the database to query. * @param request.query.collectionName - The name of the collection to query. * @param request.query.page - The page number for pagination (starts from 1). * @param request.body - The request body containing the query object. * @param request.body.query - The query object to filter documents. * * @returns A response object with: * - Status code 200 and the retrieved documents if successful. * - Status code 400 if any required parameters are invalid. * - Status code 404 if no documents are found. * * @example * // Example request: * { * query: { * dbName: "users", * collectionName: "profiles", * page: 1 * }, * body: { * query: { age: { $gte: 18 } } * } * } */ getDocumentsByQuery(request) { return __awaiter(this, void 0, void 0, function* () { // Extracting parameters from the request body let { dbName, collectionName, page } = request.query; let { query } = request.body; let PageNumber = parseInt(String(page)); // Validating extracted parameters if (!dbName || typeof dbName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid database name"); } if (!collectionName || typeof collectionName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid collection name"); } if (typeof PageNumber !== "number" || PageNumber < 1) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid page number"); } if (!query || typeof query !== "object") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid query"); } const skip = (PageNumber - 1) * 10; const databaseInstance = yield this.AxioDBInstance.createDB(dbName); const DB_Collection = yield databaseInstance.createCollection(collectionName); // Find All Data const allDocuments = yield DB_Collection.query(Object.assign({}, query)) .Limit(10) .Sort({ updatedAt: -1 }) .Skip(skip) .exec(); if (!allDocuments.data) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.NOT_FOUND, "No documents found"); } return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.OK, "Documents retrieved successfully", allDocuments); }); } /** * Retrieves a document from a specified collection in a database by its ID. * * @param request - The Fastify request object containing query parameters. * @param request.query - Query parameters for the database and collection. * @param request.query.dbName - The name of the database to query. * @param request.query.collectionName - The name of the collection to query. * @param request.query.documentId - The ID of the document to retrieve. * * @returns A response object with: * - Status code 200 and the retrieved document if successful. * - Status code 400 if any required parameters are invalid. * - Status code 404 if no document is found. * * @example * // Example request: * { * query: { * dbName: "users", * collectionName: "profiles", * documentId: "12345" * } * } */ getDocumentsById(request) { return __awaiter(this, void 0, void 0, function* () { // Extracting parameters from the request body let { dbName, collectionName, documentId } = request.query; // Validating extracted parameters if (!dbName || typeof dbName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid database name"); } if (!collectionName || typeof collectionName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid collection name"); } const databaseInstance = yield this.AxioDBInstance.createDB(dbName); const DB_Collection = yield databaseInstance.createCollection(collectionName); // Find All Data const allDocuments = yield DB_Collection.query({ documentId: documentId }) .findOne(true) .exec(); if (!allDocuments.data) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.NOT_FOUND, "No documents found"); } return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.OK, "Documents retrieved successfully", allDocuments); }); } /** * Creates a new document in a specified collection within a database. * * @param request - The Fastify request object containing query parameters and body data * @param request.query - Query parameters containing database and collection names * @param request.query.dbName - The name of the database to store the document in * @param request.query.collectionName - The name of the collection to store the document in * @param request.body - The document data to be inserted * * @returns A response object with appropriate status code and message: * - 201 (Created) with the inserted document data on success * - 400 (Bad Request) if any required parameters are invalid * - 500 (Internal Server Error) if document insertion fails * * @throws May throw exceptions if database or collection operations fail */ createNewDocument(request) { return __awaiter(this, void 0, void 0, function* () { // Extracting parameters from the request body let { dbName, collectionName } = request.query; const documentData = request.body; // Validating extracted parameters if (!dbName || typeof dbName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid database name"); } if (!collectionName || typeof collectionName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid collection name"); } if (!documentData || typeof documentData !== "object") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid document data"); } const databaseInstance = yield this.AxioDBInstance.createDB(dbName); const DB_Collection = yield databaseInstance.createCollection(collectionName); // Insert the new document const insertResult = yield DB_Collection.insert(documentData); if (!insertResult || insertResult.statusCode !== outers_1.StatusCodes.OK) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.INTERNAL_SERVER_ERROR, "Failed to insert document"); } return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.CREATED, "Document created successfully", insertResult.data); }); } /** * Creates multiple new documents in a specified collection within a database. * * @param request - The Fastify request object containing query parameters and body data * @param request.query - Query parameters containing database and collection names * @param request.query.dbName - The name of the database to store the documents in * @param request.query.collectionName - The name of the collection to store the documents in * @param request.body - An array of document data to be inserted * * @returns A response object with appropriate status code and message: * - 201 (Created) with the inserted document data on success * - 400 (Bad Request) if any required parameters are invalid * - 500 (Internal Server Error) if document insertion fails * * @throws May throw exceptions if database or collection operations fail */ createManyNewDocument(request) { return __awaiter(this, void 0, void 0, function* () { // Extracting parameters from the request body let { dbName, collectionName } = request.query; const documentData = request.body; // Validating extracted parameters if (!dbName || typeof dbName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid database name"); } if (!collectionName || typeof collectionName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid collection name"); } if (!documentData || typeof documentData !== "object") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid document data"); } const databaseInstance = yield this.AxioDBInstance.createDB(dbName); const DB_Collection = yield databaseInstance.createCollection(collectionName); // Insert the new document Array Document const insertResult = yield DB_Collection.insertMany(documentData); if (!insertResult || insertResult.statusCode !== outers_1.StatusCodes.OK) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.INTERNAL_SERVER_ERROR, "Failed to insert document"); } return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.CREATED, "Document created successfully", insertResult.data); }); } /** * Update an existing document in a specified collection within a database. * @param request - The Fastify request object containing query parameters and body data * @param request.query - Query parameters containing database, collection, and document IDs * @param request.query.dbName - The name of the database * @param request.query.collectionName - The name of the collection * @param request.query.documentId - The ID of the document to update * @param request.body - The updated document data */ updateDocumentById(request) { return __awaiter(this, void 0, void 0, function* () { // Extracting parameters from the request body let { dbName, collectionName, documentId } = request.query; const updatedData = request.body; // Validating extracted parameters if (!dbName || typeof dbName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid database name"); } if (!collectionName || typeof collectionName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid collection name"); } if (!documentId || typeof documentId !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid document ID"); } if (!updatedData || typeof updatedData !== "object") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid updated data"); } const databaseInstance = yield this.AxioDBInstance.createDB(dbName); const DB_Collection = yield databaseInstance.createCollection(collectionName); // Update the document const updateResult = yield DB_Collection.update({ documentId: documentId, }).UpdateOne(updatedData); if (!updateResult || updateResult.statusCode !== outers_1.StatusCodes.OK) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.INTERNAL_SERVER_ERROR, "Failed to update document"); } return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.OK, "Document updated successfully", updateResult.data); }); } /** * Updates documents in a specified collection based on a query. * @param request - The Fastify request object containing query parameters and body data * @param request.query - Query parameters containing database, collection, and update options * @param request.query.dbName - The name of the database * @param request.query.collectionName - The name of the collection * @param request.query.isMany - Flag indicating if multiple documents should be updated * @param request.body - The update query and data * @param request.body.query - The query to match documents * @param request.body.update - The updated document data * @returns A response object with the status of the update operation */ updateDocumentByQuery(request) { return __awaiter(this, void 0, void 0, function* () { // Extracting parameters from the request body let { dbName, collectionName, isMany } = request.query; const { query, update: updatedData } = request.body; // Validating extracted parameters if (!dbName || typeof dbName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid database name"); } if (!collectionName || typeof collectionName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid collection name"); } if (!query || typeof query !== "object") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid query"); } if (!updatedData || typeof updatedData !== "object") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid updated data"); } const databaseInstance = yield this.AxioDBInstance.createDB(dbName); const DB_Collection = yield databaseInstance.createCollection(collectionName); if (isMany) { const updateResult = yield DB_Collection.update(query).UpdateMany(updatedData); if (!updateResult || updateResult.statusCode !== outers_1.StatusCodes.OK) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.INTERNAL_SERVER_ERROR, "Failed to update document"); } } else { // Update the single document const updateResult = yield DB_Collection.update(query).UpdateOne(updatedData); if (!updateResult || updateResult.statusCode !== outers_1.StatusCodes.OK) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.INTERNAL_SERVER_ERROR, "Failed to update document"); } } return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.OK, "Document updated successfully"); }); } /** * Deletes a document from a specified collection in a database. * * @param request - The Fastify request object containing query parameters * @param request.query.dbName - The name of the database * @param request.query.collectionName - The name of the collection * @param request.query.documentId - The ID of the document to delete * * @returns A response object with appropriate status code and message: * - 200 (OK) if the document was successfully deleted * - 400 (BAD REQUEST) if any required parameters are missing or invalid * - 500 (INTERNAL SERVER ERROR) if the deletion operation fails * * @throws May throw exceptions during database operations */ deleteDocumentById(request) { return __awaiter(this, void 0, void 0, function* () { // Extracting parameters from the request body let { dbName, collectionName, documentId } = request.query; // Validating extracted parameters if (!dbName || typeof dbName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid database name"); } if (!collectionName || typeof collectionName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid collection name"); } if (!documentId || typeof documentId !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid document ID"); } const databaseInstance = yield this.AxioDBInstance.createDB(dbName); const DB_Collection = yield databaseInstance.createCollection(collectionName); // Delete the document const deleteResult = yield DB_Collection.delete({ documentId: documentId, }).deleteOne(); console.log(deleteResult); if (!deleteResult || deleteResult.statusCode !== outers_1.StatusCodes.OK) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.INTERNAL_SERVER_ERROR, "Failed to delete document"); } return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.OK, "Document deleted successfully"); }); } /** * Deletes one or more documents from a collection based on a query * * @param request - The Fastify request object containing the query parameters * @param request.query.dbName - The name of the database * @param request.query.collectionName - The name of the collection * @param request.query.query - The query object to match documents for deletion * @param request.query.isMany - Boolean flag indicating whether to delete multiple documents (true) or a single document (false) * * @returns A response object with status code and message * - 200 OK if the document(s) were successfully deleted * - 400 BAD_REQUEST if any of the required parameters are invalid * - 500 INTERNAL_SERVER_ERROR if the deletion operation failed * * @throws May throw exceptions from database operations */ deleteDocumentByQuery(request) { return __awaiter(this, void 0, void 0, function* () { // Extracting parameters from the request body let { dbName, collectionName, isMany } = request.query; let { query } = request.body; // Validating extracted parameters if (!dbName || typeof dbName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid database name"); } if (!collectionName || typeof collectionName !== "string") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid collection name"); } if (!query || typeof query !== "object") { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid query"); } const databaseInstance = yield this.AxioDBInstance.createDB(dbName); const DB_Collection = yield databaseInstance.createCollection(collectionName); // Delete the document if (isMany) { const deleteResult = yield DB_Collection.delete(query).deleteMany(); console.log(deleteResult); if (!deleteResult || deleteResult.statusCode !== outers_1.StatusCodes.OK) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.INTERNAL_SERVER_ERROR, "Failed to delete document"); } else { const deleteResult = yield DB_Collection.delete(query).deleteOne(); if (!deleteResult || deleteResult.statusCode !== outers_1.StatusCodes.OK) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.INTERNAL_SERVER_ERROR, "Failed to delete document"); } } } return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.OK, "Document deleted successfully"); }); } /** * Executes an aggregation pipeline on a specified collection. * * @param request - The Fastify request object containing query parameters. * @param request.query.dbName - The name of the database to use. * @param request.query.collectionName - The name of the collection to perform aggregation on. * @param request.query.aggregation - An array of aggregation pipeline stages. * * @returns A response object with status code, message, and aggregation results if successful. * If the aggregation fails, returns an error response with appropriate status code. * * @example * // Example request query: * { * dbName: "myDatabase", * collectionName: "users", * aggregation: [ * { $match: { age: { $gt: 21 } } }, * { $group: { _id: "$status", count: { $sum: 1 } } } * ] * } */ runAggregation(request) { return __awaiter(this, void 0, void 0, function* () { let { dbName, collectionName } = request.query; let { aggregation } = request.body; // validate aggregation pipeline if (!Array.isArray(aggregation) || aggregation.length === 0) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.BAD_REQUEST, "Invalid aggregation pipeline"); } const databaseInstance = yield this.AxioDBInstance.createDB(dbName); const DB_Collection = yield databaseInstance.createCollection(collectionName); const aggregationResult = yield DB_Collection.aggregate(aggregation).exec(); if (!aggregationResult || aggregationResult.statusCode !== outers_1.StatusCodes.OK) { return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.INTERNAL_SERVER_ERROR, "Failed to run aggregation"); } return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.OK, "Aggregation run successfully", aggregationResult.data); }); } } exports.default = CRUDController; //# sourceMappingURL=CRUD.controller.js.map