import { Model, FilterQuery, UpdateQuery, Types, Document, QueryOptions, UpdateResult, DeleteResult, ClientSession } from 'mongoose'; import { UpdateOptions } from 'mongodb'; export interface WithId { _id: Types.ObjectId; id?: string; } export interface SoftDeletable { deleted?: boolean; deletedAt?: Date; } export interface RepositoryOptions { useSoftDelete?: boolean; } export interface PaginationOptions { page: number; pageSize: number; sort?: Record; } export interface PaginationResult { items: T[]; total: number; page: number; pageSize: number; totalPages: number; hasNext: boolean; hasPrev: boolean; } export interface SearchOptions { fields: string[]; query: string; caseSensitive?: boolean; } export type SoftDeleteResult = { type: 'soft'; result: UpdateResult | null; }; export type HardDeleteResult = { type: 'hard'; result: DeleteResult | null; }; export declare function toObjectId(id: string | Types.ObjectId): Types.ObjectId; export declare function validateObjectId(id: string): boolean; export declare class BaseRepository> { protected readonly model: Model; protected options: RepositoryOptions; constructor(model: Model, options?: RepositoryOptions); protected buildFilter(filter?: FilterQuery): FilterQuery; protected validateId(id: string | Types.ObjectId): void; toObjectId(id: string | Types.ObjectId): Types.ObjectId; findById(id: string | Types.ObjectId, projection?: any, options?: QueryOptions): Promise; findByIds(ids: string[] | Types.ObjectId[], projection?: any, options?: QueryOptions): Promise; find(filter?: FilterQuery, projection?: any, options?: QueryOptions): Promise; findOne(filter?: FilterQuery, projection?: any, options?: QueryOptions): Promise; findQuery(filter?: FilterQuery, projection?: any, options?: QueryOptions): Promise; search(searchOptions: SearchOptions, filter?: FilterQuery, projection?: any, options?: QueryOptions): Promise; findWithSort(filter?: FilterQuery, sort?: Record, projection?: any, options?: QueryOptions): Promise; count(filter?: FilterQuery): Promise; exists(filter?: FilterQuery): Promise; create(doc: Partial, session?: ClientSession): Promise; createMany(docs: Partial[], session?: ClientSession): Promise; updateById(id: string | Types.ObjectId, update: UpdateQuery, options?: UpdateOptions & QueryOptions): Promise; updateOne(filter: FilterQuery, update: UpdateQuery, options?: UpdateOptions & QueryOptions): Promise; updateMany(filter: FilterQuery, update: UpdateQuery, options?: UpdateOptions & QueryOptions): Promise; updateManyByIds(ids: string[] | Types.ObjectId[], update: UpdateQuery, options?: UpdateOptions & QueryOptions): Promise; removeById(id: string | Types.ObjectId): Promise; removeMany(filter: FilterQuery): Promise; paginate(filter: FilterQuery | undefined, paginationOptions: PaginationOptions, projection?: any, options?: QueryOptions): Promise>; aggregate(pipeline: any[], session?: ClientSession): Promise; groupBy(groupField: string, filter?: FilterQuery, countField?: string): Promise; distinct(field: string, filter?: FilterQuery): Promise; bulkWrite(ops: any[], session?: ClientSession): Promise; findNear(coordinates: [number, number], maxDistance?: number, filter?: FilterQuery): Promise; findOneAndUpdate(filter: FilterQuery, update: UpdateQuery, options?: QueryOptions): Promise; upsert(filter: FilterQuery, update: UpdateQuery, docIfNew?: Partial): Promise; findOrCreate(filter: FilterQuery, docIfNew?: Partial): Promise; incrementById(id: string | Types.ObjectId, field: string, value?: number): Promise; decrementById(id: string | Types.ObjectId, field: string, value?: number): Promise; incrementMany(filter: FilterQuery, field: string, value?: number): Promise; findRandom(filter?: FilterQuery, limit?: number): Promise; findAll(filter?: FilterQuery, projection?: any, options?: QueryOptions): Promise; softDeleteById(id: string | Types.ObjectId): Promise; softDeleteMany(filter: FilterQuery): Promise; restoreById(id: string | Types.ObjectId): Promise; restoreMany(filter: FilterQuery): Promise; findDeleted(filter?: FilterQuery, projection?: any, options?: QueryOptions): Promise; hardDeleteById(id: string | Types.ObjectId): Promise; hardDeleteMany(filter: FilterQuery): Promise; getStats(filter?: FilterQuery): Promise<{ total: number; active: number; deleted: number; }>; findDuplicates(field: string): Promise; }