From f7fd461e735374afe4fd790379a54e0817f3fc0a Mon Sep 17 00:00:00 2001 From: LincPay Date: Thu, 6 Aug 2026 15:17:43 +0530 Subject: [PATCH] fix(ingestion): name the district and commodity on signal endpoints The console's mandi and climate tables read districtName and commodityName; the endpoints returned districtId and commodityId, so every row rendered blank against a real backend. It went unnoticed because until today nothing had ever run and the screen only ever showed its demo fallback. Names are added alongside the entity's own fields, so a screen does not need the whole master list to render one row. Climate keys now match the UI's contract exactly (tmaxC, hotDays, rainfallAnomalyPct). Co-Authored-By: Claude Opus 5 (1M context) --- .../ingestion/IngestionController.java | 64 +++++++++++++++++-- 1 file changed, 58 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/lincfusion/udyamlinc/ingestion/IngestionController.java b/src/main/java/com/lincfusion/udyamlinc/ingestion/IngestionController.java index 30729a5..db8d755 100644 --- a/src/main/java/com/lincfusion/udyamlinc/ingestion/IngestionController.java +++ b/src/main/java/com/lincfusion/udyamlinc/ingestion/IngestionController.java @@ -2,6 +2,7 @@ package com.lincfusion.udyamlinc.ingestion; import com.lincfusion.udyamlinc.common.ApiResponse; import com.lincfusion.udyamlinc.master.District; +import com.lincfusion.udyamlinc.master.CommodityRepository; import com.lincfusion.udyamlinc.master.DistrictRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; @@ -31,6 +32,7 @@ public class IngestionController { private final ClimateSignalRepository climateSignalRepository; private final ApiLogRepository apiLogRepository; private final DistrictRepository districtRepository; + private final CommodityRepository commodityRepository; // ── what ran ──────────────────────────────────────────── @@ -54,16 +56,66 @@ public class IngestionController { // ── what it wrote ─────────────────────────────────────── + /** + * Signals with their district and commodity named, not as foreign keys. + * + *

The console shows a mandi table, and a screen that has to resolve ids + * itself would need the whole master list to render one row. The entity's own + * fields are passed through unchanged alongside the names. + */ @GetMapping("/signals/market") - public ApiResponse> marketSignals(@RequestParam(defaultValue = "12") int weeks) { - return ApiResponse.ok(marketSignalRepository - .findByWeekStartGreaterThanEqualOrderByWeekStartDesc(Weeks.startOf(LocalDate.now()).minusWeeks(weeks))); + public ApiResponse>> marketSignals(@RequestParam(defaultValue = "12") int weeks) { + Map districts = new java.util.HashMap<>(); + districtRepository.findAll().forEach(d -> districts.put(d.getId(), d.getName())); + Map commodities = new java.util.HashMap<>(); + commodityRepository.findAll().forEach(c -> commodities.put(c.getId(), c.getName())); + + List> out = new ArrayList<>(); + for (MarketSignal signal : marketSignalRepository + .findByWeekStartGreaterThanEqualOrderByWeekStartDesc(Weeks.startOf(LocalDate.now()).minusWeeks(weeks))) { + Map row = new java.util.LinkedHashMap<>(); + row.put("id", signal.getId()); + row.put("districtName", districts.getOrDefault(signal.getDistrictId(), "—")); + row.put("commodityName", commodities.getOrDefault(signal.getCommodityId(), "—")); + row.put("weekStart", signal.getWeekStart()); + row.put("modalPrice", signal.getModalPrice()); + row.put("minPrice", signal.getMinPrice()); + row.put("maxPrice", signal.getMaxPrice()); + row.put("arrivalCount", signal.getArrivalCount()); + row.put("unit", signal.getUnit()); + row.put("source", signal.getSource()); + row.put("validForDate", signal.getValidForDate()); + row.put("observedAt", signal.getObservedAt()); + out.add(row); + } + return ApiResponse.ok(out); } @GetMapping("/signals/climate") - public ApiResponse> climateSignals(@RequestParam(defaultValue = "12") int weeks) { - return ApiResponse.ok(climateSignalRepository - .findByWeekStartGreaterThanEqualOrderByWeekStartDesc(Weeks.startOf(LocalDate.now()).minusWeeks(weeks))); + public ApiResponse>> climateSignals(@RequestParam(defaultValue = "12") int weeks) { + Map districts = new java.util.HashMap<>(); + districtRepository.findAll().forEach(d -> districts.put(d.getId(), d.getName())); + + List> out = new ArrayList<>(); + for (ClimateSignal signal : climateSignalRepository + .findByWeekStartGreaterThanEqualOrderByWeekStartDesc(Weeks.startOf(LocalDate.now()).minusWeeks(weeks))) { + Map row = new java.util.LinkedHashMap<>(); + row.put("id", signal.getId()); + row.put("districtName", districts.getOrDefault(signal.getDistrictId(), "—")); + row.put("weekStart", signal.getWeekStart()); + row.put("isoWeek", signal.getIsoWeek()); + row.put("rainfallMm", signal.getRainfallMm()); + row.put("rainfallNormalMm", signal.getRainfallNormalMm()); + row.put("rainfallAnomalyPct", signal.getRainfallAnomalyPct()); + row.put("tmaxC", signal.getTmaxC()); + row.put("tmaxNormalC", signal.getTmaxNormalC()); + row.put("heatAnomalyC", signal.getHeatAnomalyC()); + row.put("hotDays", signal.getHotDays()); + row.put("validForDate", signal.getValidForDate()); + row.put("observedAt", signal.getObservedAt()); + out.add(row); + } + return ApiResponse.ok(out); } /**