From 47d30d96ebca33d0dec63f37f4e4caa64ecfd22b Mon Sep 17 00:00:00 2001 From: Md Sharafat Hassain Binoy Date: Mon, 27 Apr 2026 00:03:06 +0600 Subject: [PATCH 1/6] Template API: create database schema --- .../migration.sql | 207 ++++++++++++++++++ prisma/schema/template.prisma | 139 ++++++++++++ .../modules/template/template.controller.ts | 66 ++++++ src/app/modules/template/template.route.ts | 22 ++ src/app/modules/template/template.service.ts | 46 ++++ src/app/modules/template/template.swagger.ts | 106 +++++++++ .../modules/template/template.validation.ts | 9 + src/routes.ts | 2 + src/swaggerOptions.ts | 2 + 9 files changed, 599 insertions(+) create mode 100644 prisma/migrations/20260426174845_add_template_data_tables/migration.sql create mode 100644 prisma/schema/template.prisma create mode 100644 src/app/modules/template/template.controller.ts create mode 100644 src/app/modules/template/template.route.ts create mode 100644 src/app/modules/template/template.service.ts create mode 100644 src/app/modules/template/template.swagger.ts create mode 100644 src/app/modules/template/template.validation.ts diff --git a/prisma/migrations/20260426174845_add_template_data_tables/migration.sql b/prisma/migrations/20260426174845_add_template_data_tables/migration.sql new file mode 100644 index 0000000..c768a98 --- /dev/null +++ b/prisma/migrations/20260426174845_add_template_data_tables/migration.sql @@ -0,0 +1,207 @@ +-- CreateTable +CREATE TABLE "Template" ( + "id" TEXT NOT NULL, + "language" TEXT NOT NULL, + "deliveryCharge" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Template_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Banner" ( + "id" TEXT NOT NULL, + "isVisible" BOOLEAN NOT NULL, + "bannerTitle" TEXT NOT NULL, + "bannerDesc" TEXT NOT NULL, + "bannerImage" TEXT NOT NULL, + "templateId" TEXT NOT NULL, + + CONSTRAINT "Banner_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Address" ( + "id" TEXT NOT NULL, + "isVisible" BOOLEAN NOT NULL, + "phoneNumber" TEXT NOT NULL, + "shopLocation" TEXT NOT NULL, + "shopEmail" TEXT NOT NULL, + "templateId" TEXT NOT NULL, + + CONSTRAINT "Address_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Ingredient" ( + "id" TEXT NOT NULL, + "isVisible" BOOLEAN NOT NULL, + "templateId" TEXT NOT NULL, + + CONSTRAINT "Ingredient_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ingredientOptions" ( + "id" TEXT NOT NULL, + "ingrImg" TEXT NOT NULL, + "ingrTitle" TEXT NOT NULL, + "ingrDes" TEXT NOT NULL, + "ingredientId" TEXT NOT NULL, + + CONSTRAINT "ingredientOptions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Instruction" ( + "id" TEXT NOT NULL, + "isVisible" BOOLEAN NOT NULL, + "instBanner" TEXT NOT NULL, + "templateId" TEXT NOT NULL, + + CONSTRAINT "Instruction_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "InstructionOptions" ( + "id" TEXT NOT NULL, + "hint" TEXT NOT NULL, + "detail" TEXT NOT NULL, + "instructionId" TEXT NOT NULL, + + CONSTRAINT "InstructionOptions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "FAQ" ( + "id" TEXT NOT NULL, + "isVisible" BOOLEAN NOT NULL, + "templateId" TEXT NOT NULL, + + CONSTRAINT "FAQ_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "FAQOptions" ( + "id" TEXT NOT NULL, + "index" INTEGER NOT NULL, + "text" TEXT NOT NULL, + "faqId" TEXT NOT NULL, + + CONSTRAINT "FAQOptions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Tips" ( + "id" TEXT NOT NULL, + "isVisible" BOOLEAN NOT NULL, + "tipsBanner" TEXT NOT NULL, + "templateId" TEXT NOT NULL, + + CONSTRAINT "Tips_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TipsOption" ( + "id" TEXT NOT NULL, + "index" INTEGER NOT NULL, + "text" TEXT NOT NULL, + "tipsId" TEXT NOT NULL, + + CONSTRAINT "TipsOption_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PriceCombo" ( + "id" TEXT NOT NULL, + "isVisible" BOOLEAN NOT NULL, + "templateId" TEXT NOT NULL, + + CONSTRAINT "PriceCombo_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PriceOption" ( + "id" TEXT NOT NULL, + "quantity" TEXT NOT NULL, + "price" TEXT NOT NULL, + "comboId" TEXT NOT NULL, + + CONSTRAINT "PriceOption_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Product" ( + "id" TEXT NOT NULL, + "isVisible" BOOLEAN NOT NULL, + "price" TEXT NOT NULL, + "discount" INTEGER NOT NULL, + "productName" TEXT NOT NULL, + "templateId" TEXT NOT NULL, + + CONSTRAINT "Product_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Banner_templateId_key" ON "Banner"("templateId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Address_templateId_key" ON "Address"("templateId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Ingredient_templateId_key" ON "Ingredient"("templateId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Instruction_templateId_key" ON "Instruction"("templateId"); + +-- CreateIndex +CREATE UNIQUE INDEX "FAQ_templateId_key" ON "FAQ"("templateId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Tips_templateId_key" ON "Tips"("templateId"); + +-- CreateIndex +CREATE UNIQUE INDEX "PriceCombo_templateId_key" ON "PriceCombo"("templateId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Product_templateId_key" ON "Product"("templateId"); + +-- AddForeignKey +ALTER TABLE "Banner" ADD CONSTRAINT "Banner_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "Template"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Address" ADD CONSTRAINT "Address_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "Template"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Ingredient" ADD CONSTRAINT "Ingredient_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "Template"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ingredientOptions" ADD CONSTRAINT "ingredientOptions_ingredientId_fkey" FOREIGN KEY ("ingredientId") REFERENCES "Ingredient"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Instruction" ADD CONSTRAINT "Instruction_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "Template"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "InstructionOptions" ADD CONSTRAINT "InstructionOptions_instructionId_fkey" FOREIGN KEY ("instructionId") REFERENCES "Instruction"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "FAQ" ADD CONSTRAINT "FAQ_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "Template"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "FAQOptions" ADD CONSTRAINT "FAQOptions_faqId_fkey" FOREIGN KEY ("faqId") REFERENCES "FAQ"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Tips" ADD CONSTRAINT "Tips_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "Template"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TipsOption" ADD CONSTRAINT "TipsOption_tipsId_fkey" FOREIGN KEY ("tipsId") REFERENCES "Tips"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PriceCombo" ADD CONSTRAINT "PriceCombo_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "Template"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PriceOption" ADD CONSTRAINT "PriceOption_comboId_fkey" FOREIGN KEY ("comboId") REFERENCES "PriceCombo"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Product" ADD CONSTRAINT "Product_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "Template"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema/template.prisma b/prisma/schema/template.prisma new file mode 100644 index 0000000..027c5e7 --- /dev/null +++ b/prisma/schema/template.prisma @@ -0,0 +1,139 @@ +model Template { + id String @id @default(uuid()) + language String + deliveryCharge String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + address Address? + banner Banner? + ingredient Ingredient? + instruction Instruction? + faq FAQ? + tips Tips? + priceCombo PriceCombo? + product Product? +} + +// banner model +model Banner { + id String @id @default(uuid()) + isVisible Boolean + bannerTitle String + bannerDesc String + bannerImage String + templateId String @unique + template Template @relation(fields: [templateId], references: [id]) +} + +// address model +model Address { + id String @id @default(uuid()) + isVisible Boolean + phoneNumber String + shopLocation String + shopEmail String + templateId String @unique + template Template @relation(fields: [templateId], references: [id]) +} + +//ingredient model +model Ingredient { + id String @id @default(uuid()) + isVisible Boolean + templateId String @unique + template Template @relation(fields: [templateId], references: [id]) + options ingredientOptions[] +} + +//ingredient options model +model ingredientOptions { + id String @id @default(uuid()) + ingrImg String + ingrTitle String + ingrDes String + ingredientId String + ingredient Ingredient @relation(fields: [ingredientId], references: [id]) +} + +//instruction model & instruction options +model Instruction { + id String @id @default(uuid()) + isVisible Boolean + instBanner String + templateId String @unique + template Template @relation(fields: [templateId], references: [id]) + options InstructionOptions[] +} + +model InstructionOptions { + id String @id @default(uuid()) + hint String + detail String + instructionId String + instruction Instruction @relation(fields: [instructionId], references: [id]) +} + +//FAQ & FAQOptions model +model FAQ { + id String @id @default(uuid()) + isVisible Boolean + templateId String @unique + template Template @relation(fields: [templateId], references: [id]) + options FAQOptions[] +} + +model FAQOptions { + id String @id @default(uuid()) + index Int + text String + + faqId String + faq FAQ @relation(fields: [faqId], references: [id]) +} + +//Tips & Tips options model +model Tips { + id String @id @default(uuid()) + isVisible Boolean + tipsBanner String + templateId String @unique + template Template @relation(fields: [templateId], references: [id]) + options TipsOption[] +} + +model TipsOption { + id String @id @default(uuid()) + index Int + text String + + tipsId String + tips Tips @relation(fields: [tipsId], references: [id]) +} + +//PriceCombo & PriceComboOptions model +model PriceCombo { + id String @id @default(uuid()) + isVisible Boolean + templateId String @unique + template Template @relation(fields: [templateId], references: [id]) + options PriceOption[] +} + +model PriceOption { + id String @id @default(uuid()) + quantity String + price String + comboId String + combo PriceCombo @relation(fields: [comboId], references: [id]) +} + +//product model +model Product { + id String @id @default(uuid()) + isVisible Boolean + price String + discount Int + productName String + templateId String @unique + template Template @relation(fields: [templateId], references: [id]) +} diff --git a/src/app/modules/template/template.controller.ts b/src/app/modules/template/template.controller.ts new file mode 100644 index 0000000..b89d917 --- /dev/null +++ b/src/app/modules/template/template.controller.ts @@ -0,0 +1,66 @@ +import catchAsync from "../../utils/catch_async.js"; +import manageResponse from "../../utils/manage_response.js"; +import { template_service } from "./template.service.js"; + +const get_all_template = catchAsync(async (req, res) => { + const result = await template_service.get_all_template_from_db(req); + manageResponse(res, { + success: true, + statusCode: 200, + message: "All template fetched successfully.", + data: result, + meta: {}, + }); +}); + +const get_single_template = catchAsync(async (req, res) => { + const result = await template_service.get_single_template_from_db(req); + manageResponse(res, { + success: true, + statusCode: 200, + message: "Single template fetched successfully.", + data: result, + meta: {}, + }); +}); + +const create_template = catchAsync(async (req, res) => { + const result = await template_service.create_template_into_db(req); + manageResponse(res, { + success: true, + statusCode: 200, + message: "template created successfully.", + data: result, + meta: {}, + }); +}); + +const update_template = catchAsync(async (req, res) => { + const result = await template_service.update_template_into_db(req); + manageResponse(res, { + success: true, + statusCode: 200, + message: "template updated successfully.", + data: result, + meta: {}, + }); +}); + +const delete_template = catchAsync(async (req, res) => { + const result = await template_service.delete_template_from_db(req); + manageResponse(res, { + success: true, + statusCode: 200, + message: "template deleted successfully.", + data: result, + meta: {}, + }); +}); + +export const template_controller = { + get_all_template, + get_single_template, + create_template, + update_template, + delete_template, +}; diff --git a/src/app/modules/template/template.route.ts b/src/app/modules/template/template.route.ts new file mode 100644 index 0000000..352af4e --- /dev/null +++ b/src/app/modules/template/template.route.ts @@ -0,0 +1,22 @@ +import { Router } from "express"; +import RequestValidator from "../../middlewares/request_validator.js"; +import { template_controller } from "./template.controller.js"; +import { template_validations } from "./template.validation.js"; + +const router = Router(); + +router.get("/", template_controller.get_all_template); +router.post( + "/", + RequestValidator(template_validations.create_template), + template_controller.create_template, +); +router.get("/:id", template_controller.get_single_template); +router.patch( + "/:id", + RequestValidator(template_validations.update_template), + template_controller.update_template, +); +router.delete("/:id", template_controller.delete_template); + +export default router; diff --git a/src/app/modules/template/template.service.ts b/src/app/modules/template/template.service.ts new file mode 100644 index 0000000..3654585 --- /dev/null +++ b/src/app/modules/template/template.service.ts @@ -0,0 +1,46 @@ +import { Request } from "express"; +import { prisma } from "../../lib/prisma.js"; + +const get_all_template_from_db = async (req: Request) => { + // define your own login here + const result = await prisma.template.findMany(); + return result; +}; + +const get_single_template_from_db = async (req: Request) => { + // define your own login here + const { id } = req.params; + const result = await prisma.template.findUnique({ where: { id } }); + return result; +}; + +const create_template_into_db = async (req: Request) => { + // define your own login here + const result = await prisma.template.create({ data: req.body }); + return result; +}; + +const update_template_into_db = async (req: Request) => { + // define your own login here + const { id } = req.params; + const result = await prisma.template.update({ + where: { id }, + data: req.body, + }); + return result; +}; + +const delete_template_from_db = async (req: Request) => { + // define your own login here + const { id } = req.params; + const result = await prisma.template.delete({ where: { id } }); + return result; +}; + +export const template_service = { + get_all_template_from_db, + get_single_template_from_db, + create_template_into_db, + update_template_into_db, + delete_template_from_db, +}; diff --git a/src/app/modules/template/template.swagger.ts b/src/app/modules/template/template.swagger.ts new file mode 100644 index 0000000..d315cf2 --- /dev/null +++ b/src/app/modules/template/template.swagger.ts @@ -0,0 +1,106 @@ +export const templateSwaggerDocs = { + "/api/template": { + post: { + tags: ["template"], + summary: "Create new template", + description: "", + requestBody: { + required: true, + content: { + "application/json": { + example: JSON.stringify({}), // put your request body + }, + }, + }, + responses: { + 201: { description: "template created successfully" }, + 500: { description: "Validation error or internal server error" }, + }, + }, + get: { + tags: ["template"], + summary: "Get all template", + description: "", + parameters: [ + { + name: "page", + in: "query", + required: false, + schema: { type: "number" }, + }, + { + name: "limit", + in: "query", + required: false, + schema: { type: "number" }, + }, + ], + responses: { + 200: { description: "template fetched successfully" }, + 401: { description: "unauthorized" }, + }, + }, + }, + + "/api/template/{id}": { + get: { + tags: ["template"], + summary: "Get single template", + description: "", + parameters: [ + { + name: "id", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + responses: { + 200: { description: "template fetched successfully" }, + 401: { description: "unauthorized" }, + }, + }, + patch: { + tags: ["template"], + summary: "Update template", + description: "", + parameters: [ + { + name: "id", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + requestBody: { + required: true, + content: { + "application/json": { + example: JSON.stringify({}), // put your request body + }, + }, + }, + responses: { + 200: { description: "template updated successfully" }, + 500: { description: "Validation error or internal server error" }, + }, + }, + delete: { + tags: ["template"], + summary: "Delete template", + description: "", + parameters: [ + { + name: "id", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + responses: { + 200: { description: "template delete successfully" }, + 401: { description: "unauthorized" }, + }, + }, + }, +}; diff --git a/src/app/modules/template/template.validation.ts b/src/app/modules/template/template.validation.ts new file mode 100644 index 0000000..53ba562 --- /dev/null +++ b/src/app/modules/template/template.validation.ts @@ -0,0 +1,9 @@ +import { z } from "zod"; + +const create_template = z.object({}); +const update_template = z.object({}); + +export const template_validations = { + create_template, + update_template, +}; diff --git a/src/routes.ts b/src/routes.ts index a7ac1a2..faf8148 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -4,10 +4,12 @@ import orderRoute from "./app/modules/order/order.route.js"; import planRoute from "./app/modules/plan/plan.route.js"; import profileRoute from "./app/modules/profile/profile.route.js"; import supportRoute from "./app/modules/support/support.route.js"; +import templateRoute from "./app/modules/template/template.route"; const appRouter = Router(); const moduleRoutes = [ + { path: "/template", route: templateRoute }, { path: "/order", route: orderRoute }, { path: "/support", route: supportRoute }, { path: "/plan", route: planRoute }, diff --git a/src/swaggerOptions.ts b/src/swaggerOptions.ts index 93859d5..3aa0273 100644 --- a/src/swaggerOptions.ts +++ b/src/swaggerOptions.ts @@ -6,6 +6,7 @@ import { orderSwaggerDocs } from "./app/modules/order/order.swagger.js"; import { planSwaggerDocs } from "./app/modules/plan/plan.swagger.js"; import { profileSwaggerDocs } from "./app/modules/profile/profile.swagger.js"; import { supportSwaggerDocs } from "./app/modules/support/support.swagger.js"; +import { templateSwaggerDocs } from "./app/modules/template/template.swagger"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -24,6 +25,7 @@ export const swaggerOptions = { ...orderSwaggerDocs, ...profileSwaggerDocs, ...supportSwaggerDocs, + ...templateSwaggerDocs, }, servers: configs.env === "production" -- 2.52.0 From b09fdfc2554c05cee2323d8e77982055b5f8f879 Mon Sep 17 00:00:00 2001 From: Md Sharafat Hassain Binoy Date: Tue, 28 Apr 2026 00:29:01 +0600 Subject: [PATCH 2/6] Template-API's : create tamplate and also add the get all template and get single templates --- src/app/modules/template/template.service.ts | 109 +++++++++++++++++- src/app/modules/template/template.swagger.ts | 93 ++++++++++++++- .../modules/template/template.validation.ts | 80 ++++++++++++- 3 files changed, 274 insertions(+), 8 deletions(-) diff --git a/src/app/modules/template/template.service.ts b/src/app/modules/template/template.service.ts index 3654585..4b4be06 100644 --- a/src/app/modules/template/template.service.ts +++ b/src/app/modules/template/template.service.ts @@ -3,26 +3,123 @@ import { prisma } from "../../lib/prisma.js"; const get_all_template_from_db = async (req: Request) => { // define your own login here - const result = await prisma.template.findMany(); + const result = await prisma.template.findMany({}); return result; }; const get_single_template_from_db = async (req: Request) => { // define your own login here - const { id } = req.params; - const result = await prisma.template.findUnique({ where: { id } }); + const { id } = req.params as { id: string }; + const result = await prisma.template.findUnique({ + where: { id }, + select: { + id: true, + language: true, + deliveryCharge: true, + banner: true, + address: true, + ingredient: true, + instruction: true, + faq: true, + tips: true, + priceCombo: true, + product: true, + }, + }); return result; }; const create_template_into_db = async (req: Request) => { // define your own login here - const result = await prisma.template.create({ data: req.body }); + const payload = req.body; + console.log(payload); + const result = await prisma.template.create({ + data: { + language: payload.language, + deliveryCharge: payload.deliveryCharge, + + banner: { + create: payload.banner, + }, + + address: { + create: payload.address, + }, + + ingredient: { + create: { + isVisible: payload.ingredient.isVisible, + options: { + create: payload.ingredient.options, + }, + }, + }, + + instruction: { + create: { + isVisible: payload.instruction.isVisible, + instBanner: payload.instruction.instBanner, + options: { + create: payload.instruction.options, + }, + }, + }, + + faq: { + create: { + isVisible: payload.faq.isVisible, + options: { + create: payload.faq.options, + }, + }, + }, + + tips: { + create: { + isVisible: payload.tips.isVisible, + tipsBanner: payload.tips.tipsBanner, + options: { + create: payload.tips.options, + }, + }, + }, + + priceCombo: { + create: { + isVisible: payload.priceCombo.isVisible, + options: { + create: payload.priceCombo.options, + }, + }, + }, + + product: { + create: { + isVisible: payload.product.isVisible, + price: payload.product.price, + discount: payload.product.discount, + productName: payload.product.productName, + }, + }, + }, + + include: { + banner: true, + address: true, + ingredient: { include: { options: true } }, + instruction: { include: { options: true } }, + faq: { include: { options: true } }, + tips: { include: { options: true } }, + priceCombo: { include: { options: true } }, + product: true, + }, + }); return result; }; const update_template_into_db = async (req: Request) => { // define your own login here - const { id } = req.params; + const { id } = req.params as { id: string }; const result = await prisma.template.update({ where: { id }, data: req.body, @@ -32,7 +129,7 @@ const update_template_into_db = async (req: Request) => { const delete_template_from_db = async (req: Request) => { // define your own login here - const { id } = req.params; + const { id } = req.params as { id: string }; const result = await prisma.template.delete({ where: { id } }); return result; }; diff --git a/src/app/modules/template/template.swagger.ts b/src/app/modules/template/template.swagger.ts index d315cf2..9fcd93b 100644 --- a/src/app/modules/template/template.swagger.ts +++ b/src/app/modules/template/template.swagger.ts @@ -8,7 +8,98 @@ export const templateSwaggerDocs = { required: true, content: { "application/json": { - example: JSON.stringify({}), // put your request body + example: JSON.stringify({ + language: "en", + deliveryCharge: "60", + banner: { + isVisible: true, + bannerTitle: "Delicious Homemade Food", + bannerDesc: + "Fresh, healthy and tasty meals delivered to your door.", + bannerImage: "https://example.com/banner.jpg", + }, + address: { + isVisible: true, + phoneNumber: "+8801712345678", + shopLocation: "Dhaka, Bangladesh", + shopEmail: "foodshop@example.com", + }, + ingredient: { + isVisible: true, + options: [ + { + ingrImg: "https://example.com/tomato.jpg", + ingrTitle: "Tomato", + ingrDes: "Fresh organic tomatoes", + }, + { + ingrImg: "https://example.com/chicken.jpg", + ingrTitle: "Chicken", + ingrDes: "Premium quality chicken", + }, + ], + }, + instruction: { + isVisible: true, + instBanner: "https://example.com/instruction-banner.jpg", + options: [ + { + hint: "Step 1", + detail: "Wash all ingredients properly", + }, + { + hint: "Step 2", + detail: "Cook on medium heat for 20 minutes", + }, + ], + }, + faq: { + isVisible: true, + options: [ + { + index: 1, + text: "Is the food fresh?", + }, + { + index: 2, + text: "Do you offer home delivery?", + }, + ], + }, + tips: { + isVisible: true, + tipsBanner: "https://example.com/tips-banner.jpg", + options: [ + { + index: 1, + text: "Use fresh ingredients for best taste", + }, + { + index: 2, + text: "Serve hot for better flavor", + }, + ], + }, + priceCombo: { + isVisible: true, + options: [ + { + quantity: "1", + price: "120", + }, + { + quantity: "2", + price: "220", + }, + ], + }, + product: { + isVisible: true, + price: "120", + discount: 10, + productName: "Chicken Burger", + }, + }), // put your request body }, }, }, diff --git a/src/app/modules/template/template.validation.ts b/src/app/modules/template/template.validation.ts index 53ba562..0243549 100644 --- a/src/app/modules/template/template.validation.ts +++ b/src/app/modules/template/template.validation.ts @@ -1,6 +1,84 @@ import { z } from "zod"; -const create_template = z.object({}); +// Template Options that we need to use for validation. + +// Ingredient Option +const ingredientOptionSchema = z.object({ + ingrImg: z.string().url().or(z.string()), + ingrTitle: z.string().min(1), + ingrDes: z.string().min(1), +}); + +// Instruction Option +const instructionOptionSchema = z.object({ + hint: z.string().min(1), + detail: z.string().min(1), +}); + +// FAQ Option +const faqOptionSchema = z.object({ + index: z.number(), + text: z.string().min(1), +}); + +// Tips Option +const tipsOptionSchema = z.object({ + index: z.number(), + text: z.string().min(1), +}); + +// Price Option +const priceOptionSchema = z.object({ + quantity: z.string().min(1), + price: z.string().min(1), +}); + + +// Create the main template schema validation +const create_template = z.object({ + language: z.string().min(1), + deliveryCharge: z.string().min(1), + banner: z.object({ + isVisible: z.boolean(), + bannerTitle: z.string().min(1), + bannerDesc: z.string().min(1), + bannerImage: z.string(), + }), + address: z.object({ + isVisible: z.boolean(), + phoneNumber: z.string().min(1), + shopLocation: z.string().min(1), + shopEmail: z.string().email(), + }), + ingredient: z.object({ + isVisible: z.boolean(), + options: z.array(ingredientOptionSchema).min(1), + }), + instruction: z.object({ + isVisible: z.boolean(), + instBanner: z.string(), + options: z.array(instructionOptionSchema).min(1), + }), + faq: z.object({ + isVisible: z.boolean(), + options: z.array(faqOptionSchema).min(1), + }), + tips: z.object({ + isVisible: z.boolean(), + tipsBanner: z.string(), + options: z.array(tipsOptionSchema).min(1), + }), + priceCombo: z.object({ + isVisible: z.boolean(), + options: z.array(priceOptionSchema).min(1), + }), + product: z.object({ + isVisible: z.boolean(), + price: z.string().min(1), + discount: z.number().min(0), + productName: z.string().min(1), + }), +}); const update_template = z.object({}); export const template_validations = { -- 2.52.0 From d2b320f3b1dbdcfb4a69de87a1ed47afb40df420 Mon Sep 17 00:00:00 2001 From: Md Sharafat Hassain Binoy Date: Thu, 30 Apr 2026 21:26:18 +0600 Subject: [PATCH 3/6] Change the api and add some new feature --- src/app/modules/order/order.service.ts | 8 + src/app/modules/plan/plan.service.ts | 11 +- .../modules/statictics/statictics.swagger.ts | 138 ++++++++++++++++++ 3 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 src/app/modules/statictics/statictics.swagger.ts diff --git a/src/app/modules/order/order.service.ts b/src/app/modules/order/order.service.ts index 1285906..e554f37 100644 --- a/src/app/modules/order/order.service.ts +++ b/src/app/modules/order/order.service.ts @@ -93,6 +93,14 @@ const get_all_order_from_db = async (req: Request) => { where: { AND: andCondition, }, + select: { + id: true, + customerName: true, + productQuantity: true, + productPrice: true, + status: true, + createdAt: true, + }, orderBy: { [sortBy as string]: sortOrder, }, diff --git a/src/app/modules/plan/plan.service.ts b/src/app/modules/plan/plan.service.ts index 4d351c0..d550a8b 100644 --- a/src/app/modules/plan/plan.service.ts +++ b/src/app/modules/plan/plan.service.ts @@ -5,7 +5,16 @@ import { AppError } from "../../utils/app_error.js"; const get_all_plan_from_db = async (req: Request) => { // define your own login here - const result = await prisma.plan.findMany(); + const result = await prisma.plan.findMany({ + select:{ + planName: true, + price: true, + planType: true, + planDesc: true, + planFeatures: true, + + } + }); return result; }; diff --git a/src/app/modules/statictics/statictics.swagger.ts b/src/app/modules/statictics/statictics.swagger.ts new file mode 100644 index 0000000..16a7ef0 --- /dev/null +++ b/src/app/modules/statictics/statictics.swagger.ts @@ -0,0 +1,138 @@ + +export const staticticsSwaggerDocs = { + "/api/statictics": { + post: { + tags: ["statictics"], + summary: "Create new statictics", + description: "", + requestBody: { + + required: true, + content: { + "application/json": { + example: JSON.stringify({}), // put your request body + }, + }, + }, + responses: { + 201: { description: "statictics created successfully" }, + 500: { description: "Validation error or internal server error" }, + }, + }, + get: { + tags: ["statictics"], + summary: "Get all statictics", + description: "", + parameters: [ + { + name: "page", + in: "query", + required: false, + schema: { type: "number" }, + }, + { + name: "limit", + in: "query", + required: false, + schema: { type: "number" }, + }, + ], + responses: { + 200: { description: "statictics fetched successfully" }, + 401: { description: "unauthorized" }, + }, + }, + }, + "/api/statictics/seller": { + get: { + tags: ["statistics"], + summary: "Get seller statistics", + description: "Fetch seller dashboard stats (7d, 30d, all)", + + parameters: [ + { + name: "range", + in: "query", + required: false, + schema: { + type: "string", + enum: ["7d", "30d", "all"], + default: "7d", + }, + description: "Time range for statistics", + }, + ], + + responses: { + 200: { + description: "Statistics fetched successfully", + }, + 401: { + description: "Unauthorized", + }, + }, + }, + }, + + "/api/statictics/{id}": { + get: { + tags: ["statictics"], + summary: "Get single statictics", + description: "", + parameters: [ + { + name: "id", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + responses: { + 200: { description: "statictics fetched successfully" }, + 401: { description: "unauthorized" }, + }, + }, + patch: { + tags: ["statictics"], + summary: "Update statictics", + description: "", + parameters: [ + { + name: "id", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + requestBody: { + required: true, + content: { + "application/json": { + example: JSON.stringify({}), // put your request body + }, + }, + }, + responses: { + 200: { description: "statictics updated successfully" }, + 500: { description: "Validation error or internal server error" }, + }, + }, + delete: { + tags: ["statictics"], + summary: "Delete statictics", + description: "", + parameters: [ + { + name: "id", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + responses: { + 200: { description: "statictics delete successfully" }, + 401: { description: "unauthorized" }, + }, + }, + }, +}; -- 2.52.0 From 1abecc9b8f2c7e7d510c45d67c422aa15c8711cd Mon Sep 17 00:00:00 2001 From: sharafat Date: Sun, 24 May 2026 00:17:16 +0600 Subject: [PATCH 4/6] Update:PROFILE API's and create get users api's with pagination --- .../20260523173211_edit_profile/migration.sql | 14 +++ .../migration.sql | 2 + prisma/schema/profile.schema.prisma | 17 ++- prisma/schema/users.prisma | 7 ++ src/app/modules/profile/profile.swagger.ts | 2 +- src/app/modules/profile/profile.validation.ts | 11 +- src/app/modules/users/users.controller.ts | 69 +++++++++++ src/app/modules/users/users.route.ts | 24 ++++ src/app/modules/users/users.service.ts | 65 +++++++++++ src/app/modules/users/users.swagger.ts | 110 ++++++++++++++++++ src/app/modules/users/users.validation.ts | 10 ++ src/routes.ts | 2 + src/swaggerOptions.ts | 2 + 13 files changed, 327 insertions(+), 8 deletions(-) create mode 100644 prisma/migrations/20260523173211_edit_profile/migration.sql create mode 100644 prisma/migrations/20260523174545_edit_the_profile_status/migration.sql create mode 100644 prisma/schema/users.prisma create mode 100644 src/app/modules/users/users.controller.ts create mode 100644 src/app/modules/users/users.route.ts create mode 100644 src/app/modules/users/users.service.ts create mode 100644 src/app/modules/users/users.swagger.ts create mode 100644 src/app/modules/users/users.validation.ts diff --git a/prisma/migrations/20260523173211_edit_profile/migration.sql b/prisma/migrations/20260523173211_edit_profile/migration.sql new file mode 100644 index 0000000..7f77fa8 --- /dev/null +++ b/prisma/migrations/20260523173211_edit_profile/migration.sql @@ -0,0 +1,14 @@ +-- CreateEnum +CREATE TYPE "ShopStatus" AS ENUM ('ACTIVE', 'SUSPENDED', 'DELETED'); + +-- AlterTable +ALTER TABLE "Profile" ADD COLUMN "status" "ShopStatus" NOT NULL DEFAULT 'ACTIVE'; + +-- CreateTable +CREATE TABLE "Users" ( + "id" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Users_pkey" PRIMARY KEY ("id") +); diff --git a/prisma/migrations/20260523174545_edit_the_profile_status/migration.sql b/prisma/migrations/20260523174545_edit_the_profile_status/migration.sql new file mode 100644 index 0000000..b45a2dc --- /dev/null +++ b/prisma/migrations/20260523174545_edit_the_profile_status/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "ShopStatus" ADD VALUE 'INACTIVE'; diff --git a/prisma/schema/profile.schema.prisma b/prisma/schema/profile.schema.prisma index b5959a9..26ef467 100644 --- a/prisma/schema/profile.schema.prisma +++ b/prisma/schema/profile.schema.prisma @@ -1,14 +1,19 @@ +enum ShopStatus { + ACTIVE + SUSPENDED + DELETED + INACTIVE +} + model Profile { - id String @id @default(uuid()) - accountId String @unique - account Account @relation(fields: [accountId], references: [id], onDelete: Cascade) + id String @id @default(uuid()) + accountId String @unique + account Account @relation(fields: [accountId], references: [id], onDelete: Cascade) shopName String shopLogo String? contactNumber String? shopAddress String? shopMapLocation String? shopCategory String? - + status ShopStatus @default(ACTIVE) } - - diff --git a/prisma/schema/users.prisma b/prisma/schema/users.prisma new file mode 100644 index 0000000..f5a0e8c --- /dev/null +++ b/prisma/schema/users.prisma @@ -0,0 +1,7 @@ + +model Users { + id String @id @default(uuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + \ No newline at end of file diff --git a/src/app/modules/profile/profile.swagger.ts b/src/app/modules/profile/profile.swagger.ts index 5a93aee..4494f8d 100644 --- a/src/app/modules/profile/profile.swagger.ts +++ b/src/app/modules/profile/profile.swagger.ts @@ -13,7 +13,7 @@ export const profileSwaggerDocs = { data: { type: "object", properties: { - fullName: { type: "string" }, + shopName: { type: "string" }, }, }, file: { diff --git a/src/app/modules/profile/profile.validation.ts b/src/app/modules/profile/profile.validation.ts index b7ffb04..eb604d3 100644 --- a/src/app/modules/profile/profile.validation.ts +++ b/src/app/modules/profile/profile.validation.ts @@ -1,6 +1,15 @@ import { z } from "zod"; const update_profile = z.object({ - fullName: z.string().optional(), + shopName: z.string().optional(), + shopAddress: z.string().optional(), + shopPhone: z.string().optional(), + shopLocation: z.string().optional(), + shopImage: z.string().optional(), + shopMapLocation: z.string().optional(), + contactNumber: z.string().optional(), + shopCategory: z.string().optional(), + + }); export const profile_validations = { diff --git a/src/app/modules/users/users.controller.ts b/src/app/modules/users/users.controller.ts new file mode 100644 index 0000000..d134055 --- /dev/null +++ b/src/app/modules/users/users.controller.ts @@ -0,0 +1,69 @@ +import catchAsync from "../../utils/catch_async.js"; +import manageResponse from "../../utils/manage_response.js"; +import { users_service } from "./users.service.js"; + + + +const get_all_users = catchAsync(async (req, res) => { + const result = await users_service.get_all_users_from_db(req); + manageResponse(res, { + success: true, + statusCode: 200, + message: "All users fetched successfully.", + data: result, + meta: {}, + }); +}); + +const get_single_users = catchAsync(async (req, res) => { + const result = await users_service.get_single_users_from_db(req); + manageResponse(res, { + success: true, + statusCode: 200, + message: "Single users fetched successfully.", + data: result, + meta: {}, + }); +}); + +const create_users = catchAsync(async (req, res) => { + const result = await users_service.create_users_into_db(req); + manageResponse(res, { + success: true, + statusCode: 200, + message: "users created successfully.", + data: result, + meta: {}, + }); +}); + +const update_users = catchAsync(async (req, res) => { + const result = await users_service.update_users_into_db(req); + manageResponse(res, { + success: true, + statusCode: 200, + message: "users updated successfully.", + data: result, + meta: {}, + }); +}); + +const delete_users = catchAsync(async (req, res) => { + const result = await users_service.delete_users_from_db(req); + manageResponse(res, { + success: true, + statusCode: 200, + message: "users deleted successfully.", + data: result, + meta: {}, + }); +}); + +export const users_controller = { + get_all_users, + get_single_users, + create_users, + update_users, + delete_users, +}; + \ No newline at end of file diff --git a/src/app/modules/users/users.route.ts b/src/app/modules/users/users.route.ts new file mode 100644 index 0000000..be8e7ab --- /dev/null +++ b/src/app/modules/users/users.route.ts @@ -0,0 +1,24 @@ + + import { Router } from "express"; +import { users_controller } from "./users.controller.js"; +import { users_validations } from "./users.validation.js"; +import RequestValidator from "../../middlewares/request_validator.js"; + +const router = Router(); + +router.get("/", users_controller.get_all_users); +router.post( + "/", + RequestValidator(users_validations.create_users), + users_controller.create_users, +); +router.get("/:id", users_controller.get_single_users); +router.patch( + "/:id", + RequestValidator(users_validations.update_users), + users_controller.update_users, +); +router.delete("/:id", users_controller.delete_users); + +export default router; + \ No newline at end of file diff --git a/src/app/modules/users/users.service.ts b/src/app/modules/users/users.service.ts new file mode 100644 index 0000000..2d135dc --- /dev/null +++ b/src/app/modules/users/users.service.ts @@ -0,0 +1,65 @@ + +import { Request } from "express"; +import { prisma } from "../../lib/prisma.js"; +import paginationHelper from "../../utils/pagination_helper.js"; + +const get_all_users_from_db = async (req: Request) => { + const {page,skip,limit}=paginationHelper(req.query); + + + // define your own login here + const result = await prisma.profile.findMany({ + take:limit, + skip, + select:{ + account:{ + select:{ + isSubscribe:true, + email:true, + + } + }, + shopName:true, + id:true, + status:true + + } + }); + return result; +}; + +const get_single_users_from_db = async (req: Request) => { + // define your own login here + const { id } = req.params as { id: string }; + const result = await prisma.account.findUnique({where:{id}}); + return result; +}; + +const create_users_into_db = async (req: Request) => { + // define your own login here + const result = await prisma.account.create({data:req.body}); + return result; +}; + +const update_users_into_db = async (req: Request) => { + // define your own login here + const { id } = req.params as { id: string }; + const result = await prisma.account.update({where:{id},data:req.body}); + return result; +}; + +const delete_users_from_db = async (req: Request) => { + // define your own login here + const { id } = req.params as { id: string }; + const result = await prisma.account.delete({where:{id}}); + return result; +}; + +export const users_service = { + get_all_users_from_db, + get_single_users_from_db, + create_users_into_db, + update_users_into_db, + delete_users_from_db, +}; + \ No newline at end of file diff --git a/src/app/modules/users/users.swagger.ts b/src/app/modules/users/users.swagger.ts new file mode 100644 index 0000000..a951986 --- /dev/null +++ b/src/app/modules/users/users.swagger.ts @@ -0,0 +1,110 @@ + + export const usersSwaggerDocs = { + "/api/users": { + post: { + tags: ["users"], + summary: "Create new users", + description: "", + requestBody: { + required: true, + content: { + "application/json": { + example: JSON.stringify({}), // put your request body + }, + }, + }, + responses: { + 201: { description: "users created successfully" }, + 500: { description: "Validation error or internal server error" }, + }, + }, + get: { + tags: ["users"], + summary: "Get all users", + description: "", + parameters: [ + { + name: "page", + in: "query", + required: false, + schema: { type: "number" }, + }, + { + name: "limit", + in: "query", + required: false, + schema: { type: "number" }, + }, + ], + responses: { + 200: { description: "users fetched successfully" }, + 401: { description: "unauthorized" }, + }, + }, + }, + + "/api/users/{id}": { + get: { + tags: ["users"], + summary: "Get single users", + description: "", + parameters: [ + { + name: "id", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + responses: { + 200: { description: "users fetched successfully" }, + 401: { description: "unauthorized" }, + }, + }, + patch: { + tags: ["users"], + summary: "Update users", + description: "", + parameters: [ + { + name: "id", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + requestBody: { + required: true, + content: { + "application/json": { + example: JSON.stringify({}), // put your request body + }, + }, + }, + responses: { + 200: { description: "users updated successfully" }, + 500: { description: "Validation error or internal server error" }, + }, + }, + delete: { + tags: ["users"], + summary: "Delete users", + description: "", + parameters: [ + { + name: "id", + in: "path", + required: true, + schema: { type: "string" }, + }, + ], + responses: { + 200: { description: "users delete successfully" }, + 401: { description: "unauthorized" }, + }, + }, + }, +}; + + + \ No newline at end of file diff --git a/src/app/modules/users/users.validation.ts b/src/app/modules/users/users.validation.ts new file mode 100644 index 0000000..2424e36 --- /dev/null +++ b/src/app/modules/users/users.validation.ts @@ -0,0 +1,10 @@ + +import { z } from "zod"; + +const create_users = z.object({}); +const update_users = z.object({}); + +export const users_validations = { + create_users, + update_users, +}; diff --git a/src/routes.ts b/src/routes.ts index faf8148..e873c17 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -5,10 +5,12 @@ import planRoute from "./app/modules/plan/plan.route.js"; import profileRoute from "./app/modules/profile/profile.route.js"; import supportRoute from "./app/modules/support/support.route.js"; import templateRoute from "./app/modules/template/template.route"; +import usersRoute from "./app/modules/users/users.route"; const appRouter = Router(); const moduleRoutes = [ + { path: "/users", route: usersRoute }, { path: "/template", route: templateRoute }, { path: "/order", route: orderRoute }, { path: "/support", route: supportRoute }, diff --git a/src/swaggerOptions.ts b/src/swaggerOptions.ts index 3aa0273..34fd8ba 100644 --- a/src/swaggerOptions.ts +++ b/src/swaggerOptions.ts @@ -7,6 +7,7 @@ import { planSwaggerDocs } from "./app/modules/plan/plan.swagger.js"; import { profileSwaggerDocs } from "./app/modules/profile/profile.swagger.js"; import { supportSwaggerDocs } from "./app/modules/support/support.swagger.js"; import { templateSwaggerDocs } from "./app/modules/template/template.swagger"; +import { usersSwaggerDocs } from "./app/modules/users/users.swagger"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -26,6 +27,7 @@ export const swaggerOptions = { ...profileSwaggerDocs, ...supportSwaggerDocs, ...templateSwaggerDocs, + ...usersSwaggerDocs, }, servers: configs.env === "production" -- 2.52.0 From c05266a522738db7e09efc5a4f7b61aefd797728 Mon Sep 17 00:00:00 2001 From: sharafat Date: Sun, 24 May 2026 23:37:13 +0600 Subject: [PATCH 5/6] USER API's resolve the issues --- src/app/modules/users/users.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/modules/users/users.service.ts b/src/app/modules/users/users.service.ts index 2d135dc..c45dd3e 100644 --- a/src/app/modules/users/users.service.ts +++ b/src/app/modules/users/users.service.ts @@ -25,7 +25,8 @@ const get_all_users_from_db = async (req: Request) => { } }); - return result; + const usersCount = await prisma.profile.count(); + return{ result,usersCount,page,limit,skip}; }; const get_single_users_from_db = async (req: Request) => { -- 2.52.0 From f224ff6bf0c1624d6d6e5b3ea3a2eb7382bad554 Mon Sep 17 00:00:00 2001 From: sharafat Date: Wed, 17 Jun 2026 22:01:03 +0600 Subject: [PATCH 6/6] Add api: Users --- src/app/modules/order/order.service.ts | 3 +- src/app/modules/profile/profile.service.ts | 1 - src/app/modules/users/users.service.ts | 48 ++++++++++++---------- src/app/modules/users/users.swagger.ts | 12 +++--- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/app/modules/order/order.service.ts b/src/app/modules/order/order.service.ts index e554f37..864b9ed 100644 --- a/src/app/modules/order/order.service.ts +++ b/src/app/modules/order/order.service.ts @@ -130,7 +130,7 @@ const get_single_order_from_db = async (req: Request) => { const create_order_into_db = async (req: Request) => { const payload = req?.body; - console.log(payload); + payload.status = "INITIATED"; payload.paymentType = "COD"; @@ -153,7 +153,6 @@ const create_order_into_db = async (req: Request) => { const update_order_into_db = async (req: Request) => { // define your own login here const user = req.user; - console.log(user); if (user?.role !== "ADMIN") { throw new AppError("You are not authorized to perform this action", 403); } diff --git a/src/app/modules/profile/profile.service.ts b/src/app/modules/profile/profile.service.ts index 5aaf758..b93e02d 100644 --- a/src/app/modules/profile/profile.service.ts +++ b/src/app/modules/profile/profile.service.ts @@ -7,7 +7,6 @@ const update_profile_into_db = async (req: Request) => { const user = req?.user as JwtPayloadType; const payload = req?.body; const file = req?.file; - console.log(payload); // check file and upload to cloud if (file) { const cloudRes = await uploadCloud(file); diff --git a/src/app/modules/users/users.service.ts b/src/app/modules/users/users.service.ts index c45dd3e..8404cb8 100644 --- a/src/app/modules/users/users.service.ts +++ b/src/app/modules/users/users.service.ts @@ -1,58 +1,63 @@ - import { Request } from "express"; import { prisma } from "../../lib/prisma.js"; import paginationHelper from "../../utils/pagination_helper.js"; const get_all_users_from_db = async (req: Request) => { - const {page,skip,limit}=paginationHelper(req.query); - + const { page, skip, limit } = paginationHelper(req.query); + const search = req.query.search as string; + const andCondition = {} as any; + if (search) { + andCondition.shopName = { + contains: search, + mode: "insensitive", + }; + } // define your own login here const result = await prisma.profile.findMany({ - take:limit, + take: limit, skip, - select:{ - account:{ - select:{ - isSubscribe:true, - email:true, - - } + where: andCondition, + select: { + account: { + select: { + isSubscribe: true, + email: true, + }, }, - shopName:true, - id:true, - status:true - - } + shopName: true, + id: true, + status: true, + }, }); const usersCount = await prisma.profile.count(); - return{ result,usersCount,page,limit,skip}; + return { result, usersCount, page, limit, skip }; }; const get_single_users_from_db = async (req: Request) => { // define your own login here const { id } = req.params as { id: string }; - const result = await prisma.account.findUnique({where:{id}}); + const result = await prisma.profile.findUnique({ where: { id } }); return result; }; const create_users_into_db = async (req: Request) => { // define your own login here - const result = await prisma.account.create({data:req.body}); + const result = await prisma.account.create({ data: req.body }); return result; }; const update_users_into_db = async (req: Request) => { // define your own login here const { id } = req.params as { id: string }; - const result = await prisma.account.update({where:{id},data:req.body}); + const result = await prisma.account.update({ where: { id }, data: req.body }); return result; }; const delete_users_from_db = async (req: Request) => { // define your own login here const { id } = req.params as { id: string }; - const result = await prisma.account.delete({where:{id}}); + const result = await prisma.account.delete({ where: { id } }); return result; }; @@ -63,4 +68,3 @@ export const users_service = { update_users_into_db, delete_users_from_db, }; - \ No newline at end of file diff --git a/src/app/modules/users/users.swagger.ts b/src/app/modules/users/users.swagger.ts index a951986..4672e12 100644 --- a/src/app/modules/users/users.swagger.ts +++ b/src/app/modules/users/users.swagger.ts @@ -1,5 +1,4 @@ - - export const usersSwaggerDocs = { +export const usersSwaggerDocs = { "/api/users": { post: { tags: ["users"], @@ -35,6 +34,12 @@ required: false, schema: { type: "number" }, }, + { + name: "search", + in: "query", + required: false, + schema: { type: "string" }, + }, ], responses: { 200: { description: "users fetched successfully" }, @@ -105,6 +110,3 @@ }, }, }; - - - \ No newline at end of file -- 2.52.0