import { Prisma, PrismaClient } from '@repo/database';
export type ID = string | number;
export abstract class BaseRepository<  TModel,  TDelegate extends {    findMany: (...args: any) => any;    findUnique: (...args: any) => any;    create: (...args: any) => any;    update: (...args: any) => any;    delete: (...args: any) => any;    findFirst: (...args: any) => any;    aggregate: (...args: any) => any;    count: (...args: any) => any;    groupBy: (...args: any) => any;    upsert: (...args: any) => any;    updateMany: (...args: any) => any;    deleteMany: (...args: any) => any;    aggregateRaw: (...args: any) => any;  },> {  protected prisma: PrismaClient;  protected delegate: TDelegate;
  constructor(prisma: PrismaClient, delegate: TDelegate) {    this.prisma = prisma;    this.delegate = delegate;  }
  async findAll(    args?: Parameters<TDelegate['findMany']>[0]  ): Promise<TModel[]> {    return this.delegate.findMany(args);  }
  async findById(id: ID): Promise<TModel | null> {    return this.delegate.findUnique({ where: { id } });  }
  async findFirst(    args: Parameters<TDelegate['findFirst']>[0]  ): Promise<TModel | null> {    return this.delegate.findFirst(args);  }
  async findUnique(    args: Parameters<TDelegate['findUnique']>[0]  ): Promise<TModel | null> {    return this.delegate.findUnique(args);  }
  async findMany(    args: Parameters<TDelegate['findMany']>[0]  ): Promise<TModel[]> {    return this.delegate.findMany(args);  }
  async create<TSelect extends Prisma.UserSelect>(    data: Prisma.UserCreateArgs['data'],    select?: TSelect  ): Promise<Prisma.UserGetPayload<{ select: TSelect }>> {    return (this.delegate as any).create({      data,      select,    });  }
  async update(    id: ID,    data: Parameters<TDelegate['update']>[0]['data']  ): Promise<TModel | null> {    return this.delegate.update({ where: { id }, data });  }
  async delete(id: ID): Promise<TModel | null> {    return this.delegate.delete({ where: { id } });  }
  async checkExist(    where: Parameters<TDelegate['findUnique']>[0]  ): Promise<boolean> {    const result = await this.delegate.findUnique(where);    return !!result;  }
  async aggregate(args: Parameters<TDelegate['aggregate']>[0]): Promise<any> {    return this.delegate.aggregate(args as any);  }
  async count(args?: Parameters<TDelegate['count']>[0]): Promise<number> {    return this.delegate.count(args as any);  }
  async upsert(    args: Parameters<TDelegate['upsert']>[0]  ): Promise<TModel | null> {    return this.delegate.upsert(args as any);  }
  // async groupBy(args: Parameters<TDelegate['groupBy']>[0]): Promise<any> {  //   return this.delegate.groupBy(args as any);  // }  
  async updateMany(    args: Parameters<TDelegate['updateMany']>[0]  ): Promise<TModel[]> {    return this.delegate.updateMany(args);  }
  async deleteMany(    args: Parameters<TDelegate['deleteMany']>[0]  ): Promise<TModel[]> {    return this.delegate.deleteMany(args);  }
  async aggregateRaw(    args: Parameters<TDelegate['aggregateRaw']>[0]  ): Promise<any> {    return this.delegate.aggregateRaw(args);  }}


import { Prisma } from '@repo/database';import { BaseRepository, ID } from '../repository/BaseRepository';
export abstract class BaseService<  TModel,  TRepository extends BaseRepository<TModel, any>,> {  protected repository: TRepository;
  constructor(repository: TRepository) {    this.repository = repository;  }
  async findAll(    options?: Parameters<TRepository['findAll']>[0]  ): Promise<TModel[]> {    return this.repository.findAll(options);  }
  async findById(id: ID): Promise<TModel | null> {    return this.repository.findById(id);  }
  async create<TSelect extends Prisma.UserSelect>(    data: Parameters<TRepository['create']>[0],    select?: TSelect  ): Promise<Prisma.UserGetPayload<{ select: TSelect }>> {    return this.repository.create(data, select);  }
  async update(    id: any,    data: Parameters<TRepository['update']>[1]  ): Promise<TModel | null> {    return this.repository.update(id, data);  }
  async delete(id: ID): Promise<TModel | null> {    return this.repository.delete(id);  }
  async checkExistById(id: ID): Promise<boolean> {    return this.repository.checkExist({ id });  }
  async checkExist(    where: Parameters<TRepository['checkExist']>[0]  ): Promise<boolean> {    return this.repository.checkExist(where);  }
  async aggregate(args: Parameters<TRepository['aggregate']>[0]): Promise<any> {    return this.repository.aggregate(args);  }
  async count(args: Parameters<TRepository['count']>[0]): Promise<number> {    return this.repository.count(args);  }
  async upsert(    args: Parameters<TRepository['upsert']>[0]  ): Promise<TModel | null> {    return this.repository.upsert(args);  }
  // async groupBy(args: Parameters<TRepository['groupBy']>[0]): Promise<any> {  //   return this.repository.groupBy(args);  // }

  async findFirst(    args: Parameters<TRepository['findFirst']>[0]  ): Promise<TModel | null> {    return this.repository.findFirst(args);  }
  async aggregateRaw(    args: Parameters<TRepository['aggregateRaw']>[0]  ): Promise<any> {    return this.repository.aggregateRaw(args);  }
  async findMany(    args: Parameters<TRepository['findMany']>[0]  ): Promise<TModel[]> {    return this.repository.findMany(args);  }  async deleteMany(    args: Parameters<TRepository['deleteMany']>[0]  ): Promise<TModel[]> {    return this.repository.deleteMany(args);  }  async updateMany(    args: Parameters<TRepository['updateMany']>[0]  ): Promise<TModel[]> {    return this.repository.updateMany(args);  }  async findUnique(    args: Parameters<TRepository['findUnique']>[0]  ): Promise<TModel | null> {    return this.repository.findUnique(args);  }} 



tsimport { BaseRepository } from '@repo/core';import { Prisma, PrismaClient, User } from '@repo/database';
export class UserRepository extends BaseRepository<User, Prisma.UserDelegate> {  constructor(prisma: PrismaClient) {    super(prisma, prisma.user);  }}

export class UserServiceExtend extends BaseService<User, UserRepository> {  constructor(userRepository: UserRepository) {    super(userRepository);  }
  async fetchUserByEmail(email: string) {    return this.repository.findUnique({ where: { email } });  }}