PatternDetectionApiController.java

package com.taxonomy.architecture.controller;

import com.taxonomy.dto.PatternDetectionView;
import com.taxonomy.architecture.service.ArchitecturePatternService;
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.Map;

/**
 * REST API for Architecture Pattern Detection.
 *
 * <p>Endpoints:
 * <ul>
 *   <li>{@code GET  /api/patterns/detect?nodeCode=...} — Detect patterns for a single node</li>
 *   <li>{@code POST /api/patterns/detect} — Detect patterns across scored nodes</li>
 * </ul>
 */
@RestController
@RequestMapping("/api/patterns")
@Tag(name = "Pattern Detection")
public class PatternDetectionApiController {

    private final ArchitecturePatternService patternService;

    public PatternDetectionApiController(ArchitecturePatternService patternService) {
        this.patternService = patternService;
    }

    /**
     * Request body for pattern detection on scored nodes.
     */
    public record PatternDetectionRequest(
            Map<String, Integer> scores,
            int minScore) {
    }

    /**
     * Detects architecture patterns starting from a specific node.
     */
    @Operation(summary = "Detect patterns for node",
               description = "Checks which standard architecture patterns are present starting from the given node")
    @GetMapping("/detect")
    public ResponseEntity<PatternDetectionView> detectForNode(
            @Parameter(description = "Taxonomy node code") @RequestParam String nodeCode) {
        PatternDetectionView view = patternService.detectForNode(nodeCode);
        return ResponseEntity.ok(view);
    }

    /**
     * Detects architecture patterns across all scored nodes.
     */
    @Operation(summary = "Detect patterns for scores",
               description = "Detects architecture patterns across all nodes above the score threshold")
    @PostMapping("/detect")
    public ResponseEntity<PatternDetectionView> detectForScores(@RequestBody PatternDetectionRequest request) {
        PatternDetectionView view = patternService.detectForScores(
                request.scores() != null ? request.scores() : Map.of(),
                request.minScore());
        return ResponseEntity.ok(view);
    }
}