Repositório

Enquanto a entidade mapeia uma classe para uma tabela do banco de dados, o repositório é responsável por encapsular toda a lógica de acesso e manipulação de dados dessa entidade. Ele atua como uma camada intermediária entre o banco e a aplicação, oferecendo métodos padronizados para criar, ler, atualizar e deletar registros (CRUD).

Para cada entidade, criamos um repositório específico, com operações básicas, como no exemplo abaixo para a entidade Musica:

import { Repository } from 'typeorm';
import { Musica } from "../entity/Musica";
import { banco } from "../banco";

export class MusicaRepository {
  private repositorio: Repository<Musica>;

  constructor(){
    this.repositorio = banco.getRepository(Musica);
  }

  async criar(musica: Musica): Promise<Musica> {
    return await this.repositorio.save(musica);
  }

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

  async buscarPorId(id: number): Promise<Musica | null> {
    return await this.repositorio.findOneBy({ _id: id } as any);
  }

  async remover(id: number): Promise<void> {
    await this.repositorio.delete(id);
  }
}

Note que estamos a classe Repository do TypeORM, que já fornece métodos prontos para as operações básicas. Essa classe possui um tipo genérico que, no caso, atribuímos a Musica. Por isso, Repository<Musica>.

Ao manter a lógica de acesso ao banco centralizada no repositório, garantimos manutenção mais fácil, menor duplicação de código e separação clara de responsabilidades entre camadas da aplicação.

Cada entidade deve ter seu próprio repositório, mas é possível criar métodos personalizados para consultas específicas.