From 82fc26e25fb7ded014c2d386f03f09fc39c29209 Mon Sep 17 00:00:00 2001 From: Jesse Elliott Date: Thu, 4 Jun 2026 10:45:54 -0400 Subject: [PATCH] Fix service loading Signed-off-by: Jesse Elliott --- app/src/main/java/app/RootController.java | 9 +++++++++ .../app/service/SystemReservedGroupInitializer.java | 2 +- .../java/app/service/service/ServiceService.java | 12 +++++++++++- .../SelectARequestCategory.svelte | 10 ++++------ frontend/src/lib/services/Libre311/Libre311.ts | 10 ++++++++++ .../services/Libre311/OfflineAwareLibre311Service.ts | 4 ++++ frontend/src/routes/admin/system/+page.svelte | 3 +-- frontend/src/routes/photo-voice/create/+page.svelte | 3 +-- 8 files changed, 41 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/app/RootController.java b/app/src/main/java/app/RootController.java index 4b85a1bc..a4ee78eb 100644 --- a/app/src/main/java/app/RootController.java +++ b/app/src/main/java/app/RootController.java @@ -126,6 +126,15 @@ public HttpResponse indexXml(@Valid Pageable pageable, return HttpResponse.ok(xmlMapper.writeValueAsString(serviceList)); } + @Get("/services/{serviceCode}/details{?jurisdiction_id}") + @Produces(MediaType.APPLICATION_JSON) + @ExecuteOn(TaskExecutors.IO) + public ServiceDTO getServiceJson(Long serviceCode, + @Nullable @QueryValue("jurisdiction_id") String jurisdiction_id) { + + return serviceService.findService(serviceCode, jurisdiction_id); + } + @Get(uris = {"/services/{serviceCode}{?jurisdiction_id}", "/services/{serviceCode}.json{?jurisdiction_id}"}) @Produces(MediaType.APPLICATION_JSON) @ExecuteOn(TaskExecutors.IO) diff --git a/app/src/main/java/app/service/SystemReservedGroupInitializer.java b/app/src/main/java/app/service/SystemReservedGroupInitializer.java index 0480df26..06d60d92 100644 --- a/app/src/main/java/app/service/SystemReservedGroupInitializer.java +++ b/app/src/main/java/app/service/SystemReservedGroupInitializer.java @@ -26,7 +26,7 @@ @Singleton public class SystemReservedGroupInitializer { - static final String SYSTEM_RESERVED = "System Reserved"; + public static final String SYSTEM_RESERVED = "System Reserved"; private final JurisdictionRepository jurisdictionRepository; private final ServiceGroupRepository serviceGroupRepository; diff --git a/app/src/main/java/app/service/service/ServiceService.java b/app/src/main/java/app/service/service/ServiceService.java index 13ddaf46..9ed777a1 100644 --- a/app/src/main/java/app/service/service/ServiceService.java +++ b/app/src/main/java/app/service/service/ServiceService.java @@ -38,6 +38,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import app.service.SystemReservedGroupInitializer; import jakarta.transaction.Transactional; import java.util.Comparator; import java.util.List; @@ -97,7 +98,16 @@ public GroupNotFoundException(Long groupId) { public List findAll(String jurisdictionId) { List servicePage = serviceRepository.findAllByJurisdictionIdOrderByOrderPosition(jurisdictionId); - return servicePage.stream().map(this::toServiceDTO).collect(Collectors.toList()); + return servicePage.stream() + .filter(s -> !SystemReservedGroupInitializer.SYSTEM_RESERVED.equals(s.getServiceGroup().getName())) + .map(this::toServiceDTO) + .collect(Collectors.toList()); + } + + public ServiceDTO findService(Long serviceCode, String jurisdictionId) { + return serviceRepository.findById(serviceCode) + .map(this::toServiceDTO) + .orElseThrow(() -> new ServiceNotFoundException(serviceCode, jurisdictionId)); } public ServiceDefinitionDTO getServiceDefinition(Long serviceCode, String jurisdictionId) { diff --git a/frontend/src/lib/components/CreateServiceRequest/SelectARequestCategory.svelte b/frontend/src/lib/components/CreateServiceRequest/SelectARequestCategory.svelte index 30b97677..de7700eb 100644 --- a/frontend/src/lib/components/CreateServiceRequest/SelectARequestCategory.svelte +++ b/frontend/src/lib/components/CreateServiceRequest/SelectARequestCategory.svelte @@ -18,7 +18,6 @@ import type { CreateServiceRequestUIParams } from './shared'; import messages from '$media/messages.json'; import { setUpAlertRole } from '$lib/utils/functions'; - import { SYSTEM_RESERVED_GROUP_NAME } from '$lib/constants/photoVoice'; export let params: Partial; @@ -37,11 +36,10 @@ onMount(fetchServiceList); function fetchServiceList() { - Promise.all([libre311.getServiceList(), libre311.getGroupList()]) - .then(([services, groups]) => { - const reservedId = groups.find((g) => g.name === SYSTEM_RESERVED_GROUP_NAME)?.id; - const filtered = services.filter((s) => s.group_id !== reservedId); - serviceList = asAsyncSuccess(filtered); + libre311 + .getServiceList() + .then((services) => { + serviceList = asAsyncSuccess(services); }) .catch((err) => (serviceList = asAsyncFailure(err))); } diff --git a/frontend/src/lib/services/Libre311/Libre311.ts b/frontend/src/lib/services/Libre311/Libre311.ts index 50aa3d98..8111b26d 100644 --- a/frontend/src/lib/services/Libre311/Libre311.ts +++ b/frontend/src/lib/services/Libre311/Libre311.ts @@ -633,6 +633,7 @@ type UpdateAttributesOrderParams = { } & HasServiceCode; export interface Libre311Service extends Open311Service { getJurisdictionConfig(): JurisdictionConfig; + getService(params: HasServiceCode): Promise; reverseGeocode(coords: L.PointTuple): Promise; uploadImage(file: File): Promise; setAuthInfo(authInfo: UnityAuthLoginResponse | undefined): void; @@ -683,6 +684,8 @@ const ROUTES = { getJurisdictionConfig: '/config', getServiceList: (params: HasJurisdictionId) => `/services?jurisdiction_id=${params.jurisdiction_id}`, + getService: (params: HasJurisdictionId & HasServiceCode) => + `/services/${params.service_code}/details?jurisdiction_id=${params.jurisdiction_id}`, getServiceDefinition: (params: HasJurisdictionId & HasServiceCode) => `/services/${params.service_code}?jurisdiction_id=${params.jurisdiction_id}`, getServiceRequests: (qParams: URLSearchParams) => `/requests?${qParams.toString()}`, @@ -982,6 +985,13 @@ export class Libre311ServiceImpl implements Libre311Service { } } + async getService(params: HasServiceCode): Promise { + const res = await this.axiosInstance.get( + ROUTES.getService({ ...params, jurisdiction_id: this.jurisdictionId }) + ); + return ServiceSchema.parse(res.data); + } + async getServiceDefinition(params: HasServiceCode): Promise { try { const res = await this.axiosInstance.get( diff --git a/frontend/src/lib/services/Libre311/OfflineAwareLibre311Service.ts b/frontend/src/lib/services/Libre311/OfflineAwareLibre311Service.ts index 2f11236d..d034ce07 100644 --- a/frontend/src/lib/services/Libre311/OfflineAwareLibre311Service.ts +++ b/frontend/src/lib/services/Libre311/OfflineAwareLibre311Service.ts @@ -95,6 +95,10 @@ export class OfflineAwareLibre311Service implements Libre311Service { return this.wrapped.getServiceList(); } + getService(params: HasServiceCode): Promise { + return this.wrapped.getService(params); + } + getServiceDefinition(params: HasServiceCode): Promise { return this.wrapped.getServiceDefinition(params); } diff --git a/frontend/src/routes/admin/system/+page.svelte b/frontend/src/routes/admin/system/+page.svelte index c89a515f..7d53fb51 100644 --- a/frontend/src/routes/admin/system/+page.svelte +++ b/frontend/src/routes/admin/system/+page.svelte @@ -55,9 +55,8 @@ onMount(async () => { try { const photoVoiceCode = $jurisdiction.photo_voice_service_code; - const services = await service.getServiceList(); photoVoiceService = photoVoiceCode - ? services.find((s) => s.service_code === photoVoiceCode) + ? await service.getService({ service_code: photoVoiceCode }) : undefined; if (photoVoiceService) { nameText = photoVoiceService.service_name; diff --git a/frontend/src/routes/photo-voice/create/+page.svelte b/frontend/src/routes/photo-voice/create/+page.svelte index f34b5c4d..fd38e3ba 100644 --- a/frontend/src/routes/photo-voice/create/+page.svelte +++ b/frontend/src/routes/photo-voice/create/+page.svelte @@ -64,8 +64,7 @@ try { const photoVoiceCode = $jurisdictionStore.photo_voice_service_code; if (photoVoiceCode) { - const services = await libre311.getServiceList(); - photoVoiceService = services.find((s) => s.service_code === photoVoiceCode); + photoVoiceService = await libre311.getService({ service_code: photoVoiceCode }); } } catch (err) { alertError(err);