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:
@@ -2,6 +2,7 @@ package com.lincfusion.udyamlinc.ingestion;
|
|||||||
|
|
||||||
import com.lincfusion.udyamlinc.common.ApiResponse;
|
import com.lincfusion.udyamlinc.common.ApiResponse;
|
||||||
import com.lincfusion.udyamlinc.master.District;
|
import com.lincfusion.udyamlinc.master.District;
|
||||||
|
import com.lincfusion.udyamlinc.master.CommodityRepository;
|
||||||
import com.lincfusion.udyamlinc.master.DistrictRepository;
|
import com.lincfusion.udyamlinc.master.DistrictRepository;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.data.domain.PageRequest;
|
import org.springframework.data.domain.PageRequest;
|
||||||
@@ -31,6 +32,7 @@ public class IngestionController {
|
|||||||
private final ClimateSignalRepository climateSignalRepository;
|
private final ClimateSignalRepository climateSignalRepository;
|
||||||
private final ApiLogRepository apiLogRepository;
|
private final ApiLogRepository apiLogRepository;
|
||||||
private final DistrictRepository districtRepository;
|
private final DistrictRepository districtRepository;
|
||||||
|
private final CommodityRepository commodityRepository;
|
||||||
|
|
||||||
// ── what ran ────────────────────────────────────────────
|
// ── what ran ────────────────────────────────────────────
|
||||||
|
|
||||||
@@ -54,16 +56,66 @@ public class IngestionController {
|
|||||||
|
|
||||||
// ── what it wrote ───────────────────────────────────────
|
// ── 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")
|
@GetMapping("/signals/market")
|
||||||
public ApiResponse<List<MarketSignal>> marketSignals(@RequestParam(defaultValue = "12") int weeks) {
|
public ApiResponse<List<Map<String, Object>>> marketSignals(@RequestParam(defaultValue = "12") int weeks) {
|
||||||
return ApiResponse.ok(marketSignalRepository
|
Map<Long, String> districts = new java.util.HashMap<>();
|
||||||
.findByWeekStartGreaterThanEqualOrderByWeekStartDesc(Weeks.startOf(LocalDate.now()).minusWeeks(weeks)));
|
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")
|
@GetMapping("/signals/climate")
|
||||||
public ApiResponse<List<ClimateSignal>> climateSignals(@RequestParam(defaultValue = "12") int weeks) {
|
public ApiResponse<List<Map<String, Object>>> climateSignals(@RequestParam(defaultValue = "12") int weeks) {
|
||||||
return ApiResponse.ok(climateSignalRepository
|
Map<Long, String> districts = new java.util.HashMap<>();
|
||||||
.findByWeekStartGreaterThanEqualOrderByWeekStartDesc(Weeks.startOf(LocalDate.now()).minusWeeks(weeks)));
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user