first commit

This commit is contained in:
2026-03-26 08:14:56 +03:30
commit 3561c09e2d
128 changed files with 16084 additions and 0 deletions

View File

@@ -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;

View 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;

View 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;

View 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;