diff --git a/src/controllers/service_fare.ts b/src/controllers/service_fare.ts index 1d3e658..ad1e585 100644 --- a/src/controllers/service_fare.ts +++ b/src/controllers/service_fare.ts @@ -22,7 +22,12 @@ export class ServiceFareController { /* #swagger.tags = ['Service Fare'] #swagger.security = [{ "bearerAuth": [] }] - #swagger.parameters['filter'] = { description: '', in: 'query', type: 'string' } + #swagger.parameters['filter'] = { + description: 'Filter data in JSON format. Available fields: Service entity fields (e.g. {\"name\": \"value\"}) and special field {\"service_type_name\": \"value\"} for filtering by service type name (case-insensitive, supports partial match)', + in: 'query', + type: 'string', + example: '{\"service_type_name\": \"express\"}' + } #swagger.parameters['limit'] = { in: 'query', required: true, type: 'number' } #swagger.parameters['page'] = { in: 'query', required: true, type: 'number' } #swagger.parameters['with_deleted'] = { in: 'query', required: true, type: 'boolean' } @@ -46,6 +51,10 @@ export class ServiceFareController { const offset = (param.page - 1) * param.limit; const limit = param.limit; + // Pisahkan service_type_name dari filter sebelum masuk ke ServiceModel.list + const serviceTypeName = filter?.service_type_name ?? null; + if (filter?.service_type_name) delete filter.service_type_name; + var query = await ServiceModel.list(filter); const res_count = query.clone(); @@ -65,7 +74,7 @@ export class ServiceFareController { .innerJoin("fare_type", "ft", 'sf."faretypeId" = ft.id AND ft.deleted_at IS NULL') .innerJoin("service_classes", "sc", 'sf."serviceClassId" = sc.id AND sc.deleted_at IS NULL') .innerJoin("services", "s", 'sf."serviceId" = s.id AND s.deleted_at IS NULL') - .innerJoin("service_types", "st", 's."serviceTypeId" = st.id AND st.deleted_at IS NULL') // ← fix di sini + .innerJoin("service_types", "st", 's."serviceTypeId" = st.id AND st.deleted_at IS NULL') .groupBy('sf."serviceId", st.name'); }, "sfa", @@ -78,6 +87,12 @@ export class ServiceFareController { .skip(offset) .take(limit); + // Filter service_type_name dari subquery + if (serviceTypeName) { + res_list.andWhere('sfa.service_type_name ILIKE :service_type_name', { service_type_name: `%${serviceTypeName}%` }); + res_count.andWhere('sfa.service_type_name ILIKE :service_type_name', { service_type_name: `%${serviceTypeName}%` }); + } + if (param.with_deleted) { res_count.withDeleted(); res_list.withDeleted();