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
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 });
/* 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