PlatformController.java

package com.distasilucas.cryptobalancetracker.controller;

import com.distasilucas.cryptobalancetracker.controller.swagger.PlatformControllerAPI;
import com.distasilucas.cryptobalancetracker.entity.Platform;
import com.distasilucas.cryptobalancetracker.model.request.platform.PlatformRequest;
import com.distasilucas.cryptobalancetracker.model.response.platform.PlatformResponse;
import com.distasilucas.cryptobalancetracker.service.PlatformService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.hibernate.validator.constraints.UUID;
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.RestController;

import java.util.List;

import static com.distasilucas.cryptobalancetracker.constants.Constants.PLATFORMS_ENDPOINT;
import static com.distasilucas.cryptobalancetracker.constants.ValidationConstants.PLATFORM_ID_UUID;

@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping(PLATFORMS_ENDPOINT)
@CrossOrigin(origins = "${allowed-origins}")
public class PlatformController implements PlatformControllerAPI {

    private final PlatformService platformService;

    @Override
    @GetMapping
    public ResponseEntity<List<PlatformResponse>> retrieveAllPlatforms() {
        var platforms = platformService.retrieveAllPlatforms()
            .stream()
            .map(Platform::toPlatformResponse)
            .toList();

        return platforms.isEmpty() ? ResponseEntity.noContent().build() : ResponseEntity.ok(platforms);
    }

    @Override
    @GetMapping("/{platformId}")
    public ResponseEntity<PlatformResponse> retrievePlatformById(
        @UUID(message = PLATFORM_ID_UUID)
        @PathVariable String platformId
    ) {
        var platform = platformService.retrievePlatformById(platformId);
        var platformResponse = platform.toPlatformResponse();

        return ResponseEntity.ok(platformResponse);
    }

    @Override
    @PostMapping
    public ResponseEntity<PlatformResponse> savePlatform(@Valid @RequestBody PlatformRequest platformRequest) {
        var platform = platformService.savePlatform(platformRequest);
        var platformResponse = platform.toPlatformResponse();

        return ResponseEntity.ok(platformResponse);
    }

    @Override
    @PutMapping("/{platformId}")
    public ResponseEntity<PlatformResponse> updatePlatform(
        @UUID(message = PLATFORM_ID_UUID) @PathVariable String platformId,
        @Valid @RequestBody PlatformRequest platformRequest
    ) {
        var platform = platformService.updatePlatform(platformId, platformRequest);
        var platformResponse = platform.toPlatformResponse();

        return ResponseEntity.ok(platformResponse);
    }

    @Override
    @DeleteMapping("/{platformId}")
    public ResponseEntity<Void> deletePlatform(@UUID(message = PLATFORM_ID_UUID) @PathVariable String platformId) {
        platformService.deletePlatform(platformId);

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