PricingTypeQueryController.java

package com.github.jenkaby.bikerental.tariff.web.query;

import com.github.jenkaby.bikerental.shared.config.OpenApiConfig;
import com.github.jenkaby.bikerental.tariff.application.usecase.GetPricingTypesUseCase;
import com.github.jenkaby.bikerental.tariff.web.query.dto.PricingTypeResponse;
import com.github.jenkaby.bikerental.tariff.web.query.mapper.TariffV2QueryMapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@Validated
@Slf4j
@RestController
@RequestMapping("/api/v2/tariffs")
@Tag(name = OpenApiConfig.Tags.TARIFFS, description = "Tariff V2 API")
public class PricingTypeQueryController {

    private final GetPricingTypesUseCase getPricingTypesUseCase;
    private final TariffV2QueryMapper mapper;

    PricingTypeQueryController(GetPricingTypesUseCase getPricingTypesUseCase,
                               TariffV2QueryMapper mapper) {
        this.getPricingTypesUseCase = getPricingTypesUseCase;
        this.mapper = mapper;
    }

    @GetMapping("/pricing-types")
    @Operation(summary = "Get all pricing types with localized title and description")
    @ApiResponses(@ApiResponse(responseCode = "200", description = "Pricing types list"))
    public ResponseEntity<List<PricingTypeResponse>> getPricingTypes() {
        log.info("[GET] Get pricing types");
        var list = getPricingTypesUseCase.execute().stream()
                .map(mapper::toResponse)
                .toList();
        return ResponseEntity.ok(list);
    }
}