Skip to main content

Implementação dos Services

A camada de service é crucial na arquitetura de uma aplicação, pois ela media as interações entre a camada de apresentação (controladores) e a camada de domínio (repositórios). Além disso, encapsula a lógica de negócios e as regras associadas, garantindo a correta execução das operações e manutenção da integridade dos dados.

Serviço Básico

Aqui está um exemplo de um serviço básico que utiliza um repositório genérico para operações CRUD. Esta implementação básica é suficiente para muitos casos de uso sem regras complexas:

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

import br.com.archbase.security.usecase.GetSecurityData;
import com.webpublico.ead.application.service.BaseService;
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.Service;

@Service
@RequiredArgsConstructor
public class TopicoService extends BaseService<Topico> {

private final TopicoRepository repository;
private final TopicoValidator validator;
private final GetSecurityData securityData;

@Override
protected BaseRepository<Topico> getRepository() {
return repository;
}

@Override
protected BaseValidator<Topico> getValidator() {
return validator;
}

@Override
protected GetSecurityData getSecurityData() {
return securityData;
}

}

Service com Regras Específicas

Para cenários que exigem regras específicas ou gestão de relacionamentos complexos, o service pode incluir lógicas adicionais. Isso permite personalizar o comportamento padrão para atender necessidades específicas do domínio ou da aplicação:

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

import br.com.archbase.security.usecase.GetSecurityData;
import com.webpublico.ead.application.exception.ErroGenericoException;
import com.webpublico.ead.application.service.BaseService;
import com.webpublico.ead.application.validator.BaseValidator;
import com.webpublico.ead.application.validator.academico.TopicoValidator;
import com.webpublico.ead.domain.model.academico.Topico;
import com.webpublico.ead.domain.repository.academico.TopicoRepository;
import com.webpublico.ead.infrastructure.adapter.persistence.exception.PersistenceException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class TopicoService extends BaseService<Topico> {

public static final String ERRO_PERSISTENCIA = "Erro ao salvar o tópico devido a problemas de persistência.";

private final TopicoRepository repository;
private final TopicoValidator validator;
private final GetSecurityData securityData;

@Override
public Topico salvar(Topico topico) {
try {
associarTopicoSuperior(topico);
return super.salvar(topico);
} catch (PersistenceException e) {
throw new ErroGenericoException(ERRO_PERSISTENCIA, e);
}
}

private void associarTopicoSuperior(Topico topico) {
String superiorId = topico.getNivelAnteriorTopicoId();
if (superiorId != null) {
topico.setNivelAnteriorTopicoId(superiorId);
}
}

@Override
protected BaseRepository<Topico> getRepository() {
return repository;
}

@Override
protected BaseValidator<Topico> getValidator() {
return validator;
}

@Override
protected GetSecurityData getSecurityData() {
return securityData;
}

}

Notas sobre a Implementação

  • Validator: Se o service herda de BaseService, é necessário implementar um BaseValidator para garantir que as entradas sejam validadas antes de executar operações de persistência. Mesmo para serviços que não utilizam a herança de BaseService, é recomendado implementar validadores para manter a integridade dos dados.

  • GetSecurityData: É crucial para garantir a rastreabilidade das operações, registrando quem criou ou modificou os registros. Sua utilização é obrigatória, independente da herança de BaseService, para assegurar a auditoria das ações realizadas.