diff --git a/src/controllers/service_fare.ts b/src/controllers/service_fare.ts index a5ef8fe..0fa80af 100644 --- a/src/controllers/service_fare.ts +++ b/src/controllers/service_fare.ts @@ -236,21 +236,35 @@ export class ServiceFareController { /* #swagger.tags = ['Service Fare'] #swagger.security = [{ "bearerAuth": [] }] - #swagger.parameters['id'] = { description: '', in: 'path', type: 'string' } + #swagger.parameters['id'] = { description: 'Service ID', in: 'path', type: 'string' } */ try { const schema = Joi.object().keys({ - id: Joi.string().uuid().required().label("Service Fare Id"), + id: Joi.string().uuid().required().label("Service Id"), // ← label diupdate }); let param: any = await schema.validateAsync(req.params); - let serviceFare = await ServiceFareModel.list({ "ServiceFare.id": param.id }) + let serviceFare = await ServiceModel.list({ "Service.id": param.id }) .then((q) => - q.leftJoinAndSelect("ServiceFare.serviceClass", "serviceClass").leftJoinAndSelect("ServiceFare.service", "service").getOne() + q + .select([ + "Service.id", + "Service.name", + "servicefare.id", + "servicefare.fare", + "serviceClass.id", + "serviceClass.name", + "faretype.id", + "faretype.name", + ]) + .leftJoin("Service.servicefare", "servicefare") + .leftJoin("servicefare.serviceClass", "serviceClass") + .leftJoin("servicefare.faretype", "faretype") + .getOne() ); - if (!serviceFare) throw { message: "Service Fare Not Found" }; + if (!serviceFare || serviceFare.length === 0) throw { message: "Service Fare Not Found" }; return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, serviceFare); } catch (e: unknown) { @@ -260,158 +274,118 @@ export class ServiceFareController { } } - // static async update(req: Request, res: Response, next: NextFunction): Promise { - // /* - // #swagger.tags = ['Service Fare'] - // #swagger.security = [{ "bearerAuth": [] }] - // #swagger.parameters['id'] = { description: '', in: 'path', type: 'string' } - // #swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/serviceFare" } } } } - // */ - // const queryRunner = OrmHelper.DB.createQueryRunner(); - // await queryRunner.startTransaction(); + static async update(req: Request, res: Response, next: NextFunction): Promise { + /* + #swagger.tags = ['Service Fare'] + #swagger.security = [{ "bearerAuth": [] }] + #swagger.parameters['id'] = { description: 'Service Fare ID', in: 'path', type: 'string' } + #swagger.requestBody = { required: true, content: { "application/json": { schema: { $ref: "#/components/schemas/serviceFareUpdate" } } } } + */ + const queryRunner = OrmHelper.DB.createQueryRunner(); + await queryRunner.startTransaction(); - // try { - // const schema = Joi.object().keys({ - // service_id: Joi.string().uuid().required().label("Service ID"), - // faretype: Joi.array().items( - // Joi.object().keys({ - // faretype_id: Joi.string().uuid().required().label("Fare Type ID"), - // service_class: Joi.array().items( - // Joi.object().keys({ - // service_class_id: Joi.string().uuid().required().label("Service Class ID"), - // fare: Joi.number().min(0).allow(null).label("Fare"), - // }) - // ).min(1).required().label("Service Class"), - // }) - // ).min(1).required().label("Fare Type"), - // }); + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("Service Fare ID"), + fare: Joi.number().min(0).required().label("Fare"), + }); - // let param: any = await schema.validateAsync(req.body); + let param: any = await schema.validateAsync({ + ...req.body, + id: req.params.id, + }); - // // Validasi Service - // let service = await ServiceModel.list({ "Service.id": param.service_id }).then((q) => q.getOne()); - // if (!service) throw { message: "Service not found" }; + // Cari data berdasarkan ID + let serviceFare = await ServiceFareModel.list({ "ServiceFare.id": param.id }).then((q) => q.getOne()); + if (!serviceFare) throw { message: "Service Fare " + Language.lang.failed_not_found }; - // // Hapus semua row lama berdasarkan service_id - // const existingFares = await ServiceFareModel.list({ "ServiceFare.serviceId": param.service_id }).then((q) => q.getMany()); - // if (existingFares.length > 0) { - // await queryRunner.manager.remove(existingFares); - // } + // Update fare saja + serviceFare.fare = String(param.fare); + serviceFare.updated_by = req.auth.data.name; - // const savedServiceFares: ServiceFare[] = []; + await queryRunner.manager.save(serviceFare); + await queryRunner.commitTransaction(); - // // Loop tiap faretype - // for (const ft of param.faretype) { + return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, serviceFare); - // // Validasi FareType - // let fareType = await OrmHelper.DB.getRepository("FareType") - // .createQueryBuilder("FareType") - // .where("FareType.id = :id", { id: ft.faretype_id }) - // .getOne(); - // if (!fareType) throw { message: `Fare Type ID ${ft.faretype_id} not found` }; + } catch (e: unknown) { + await queryRunner.rollbackTransaction(); + log.error(e); + const err = e as Error; + return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message); + } finally { + await queryRunner.release(); + } + } - // // Loop tiap service_class dalam faretype ini - // for (const sc of ft.service_class) { + static async delete(req: Request, res: Response, next: NextFunction): Promise { + /* + #swagger.tags = ['Service Fare'] + #swagger.security = [{ "bearerAuth": [] }] + #swagger.parameters['id'] = { in: 'path', required: true, type: 'string' } + #swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' } + */ + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("ID"), + hard: Joi.bool().optional().allow("").label("Is hard delete?"), + }); - // // Validasi ServiceClass - // let serviceClass = await ServiceClassModel.list({ "ServiceClass.id": sc.service_class_id }).then((q) => q.getOne()); - // if (!serviceClass) throw { message: `Service Class ID ${sc.service_class_id} not found` }; + const param: { id: string; hard: boolean } = await schema.validateAsync(req.params); - // let serviceFare = new ServiceFare(); - // serviceFare.service = service; - // serviceFare.faretype = ft.faretype_id; - // serviceFare.serviceClass = serviceClass; - // serviceFare.fare = String(sc.fare ?? 0); - // serviceFare.created_by = req.auth.data.name; - // serviceFare.updated_by = req.auth.data.name; + let affected = 0; + if (!param.hard) { + let serviceFare: ServiceFare = await ServiceFareModel.list({ "ServiceFare.id": param.id }).then((q) => q.getOne()); - // const saved = await queryRunner.manager.save(serviceFare); - // savedServiceFares.push(saved); - // } - // } + if (!serviceFare) throw { message: "Service Fare " + Language.lang.failed_not_found }; - // await queryRunner.commitTransaction(); + serviceFare.deleted_by = req.auth.data.name; + serviceFare.deleted_at = moment().toDate(); + await OrmHelper.DB.manager.save(serviceFare); + affected = 1; + } else { + const repo = OrmHelper.DB.getRepository(ServiceFare); + affected = (await repo.delete({ id: param.id })).affected ?? 0; + } - // return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, savedServiceFares); + if (affected > 0) { + return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {}); + } else { + return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, ""); + } + } catch (e: unknown) { + log.error(e); + const err = e as Error; + return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message); + } + } - // } catch (e: unknown) { - // await queryRunner.rollbackTransaction(); - // log.error(e); - // const err = e as Error; - // return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message); - // } finally { - // await queryRunner.release(); - // } - // } + static async restore(req: Request, res: Response, next: NextFunction): Promise { + /* + #swagger.tags = ['Service Fare'] + #swagger.security = [{ "bearerAuth": [] }] + #swagger.parameters['id'] = { in: 'path', required: true, type: 'string' } + */ + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("ID"), + }); - // static async delete(req: Request, res: Response, next: NextFunction): Promise { - // /* - // #swagger.tags = ['Service Fare'] - // #swagger.security = [{ "bearerAuth": [] }] - // #swagger.parameters['id'] = { in: 'path', required: true, type: 'string' } - // #swagger.parameters['hard'] = { in: 'path', description: 'Is Hard Delete', required: false, type: 'boolean' } - // */ - // try { - // const schema = Joi.object().keys({ - // id: Joi.string().uuid().required().label("ID"), - // hard: Joi.bool().optional().allow("").label("Is hard delete?"), - // }); + const param: any = await schema.validateAsync(req.params); - // const param: { id: string; hard: boolean } = await schema.validateAsync(req.params); + const repo = OrmHelper.DB.getRepository(ServiceFare); - // let affected = 0; - // if (!param.hard) { - // let serviceFare: ServiceFare = await ServiceFareModel.list({ "ServiceFare.id": param.id }).then((q) => q.getOne()); + const affected = (await repo.restore({ id: param.id })).affected ?? 0; - // if (!serviceFare) throw { message: "Service Fare " + Language.lang.failed_not_found }; - - // serviceFare.deleted_by = req.auth.data.name; - // serviceFare.deleted_at = moment().toDate(); - // await OrmHelper.DB.manager.save(serviceFare); - // affected = 1; - // } else { - // const repo = OrmHelper.DB.getRepository(ServiceFare); - // affected = (await repo.delete({ id: param.id })).affected ?? 0; - // } - - // if (affected > 0) { - // return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {}); - // } else { - // return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, ""); - // } - // } catch (e: unknown) { - // log.error(e); - // const err = e as Error; - // return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message); - // } - // } - - // static async restore(req: Request, res: Response, next: NextFunction): Promise { - // /* - // #swagger.tags = ['Service Fare'] - // #swagger.security = [{ "bearerAuth": [] }] - // #swagger.parameters['id'] = { in: 'path', required: true, type: 'string' } - // */ - // try { - // const schema = Joi.object().keys({ - // id: Joi.string().uuid().required().label("ID"), - // }); - - // const param: any = await schema.validateAsync(req.params); - - // const repo = OrmHelper.DB.getRepository(ServiceFare); - - // const affected = (await repo.restore({ id: param.id })).affected ?? 0; - - // if (affected > 0) { - // return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {}); - // } else { - // return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, ""); - // } - // } catch (e: unknown) { - // log.error(e); - // const err = e as Error; - // return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message); - // } - // } + if (affected > 0) { + return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {}); + } else { + return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, ""); + } + } catch (e: unknown) { + log.error(e); + const err = e as Error; + return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message); + } + } } diff --git a/src/routes/private.ts b/src/routes/private.ts index de6046d..5a1009d 100644 --- a/src/routes/private.ts +++ b/src/routes/private.ts @@ -186,9 +186,9 @@ export class RoutePrivate { app.get('/api/service-fare/option', ServiceFareController.option) app.post('/api/service-fare/create', ServiceFareController.create) app.get('/api/service-fare/detail/:id', ServiceFareController.detail) - // app.put('/api/service-fare/update/:id', ServiceFareController.update) - // app.delete('/api/service-fare/delete/:id/:hard', ServiceFareController.delete) - // app.put('/api/service-fare/restore/:id', ServiceFareController.restore) + app.put('/api/service-fare/update/:id', ServiceFareController.update) + app.delete('/api/service-fare/delete/:id/:hard', ServiceFareController.delete) + app.put('/api/service-fare/restore/:id', ServiceFareController.restore) app.get('/api/service-package/list', ServicePackageController.list) app.post('/api/service-package/create', ServicePackageController.create) diff --git a/src/swagger/builder.js b/src/swagger/builder.js index aecdbb0..3d39082 100644 --- a/src/swagger/builder.js +++ b/src/swagger/builder.js @@ -457,10 +457,13 @@ const doc = { payment_method: { $name: "Name (string)", }, - registration_fee:{ + registration_fee: { type: "emergency | outpatient", service: ["uuid-string-1", "uuid-string-2"] - } + }, + serviceFareUpdate: { + $fare: 100000, + }, }, parameters: {}, securitySchemes: {