/* eslint-disable no-continue */
/* eslint-disable no-restricted-syntax */
import {
  DeepPartial,
  EntityTarget,
  ObjectLiteral,
  Repository,
} from 'typeorm';
import { getPGConnection } from './postgres';

export abstract class BaseDBRepository<Entity extends ObjectLiteral, Model> {
  protected abstract entityClass: EntityTarget<Entity>;

  // eslint-disable-next-line no-unused-vars
  protected abstract toModel(entity: Entity): Model;

  // eslint-disable-next-line no-unused-vars
  protected abstract fromModel(model: Partial<Model>): DeepPartial<Entity>;

  protected get db(): Repository<Entity> {
    const dataSource = getPGConnection();
    return dataSource.getRepository<Entity>(this.entityClass);
  }

  async save(data: Partial<Model>): Promise<Model> {
    const entity = this.fromModel(data);

    const result = await this.db.save(entity);

    return this.toModel(result);
  }
}
