first commit
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
import {Controller} from "@/core/controller/main.controller";
|
||||
import MedicalPackageService from "../service/medical-package.service";
|
||||
import {ServerResponse} from "@/common/types";
|
||||
import {NextFunction} from "express";
|
||||
import CreateMedicalPackageValidationSchema from "../validation";
|
||||
|
||||
class MedicalPackageControllerClass extends Controller {
|
||||
#service;
|
||||
constructor() {
|
||||
super();
|
||||
this.#service = MedicalPackageService;
|
||||
}
|
||||
async create(req: any, res: ServerResponse, next: NextFunction) {
|
||||
try {
|
||||
await CreateMedicalPackageValidationSchema.validateAsync(req.body || {});
|
||||
|
||||
await this.#service.create(req.body);
|
||||
return res.status(200).json({
|
||||
status: 200,
|
||||
data: {},
|
||||
message: "انجام شد",
|
||||
});
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
async getAllWithPagination(
|
||||
req: any,
|
||||
res: ServerResponse,
|
||||
next: NextFunction
|
||||
) {
|
||||
try {
|
||||
const data = await this.#service.getAllWithPagination(req, res);
|
||||
return res.status(200).json({
|
||||
status: 200,
|
||||
data,
|
||||
message: "Ok",
|
||||
});
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
async getAllParentsWithoutPagination(
|
||||
req: any,
|
||||
res: ServerResponse,
|
||||
next: NextFunction
|
||||
) {
|
||||
try {
|
||||
const data = await this.#service.getAllParentsWithoutPagination();
|
||||
return res.status(200).json({
|
||||
status: 200,
|
||||
data,
|
||||
message: "Ok",
|
||||
});
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
async getSingleMedicalPackage(req:any,res:ServerResponse,next:NextFunction){
|
||||
try {
|
||||
const id = req?.params?.id;
|
||||
const data = await this.#service.getSingleMedicalPackage(req,id)
|
||||
return res.status(200).json({
|
||||
status:200,
|
||||
data,
|
||||
message:"Ok"
|
||||
})
|
||||
} catch (error) {
|
||||
next(error)
|
||||
}
|
||||
}
|
||||
async delete(req:any,res:ServerResponse,next:NextFunction){
|
||||
try {
|
||||
const id = req?.params?.id;
|
||||
await this.#service.delete(id)
|
||||
return res.status(200).json({
|
||||
status:200,
|
||||
data:{},
|
||||
message:"حذف شد"
|
||||
})
|
||||
} catch (error) {
|
||||
next(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const MedicalPackageController = new MedicalPackageControllerClass();
|
||||
|
||||
export default MedicalPackageController;
|
||||
20
src/modules/medical-packages/router/index.router.ts
Normal file
20
src/modules/medical-packages/router/index.router.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import express from "express";
|
||||
import MedicalPackageController from "../controller/medical-package.controller";
|
||||
import {checkLanguageSlug} from "@/core/middlewares/check-language.middleware";
|
||||
|
||||
const medical_package_router = express.Router();
|
||||
|
||||
medical_package_router.post("/create", MedicalPackageController.create);
|
||||
medical_package_router.get(
|
||||
"/:lang/get/all",
|
||||
checkLanguageSlug,
|
||||
MedicalPackageController.getAllWithPagination
|
||||
);
|
||||
medical_package_router.get(
|
||||
"/:lang/get/all/parent",
|
||||
checkLanguageSlug,
|
||||
MedicalPackageController.getAllParentsWithoutPagination
|
||||
);
|
||||
medical_package_router.get('/:lang/get/single/:id',checkLanguageSlug,MedicalPackageController.getSingleMedicalPackage)
|
||||
medical_package_router.delete('/delete/:id',MedicalPackageController.delete)
|
||||
export default medical_package_router;
|
||||
182
src/modules/medical-packages/service/medical-package.service.ts
Normal file
182
src/modules/medical-packages/service/medical-package.service.ts
Normal file
@@ -0,0 +1,182 @@
|
||||
import {prisma} from "@/common/lib/prisma";
|
||||
import {ServerResponse} from "@/common/types";
|
||||
import {handlePrismaError} from "@/common/utils/functions";
|
||||
import {Controller} from "@/core/controller/main.controller";
|
||||
|
||||
class MedicalPackageServiceClass extends Controller {
|
||||
async create(data: any) {
|
||||
const {translations, id, icon, parent_id, priority, thumbnail_id,price} = data;
|
||||
try {
|
||||
await prisma.medicalPackage.create({
|
||||
data: {
|
||||
icon,
|
||||
translations: {
|
||||
create: translations,
|
||||
},
|
||||
priority,
|
||||
price,
|
||||
parent_id: parent_id ? +parent_id : null,
|
||||
...(thumbnail_id && {thumbnail_id: +thumbnail_id}),
|
||||
},
|
||||
|
||||
include: {
|
||||
translations: true,
|
||||
},
|
||||
});
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
handlePrismaError(error);
|
||||
}
|
||||
}
|
||||
async getAllWithPagination(req: any, res: ServerResponse) {
|
||||
const langId = req?.langId;
|
||||
const page = req?.query?.page;
|
||||
const limit = req?.query?.limit;
|
||||
const skip = (page - 1) * limit;
|
||||
const search = req?.query?.search;
|
||||
try {
|
||||
const [data, total] = await Promise.all([
|
||||
prisma.medicalPackage.findMany({
|
||||
skip,
|
||||
take: +limit,
|
||||
where: {
|
||||
translations: {
|
||||
some: {
|
||||
lang_id: langId,
|
||||
...(search && {
|
||||
displayName: {
|
||||
contains: search,
|
||||
mode: "insensitive",
|
||||
},
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
select: {
|
||||
id: true,
|
||||
icon: true,
|
||||
priority: true,
|
||||
thumbnail_id: true,
|
||||
parent_id: true,
|
||||
price:true,
|
||||
thumbnail: {
|
||||
select: {
|
||||
filename: true,
|
||||
fileUrl:true,
|
||||
fileKey:true,
|
||||
},
|
||||
},
|
||||
children: true,
|
||||
translations: {
|
||||
where: {
|
||||
lang_id: langId,
|
||||
},
|
||||
select: {
|
||||
lang_id: true,
|
||||
content: true,
|
||||
title: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
await prisma.medicalPackage.count({
|
||||
where: {
|
||||
translations: {
|
||||
some: {
|
||||
lang_id: langId,
|
||||
...(search && {
|
||||
displayName: {
|
||||
contains: search,
|
||||
mode: "insensitive",
|
||||
},
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
]);
|
||||
|
||||
return {
|
||||
page,
|
||||
limit,
|
||||
total,
|
||||
totalPages: Math.ceil(total / limit),
|
||||
hasNext: page * limit < total,
|
||||
hasPrev: page > 1,
|
||||
data,
|
||||
};
|
||||
} catch (error) {
|
||||
handlePrismaError(error);
|
||||
}
|
||||
}
|
||||
async getAllParentsWithoutPagination() {
|
||||
try {
|
||||
const data = await prisma.medicalPackage.findMany({
|
||||
where: {
|
||||
parent_id: null,
|
||||
},
|
||||
include: {
|
||||
translations: true,
|
||||
},
|
||||
});
|
||||
|
||||
return data;
|
||||
} catch (error) {
|
||||
handlePrismaError(error);
|
||||
}
|
||||
}
|
||||
async getSingleMedicalPackage(req: any, id: string) {
|
||||
const langId = req?.langId;
|
||||
|
||||
try {
|
||||
const data = await prisma.medicalPackage.findUnique({
|
||||
where: {
|
||||
id: +id,
|
||||
translations: {
|
||||
some: {
|
||||
lang_id: +langId,
|
||||
},
|
||||
},
|
||||
},
|
||||
include: {
|
||||
translations: {
|
||||
select: {
|
||||
lang_id: true,
|
||||
title: true,
|
||||
content: true,
|
||||
},
|
||||
},
|
||||
thumbnail:{
|
||||
select:{
|
||||
fileKey:true,
|
||||
filename:true,
|
||||
fileUrl:true
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
return data;
|
||||
} catch (error) {
|
||||
handlePrismaError(error);
|
||||
}
|
||||
}
|
||||
async delete(id: string) {
|
||||
try {
|
||||
await prisma.medicalPackage.delete({
|
||||
where: {
|
||||
id: +id,
|
||||
},
|
||||
});
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
handlePrismaError(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const MedicalPackageService = new MedicalPackageServiceClass();
|
||||
export default MedicalPackageService;
|
||||
49
src/modules/medical-packages/validation/index.ts
Normal file
49
src/modules/medical-packages/validation/index.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
import Joi from "joi";
|
||||
|
||||
const translationSchema = Joi.object({
|
||||
title: Joi.string().required().messages({
|
||||
"string.base": "عنوان می بایست رشته باشد",
|
||||
"string.empty": "عنوان نمیتواند خالی باشد",
|
||||
"any.required": "عنوان الزامیست",
|
||||
}),
|
||||
content: Joi.string().required().messages({
|
||||
"string.base": "محتوا می بایست رشته باشد",
|
||||
"string.empty": "محتوا نمیتواند خالی باشد",
|
||||
"any.required": "محتوا الزامیست",
|
||||
}),
|
||||
lang_id: Joi.number().required().messages({
|
||||
"any.required": "Language is required",
|
||||
}),
|
||||
});
|
||||
|
||||
const CreateMedicalPackageValidationSchema = Joi.object({
|
||||
icon: Joi.string().optional().allow("").messages({
|
||||
"string.base": "آیکون می بایست رشته باشد",
|
||||
"string.empty": "آیکون نمیتواند خالی باشد",
|
||||
}),
|
||||
priority: Joi.number().required().messages({
|
||||
"number.base": "اولویت نمایش می بایست عدد باشد",
|
||||
"any.required": "اولویت نمایش الزامیست",
|
||||
}),
|
||||
parent_id: Joi.number().optional().allow(null).messages({
|
||||
"number.base": "شناسه والد می بایست عدد باشد",
|
||||
}),
|
||||
price: Joi.string().required().allow("").messages({
|
||||
"any.required": "قيمت الزاميست",
|
||||
}),
|
||||
thumbnail_id: Joi.number().optional().allow(null).messages({
|
||||
"number.base": "شناسه عکس شاخص می بایست عدد باشد",
|
||||
"number.empty": "شناسه عکس شاخص نمیتواند خالی باشد",
|
||||
"any.required": "عکس شاخص انتخاب نشده است",
|
||||
}),
|
||||
translations: Joi.array()
|
||||
.items(translationSchema)
|
||||
.min(1)
|
||||
.required()
|
||||
.messages({
|
||||
"array.base": "Translations must be an array",
|
||||
"array.min": "At least one translation is required",
|
||||
"any.required": "Translations are required",
|
||||
}),
|
||||
});
|
||||
export default CreateMedicalPackageValidationSchema;
|
||||
Reference in New Issue
Block a user