PriceTargetController.java

package com.distasilucas.cryptobalancetracker.controller;

import com.distasilucas.cryptobalancetracker.controller.swagger.PriceTargetControllerAPI;
import com.distasilucas.cryptobalancetracker.entity.PriceTarget;
import com.distasilucas.cryptobalancetracker.model.request.pricetarget.PriceTargetRequest;
import com.distasilucas.cryptobalancetracker.model.response.pricetarget.PagePriceTargetResponse;
import com.distasilucas.cryptobalancetracker.model.response.pricetarget.PriceTargetResponse;
import com.distasilucas.cryptobalancetracker.service.PriceTargetService;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import lombok.RequiredArgsConstructor;
import org.hibernate.validator.constraints.UUID;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import static com.distasilucas.cryptobalancetracker.constants.Constants.PRICE_TARGET_ENDPOINT;
import static com.distasilucas.cryptobalancetracker.constants.ValidationConstants.INVALID_PAGE_NUMBER;
import static com.distasilucas.cryptobalancetracker.constants.ValidationConstants.INVALID_PRICE_TARGET_UUID;

@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping(PRICE_TARGET_ENDPOINT)
@CrossOrigin(origins = "${allowed-origins}")
public class PriceTargetController implements PriceTargetControllerAPI {

    private final PriceTargetService priceTargetService;

    @Override
    @GetMapping("/{priceTargetId}")
    public ResponseEntity<PriceTargetResponse> retrievePriceTarget(
        @PathVariable @UUID(message = INVALID_PRICE_TARGET_UUID) String priceTargetId
    ) {
        var priceTarget = priceTargetService.retrievePriceTargetById(priceTargetId);

        return ResponseEntity.ok(priceTarget.toPriceTargetResponse());
    }

    @Override
    @GetMapping
    public ResponseEntity<PagePriceTargetResponse> retrievePriceTargetsByPage(
        @RequestParam @Min(value = 0, message = INVALID_PAGE_NUMBER) int page
    ) {
        var priceTargets = priceTargetService.retrievePriceTargetsByPage(page);

        if (priceTargets.isEmpty()) {
            return ResponseEntity.noContent().build();
        } else {
            var priceTargetResponses = priceTargets.getContent()
                .stream()
                .map(PriceTarget::toPriceTargetResponse)
                .toList();
            var pagePriceTargetResponse = new PagePriceTargetResponse(page, priceTargets.getTotalPages(), priceTargetResponses);

            return ResponseEntity.ok(pagePriceTargetResponse);
        }
    }

    @Override
    @PostMapping
    public ResponseEntity<PriceTargetResponse> savePriceTarget(
        @Valid @RequestBody PriceTargetRequest priceTargetRequest
    ) {
        var priceTarget = priceTargetService.savePriceTarget(priceTargetRequest);

        return ResponseEntity.status(HttpStatus.CREATED).body(priceTarget.toPriceTargetResponse());
    }

    @Override
    @PutMapping("/{priceTargetId}")
    public ResponseEntity<PriceTargetResponse> updatePriceTarget(
        @PathVariable @UUID(message = INVALID_PRICE_TARGET_UUID) String priceTargetId,
        @Valid @RequestBody PriceTargetRequest priceTargetRequest
    ) {
        var priceTarget = priceTargetService.updatePriceTarget(priceTargetId, priceTargetRequest);

        return ResponseEntity.ok(priceTarget.toPriceTargetResponse());
    }

    @Override
    @DeleteMapping("/{priceTargetId}")
    public ResponseEntity<Void> deletePriceTarget(
        @PathVariable @UUID(message = INVALID_PRICE_TARGET_UUID) String priceTargetId
    ) {
        priceTargetService.deletePriceTarget(priceTargetId);

        return ResponseEntity.noContent().build();
    }
}