DomainTemplateConflictHandler.java

package fr.tiogars.inception.domains.domaintemplate.controllers;

import org.hibernate.exception.ConstraintViolationException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.OptimisticLockingFailureException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/** Reports active-code and concurrent-write conflicts without hiding other database errors. */
@RestControllerAdvice(basePackageClasses = DomainTemplateCreateController.class)
public class DomainTemplateConflictHandler {

    @ExceptionHandler(OptimisticLockingFailureException.class)
    public ResponseEntity<Void> concurrentWrite(OptimisticLockingFailureException exception) {
        return ResponseEntity.status(HttpStatus.CONFLICT).build();
    }

    @ExceptionHandler(DataIntegrityViolationException.class)
    public ResponseEntity<Void> duplicateActiveCode(DataIntegrityViolationException exception) {
        for (Throwable cause = exception; cause != null; cause = cause.getCause()) {
            if (cause instanceof ConstraintViolationException constraint
                    && "uk_domain_templates_active_code".equals(constraint.getConstraintName())) {
                return ResponseEntity.status(HttpStatus.CONFLICT).build();
            }
        }
        throw exception;
    }
}