maggie-api
Version:
🧙♀️ A magical Express middleware to auto-generate CRUD APIs for Mongoose models with validation, unique keys, and middlewares.
79 lines (78 loc) • 3.38 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createMaggie = exports.categoryValidationSchema = exports.productValidationSchema = void 0;
const express_1 = __importDefault(require("express"));
const routes_1 = __importDefault(require("./routes"));
const department_1 = __importDefault(require("./models/department"));
const User_1 = __importDefault(require("./models/User"));
const mongoose_1 = __importDefault(require("mongoose"));
const models_1 = __importDefault(require("./models"));
const joi_1 = __importDefault(require("joi"));
const app = (0, express_1.default)();
// MongoDB Connection
mongoose_1.default
.connect("mongodb://127.0.0.1:27017/maggie_test")
.then(() => console.log("✅ MongoDB Connected"))
.catch((err) => console.error("❌ MongoDB Error:", err));
app.use(express_1.default.json());
exports.productValidationSchema = joi_1.default.object({
title: joi_1.default.string().required(),
description: joi_1.default.string().required(),
category: joi_1.default.string().required(),
price: joi_1.default.number().positive().required(),
discountPercentage: joi_1.default.number().min(0).max(100).required(),
rating: joi_1.default.number().min(0).max(5).required(),
stock: joi_1.default.number().integer().min(0).required(),
});
exports.categoryValidationSchema = joi_1.default.object({
title: joi_1.default.string().default("Default it working"),
});
const apiRouter = (0, routes_1.default)({
models: [
{
model: User_1.default,
path: "user",
settings: {
get: { populate: [{ path: "department" }] },
getById: { populate: [{ path: "department", select: ["id"] }] },
},
},
{ model: department_1.default, path: "department" },
{
model: models_1.default.Category,
path: "category",
primaryKey: "title",
validationSchema: exports.categoryValidationSchema,
},
{ model: models_1.default.SubCategory, path: "subcategory" },
{
model: models_1.default.Product,
path: "product",
validationSchema: exports.productValidationSchema,
settings: {
get: {
keys: ["title", "price", "description"],
//filter: { title: "Powder Canister" },
// sort: { title: "ASC", description: "DESC" },
filter: { allowedFields: ["price", "title"] },
search: { disabled: false, allowedFields: ["title"] },
},
getById: { keys: ["_id", "title"] },
},
// settings: {
// getById: {
// populate: [{ path: "subCategory", populate: [{ path: "category" }] }],
// },
// },
},
{ model: models_1.default.Item, path: "item" },
],
prefix: "/api/v1",
});
app.use(apiRouter);
app.listen(5000, () => console.log(`listening on PORT ${5000}`));
var routes_2 = require("./routes");
Object.defineProperty(exports, "createMaggie", { enumerable: true, get: function () { return __importDefault(routes_2).default; } });