QualityApiController.java
package com.taxonomy.relations.controller;
import com.taxonomy.dto.ProvenanceMetrics;
import com.taxonomy.dto.RelationQualityMetrics;
import com.taxonomy.dto.RelationTypeMetrics;
import com.taxonomy.dto.TopRejectedProposal;
import com.taxonomy.relations.service.RelationQualityService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* REST API for the Relation Quality Dashboard.
*
* <p>Endpoints:
* <ul>
* <li>{@code GET /api/relations/metrics} — full quality dashboard</li>
* <li>{@code GET /api/relations/metrics/by-type} — metrics by relation type</li>
* <li>{@code GET /api/relations/metrics/by-provenance} — metrics by provenance</li>
* <li>{@code GET /api/relations/metrics/top-rejected} — top rejected proposals</li>
* </ul>
*/
@RestController
@RequestMapping("/api/relations/metrics")
@Tag(name = "Quality Metrics")
public class QualityApiController {
private final RelationQualityService qualityService;
public QualityApiController(RelationQualityService qualityService) {
this.qualityService = qualityService;
}
/**
* Returns the full quality dashboard metrics.
*/
@Operation(summary = "Quality dashboard", description = "Returns the full quality dashboard metrics")
@GetMapping
public ResponseEntity<RelationQualityMetrics> getMetrics() {
return ResponseEntity.ok(qualityService.calculateMetrics());
}
/**
* Returns metrics broken down by relation type.
*/
@Operation(summary = "Metrics by relation type", description = "Returns quality metrics broken down by relation type")
@GetMapping("/by-type")
public ResponseEntity<List<RelationTypeMetrics>> getMetricsByType() {
return ResponseEntity.ok(qualityService.metricsByRelationType());
}
/**
* Returns metrics broken down by provenance.
*/
@Operation(summary = "Metrics by provenance", description = "Returns quality metrics broken down by provenance")
@GetMapping("/by-provenance")
public ResponseEntity<List<ProvenanceMetrics>> getMetricsByProvenance() {
return ResponseEntity.ok(qualityService.metricsByProvenance());
}
/**
* Returns top rejected proposals ordered by confidence descending.
*/
@Operation(summary = "Top rejected proposals", description = "Returns top rejected proposals ordered by confidence descending")
@GetMapping("/top-rejected")
public ResponseEntity<List<TopRejectedProposal>> getTopRejected(
@Parameter(description = "Maximum number of results") @RequestParam(defaultValue = "10") int limit) {
return ResponseEntity.ok(qualityService.topRejected(limit));
}
}