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) <noreply@anthropic.com>
This commit is contained in:
LincPay
2026-08-06 15:17:43 +05:30
co-authored by Claude Opus 5
parent a18c2f335f
commit f7fd461e73
@@ -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.
*
* <p>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<List<MarketSignal>> marketSignals(@RequestParam(defaultValue = "12") int weeks) {
return ApiResponse.ok(marketSignalRepository
.findByWeekStartGreaterThanEqualOrderByWeekStartDesc(Weeks.startOf(LocalDate.now()).minusWeeks(weeks)));
public ApiResponse<List<Map<String, Object>>> marketSignals(@RequestParam(defaultValue = "12") int weeks) {
Map<Long, String> districts = new java.util.HashMap<>();
districtRepository.findAll().forEach(d -> districts.put(d.getId(), d.getName()));
Map<Long, String> commodities = new java.util.HashMap<>();
commodityRepository.findAll().forEach(c -> commodities.put(c.getId(), c.getName()));
List<Map<String, Object>> out = new ArrayList<>();
for (MarketSignal signal : marketSignalRepository
.findByWeekStartGreaterThanEqualOrderByWeekStartDesc(Weeks.startOf(LocalDate.now()).minusWeeks(weeks))) {
Map<String, Object> 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<List<ClimateSignal>> climateSignals(@RequestParam(defaultValue = "12") int weeks) {
return ApiResponse.ok(climateSignalRepository
.findByWeekStartGreaterThanEqualOrderByWeekStartDesc(Weeks.startOf(LocalDate.now()).minusWeeks(weeks)));
public ApiResponse<List<Map<String, Object>>> climateSignals(@RequestParam(defaultValue = "12") int weeks) {
Map<Long, String> districts = new java.util.HashMap<>();
districtRepository.findAll().forEach(d -> districts.put(d.getId(), d.getName()));
List<Map<String, Object>> out = new ArrayList<>();
for (ClimateSignal signal : climateSignalRepository
.findByWeekStartGreaterThanEqualOrderByWeekStartDesc(Weeks.startOf(LocalDate.now()).minusWeeks(weeks))) {
Map<String, Object> 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);
}
/**