ApiErrorCode.java

package com.albertsilva.dev.asjcatalog.web.exception.enums;

import io.swagger.v3.oas.annotations.media.Schema;

/**
 * Códigos estáveis de erro devolvidos no campo {@code code} de
 * {@link com.albertsilva.dev.asjcatalog.web.exception.response.ProblemDetails}.
 * Não variam com o idioma; cada um é produzido por um único tipo de
 * exceção em {@code ControllerExceptionHandler} (exceto
 * {@link #RESOURCE_NOT_FOUND}, usado por duas).
 */
@Schema(name = "ApiErrorCode", description = "Código estável do erro retornado pela API. Este código nunca muda de acordo com o idioma. O frontend deve utilizar este campo para tomada de decisão, enquanto a mensagem apresentada ao usuário deve utilizar o campo message.")
public enum ApiErrorCode {

  /** {@code MethodArgumentNotValidException} (422). */
  @Schema(description = "Erro de validação dos dados enviados")
  VALIDATION_ERROR,

  /** {@code PasswordUpdateException} (422). */
  @Schema(description = "Erro ao atualizar a senha do usuário")
  PASSWORD_UPDATE_ERROR,

  /** {@code ResourceNotFoundException} e {@code NoResourceFoundException} (404). */
  @Schema(description = "Recurso não encontrado")
  RESOURCE_NOT_FOUND,

  /** {@code DatabaseException} (400). */
  @Schema(description = "Erro relacionado ao banco de dados")
  DATABASE_ERROR,

  /** {@code DataIntegrityViolationException} (409). */
  @Schema(description = "Conflito de dados")
  CONFLICT,

  /** {@code InvalidTokenException}: token de ativação ou recuperação (400). */
  @Schema(description = "Token inválido ou expirado")
  INVALID_TOKEN,

  /** {@code DisabledException} (403); provavelmente inalcançável hoje. */
  @Schema(description = "Conta desativada")
  ACCESS_DISABLED,

  /** {@code AccessDeniedException} de {@code @PreAuthorize} (403). */
  @Schema(description = "Usuário sem permissão")
  ACCESS_DENIED,

  /** {@code AuthenticatedUserNotFoundException} (401). */
  @Schema(description = "Usuário não autenticado")
  AUTHENTICATION_REQUIRED,

  /** Qualquer {@code Exception} sem handler específico (500). */
  @Schema(description = "Erro interno inesperado")
  INTERNAL_SERVER_ERROR
}