Pular para o conteúdo principal

Implementação do Validator​

Os validadores são essenciais para nossa camada de serviço que ajudam a garantir a integridade dos dados antes de executar operações como salvar ou atualizar registros. Eles verificam se as entidades do domínio estão em um estado válido e conforme as regras de negócio definidas.

Exemplo de um Validador Básico​

Aqui está um exemplo de um validador básico para a entidade Topico. Este validador checa se os atributos da entidade estão corretos e se não violam nenhuma regra de negócio:

package com.webpublico.ead.application.validator.academico;

import br.com.archbase.ddd.domain.contracts.ValidationResult;
import com.webpublico.ead.application.exception.RegraNegocioException;
import com.webpublico.ead.application.validator.BaseValidator;
import com.webpublico.ead.domain.model.academico.Topico;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class TopicoValidator extends BaseValidator<Topico> {

@Override
public void validar(Topico topico) {
ValidationResult validationResult = topico.validate();

if (!validationResult.isValid()) {
throw new RegraNegocioException(validationResult.getErrors());
}
}

}

Validador com Regras de Negócio Específicas​

Para cenários que exigem validações específicas, como verificar a unicidade de um campo, podemos expandir nosso validador para incluir essas regras:

package com.webpublico.ead.application.validator.academico;

import br.com.archbase.ddd.domain.contracts.ValidationResult;
import com.webpublico.ead.application.exception.RegraNegocioException;
import com.webpublico.ead.application.validator.BaseValidator;
import com.webpublico.ead.domain.model.academico.Topico;
import com.webpublico.ead.domain.repository.academico.TopicoRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class TopicoValidator extends BaseValidator<Topico> {

private final TopicoRepository repository;

@Override
public void validar(Topico topico) {
ValidationResult validationResult = topico.validate();
if (!validationResult.isValid()) {
throw new RegraNegocioException(validationResult.getErrors());
}
verificarExistenciaTitulo(topico);
}

private void verificarExistenciaTitulo(Topico topico) {
String titulo = topico.getTitulo();
boolean tituloJaCadastrado = repository.buscarTopicoPorTitulo(titulo)
.filter(topicoExistente -> !topicoExistente.equals(topico))
.isPresent();
if (tituloJaCadastrado) {
throw new RegraNegocioException(String.format("Já existe um tópico cadastrado com o título '%s'", titulo));
}
}

}

Uso de Validadores em Services​

Os validadores são tipicamente invocados dentro dos métodos de services antes de realizar operações de persistência. Eles podem ser integrados em services que estendem BaseService ou em services personalizados. A herança de BaseService é opcional, mas oferece uma estrutura base que facilita a implementação de operações comuns e a integração com validadores.

Práticas Recomendadas​

  • Implemente validadores mesmo se o serviço não herda de BaseService. Isso assegura que todas as entradas sejam validadas conforme as regras de negócio antes de qualquer operação.

  • Customize validadores conforme necessário para atender às exigências específicas do domínio.

  • Utilize GetSecurityData para incluir dados de auditoria, garantindo que as operações sejam rastreadas corretamente.