Service

A camada de serviço (Service) é responsável por concentrar as regras de negócio da aplicação. Ela atua como uma ponte entre a interface da aplicação (como controllers ou APIs) e os repositórios, garantindo que todas as operações sigam as regras definidas antes de acessar o banco de dados.

Em outras palavras, enquanto o repositório se preocupa com o como os dados são manipulados, o service define o que deve ser feito e como deve ser validado.

Exemplo de implementação para a entidade Musica:

import { Musica } from "../entity/Musica";
import { MusicaRepository } from "../repository/MusicaRepository";

export class MusicaService {
  private repository: MusicaRepository;

  constructor() {
    this.repository = new MusicaRepository();
  }

  async cadastrar(nome: string, duracao: number): Promise<Musica> {
    const musica = new Musica(nome, duracao);
    return await this.repository.criar(musica);
  }

  async listarTodos(): Promise<Musica[]> {
    return await this.repository.listar();
  }

  async buscar(id: number): Promise<Musica | null> {
    return await this.repository.buscarPorId(id);
  }
  
  async excluir(id: number): Promise<void> {
    return await this.repository.remover(id);
  }
}

O service concentra validações, transformações de dados e regras de negócio antes de delegar operações ao repositório. Ele oferece uma interface consistente para a aplicação, sem expor diretamente os detalhes do banco de dados.

Manter a lógica de negócio separada do repositório facilita manutenção, testes unitários e futuras alterações na aplicação. É comum que serviços invoquem múltiplos repositórios quando uma operação envolve várias entidades, sem quebrar a lógica de cada uma.