package dev.mvvasilev.common.controller; import dev.mvvasilev.common.web.APIErrorDTO; import dev.mvvasilev.common.web.APIResponseDTO; import dev.mvvasilev.common.web.CrudResponseDTO; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; public abstract class AbstractRestController { protected ResponseEntity> withStatus(HttpStatus status, T body) { return ResponseEntity.status(status).body(new APIResponseDTO<>(body, null, status.value(), status.getReasonPhrase())); } protected ResponseEntity> withSingleError(HttpStatus status, String errorMessage, String errorCode, String stacktrace) { return ResponseEntity.status(status).body(new APIResponseDTO<>(null, List.of(new APIErrorDTO(errorMessage, errorCode, stacktrace)), status.value(), status.getReasonPhrase())); } protected ResponseEntity> ok(T body) { return withStatus(HttpStatus.OK, body); } protected ResponseEntity> emptySuccess() { return withStatus(HttpStatus.OK, null); } protected ResponseEntity> created(Long id) { return withStatus(HttpStatus.CREATED, new CrudResponseDTO(id, null)); } protected ResponseEntity>> created(Collection ids) { return withStatus( HttpStatus.CREATED, ids.stream() .map(id -> new CrudResponseDTO(id, null)) .collect(Collectors.toList()) ); } protected ResponseEntity> updated(Integer affectedRows) { return withStatus(HttpStatus.OK, new CrudResponseDTO(null, affectedRows)); } protected ResponseEntity> deleted(Integer affectedRows) { return withStatus(HttpStatus.OK, new CrudResponseDTO(null, affectedRows)); } }