import { Repository, EntityManager, Equal, FindOptionsWhere, ObjectLiteral } from 'typeorm'; import { PaginateConfig, PaginateQuery, Paginated, paginate } from 'nestjs-paginate'; import { IBaseRepository } from '@/core/domain/interfaces/base.repository.interface'; /** * Represents a generic repository for managing entities. */ export class BaseRepository extends Repository implements IBaseRepository { protected paginateConfig: PaginateConfig; constructor(manager: EntityManager, entityCls: new () => E, paginateConfig?: PaginateConfig) { super(entityCls, manager); this.paginateConfig = paginateConfig || { sortableColumns: [], }; } /** * Retrieves a paginated list of entities based on the provided query. * * @param query - The pagination query parameters. * @returns A promise that resolves to a paginated list of entities. */ async getMany(query: PaginateQuery): Promise> { if (query.select) { if (typeof query.select === 'string') { const selectArray = (query.select as string).split(','); if (!selectArray.includes('id')) { selectArray.unshift('id'); query.select = selectArray; } // query.select = selectArray.join(','); } else if (Array.isArray(query.select)) { if (!query.select.includes('id')) { query.select.unshift('id'); } } } return paginate(query, this, this.paginateConfig); } /** * Retrieves an entity from the database based on its ID. * * @param id - The ID of the entity to retrieve. * @returns A promise that resolves to the retrieved entity. */ async findById(id: number): Promise { return await this.findOneBy({ id: Equal(id), } as unknown as FindOptionsWhere); } }