import { ObjectId } from 'mongodb'; import Macroable from '@poppinss/macroable'; import Hooks from '@poppinss/hooks'; import { MongoAdapter } from './adapter.js'; import { MongoQueryBuilder } from '../querybuilder/query_builder.js'; /** * ------------------------------------------------------ * Custom Lucid Types * ------------------------------------------------------ */ export interface ModelObject { [key: string]: any; } export interface LucidRow { $primaryKeyValue?: any; $isPersisted: boolean; $isNew: boolean; $isLocal: boolean; $isDeleted: boolean; $id: any; $dirty: ModelObject; $isDirty: boolean; $original: ModelObject; $attributes: ModelObject; $preloaded: { [relation: string]: any; }; $extras: ModelObject; $columns: any; $sideloaded: ModelObject; save(): Promise; delete(): Promise; refresh(): Promise; serialize(attributes?: any): ModelObject; fill(value: ModelObject): this; merge(value: ModelObject): this; $getAttributeFromCache(key: string, callback: (value: any) => any): any; useTransaction(trx: any): this; useConnection(connection: string): this; isDirty(keys?: any): boolean; toObject(): ModelObject; $hydrateOriginals(): void; enableForceUpdate(): this; lockForUpdate(): Promise; loadAggregate(relation: any, callback?: any): any; loadCount(relation: any, callback?: any): any; load(relation: any, callback?: any): Promise; preload(relation: any, callback?: any): Promise; loadOnce(relation: any, callback?: any): Promise; } /** * Shape of the model constructor */ export interface MongoModelConstructor { new (): MongoModel; $adapter: MongoAdapter; boot(): void; booted: boolean; primaryKey: string; collection: string; connection: string; tableName(): string; query(this: new () => T): MongoQueryBuilder; all(this: new () => T): Promise; find(this: new () => T, _id: string | ObjectId): Promise; findBy(this: new () => T, key: string, value: any): Promise; create(this: new () => T, data: Partial): Promise; createMany(this: new () => T, data: Partial[]): Promise; updateOrCreate(this: new () => T, search: Partial, data: Partial): Promise; firstOrCreate(this: new () => T, search: Partial, data?: Partial): Promise; firstOrNew(this: new () => T, search: Partial, data?: Partial): Promise; truncate(): Promise; beforeCreate?(model: MongoModel): void | Promise; afterCreate?(model: MongoModel): void | Promise; beforeUpdate?(model: MongoModel): void | Promise; afterUpdate?(model: MongoModel): void | Promise; beforeDelete?(model: MongoModel): void | Promise; afterDelete?(model: MongoModel): void | Promise; beforeFind?(query: MongoQueryBuilder): void | Promise; afterFind?(model: MongoModel): void | Promise; beforeSave?(model: MongoModel): void | Promise; afterSave?(model: MongoModel): void | Promise; } /** * Base model for MongoDB models */ export declare class MongoModel extends Macroable implements LucidRow { /** * Index signature */ [key: string]: any; /** * Static properties */ static $adapter: MongoAdapter; static booted: boolean; static primaryKey: string; static collection: string; static connection: string; static $hooks: Hooks>; /** * ------------------------------------------------------ * LucidRow State & Props * ------------------------------------------------------ */ $primaryKeyValue?: any; $isNew: boolean; $isLocal: boolean; $isPersisted: boolean; $isDeleted: boolean; $hydrated: boolean; $tenant: any; $trx: any; $options?: any; $original: ModelObject; $attributes: ModelObject; $preloaded: { [relation: string]: any; }; $cachedAttributes: ModelObject; $extras: ModelObject; $sideloaded: ModelObject; $columns: any; /** * ------------------------------------------------------ * Getters * ------------------------------------------------------ */ get $id(): any; get $dirty(): ModelObject; get $isDirty(): boolean; get $primaryKey(): string; private get $constructor(); get $collection(): string; get $connection(): string; constructor(); /** * ------------------------------------------------------ * Static Methods * ------------------------------------------------------ */ static boot(): void; static tableName(): string; static query(): MongoQueryBuilder; static all(): Promise; private static createModelFromResult; static find(_id: string | ObjectId): Promise; static findBy(key: string, value: any): Promise; static create(data: Partial): Promise; static createMany(data: Partial[]): Promise; static updateOrCreate(search: Partial, data: Partial): Promise; static firstOrCreate(search: Partial, data?: Partial): Promise; static firstOrNew(search: Partial, data?: Partial): Promise; static truncate(): Promise; /** * ------------------------------------------------------ * Instance Methods (Lucid Compatible) * ------------------------------------------------------ */ fill(attributes: Record): this; merge(attributes: Record): this; save(): Promise; delete(): Promise; refresh(): Promise; toObject(): ModelObject; serialize(_attributes?: any): ModelObject; toJSON(): ModelObject; /** * ------------------------------------------------------ * Compatibility Helpers (Stubs & Implementations) * ------------------------------------------------------ */ $hydrateOriginals(): void; enableForceUpdate(): this; lockForUpdate(): Promise; loadAggregate(_relation: any, _callback?: any): any; loadCount(_relation: any, _callback?: any): any; load(_relation: any, _callback?: any): Promise; preload(_relation: any, _callback?: any): Promise; loadOnce(_relation: any, _callback?: any): Promise; $setAttribute(key: string, value: any): void; $getAttribute(key: string): any; $getAttributeFromCache(key: string, callback: (value: any) => any): any; $hasAttribute(key: string): boolean; $removeAttribute(key: string): void; getAttribute(key: string): any; setAttribute(key: string, value: any): void; isDirty(keys?: any): boolean; useTransaction(trx: any): this; useConnection(_connection: string): this; $setOptionsAndTrx(options?: any): void; $getQueryFor(_action: 'insert' | 'update' | 'delete' | 'refresh'): any; related(_name: any): any; $getRelation(name: string): any; $getRelated(name: string): any; $setRelation(name: string, value: any): void; $setRelated(name: string, value: any): void; $pushRelation(name: string, value: any): void; $pushRelated(name: string, value: any): void; $hasRelation(name: string): boolean; $hasRelated(name: string): boolean; $consumeAdapterResult(adapterResult: any): void; $hydrate(row: any): void; $map(row: any): void; clone(): this; serializeAttributes(fields?: any, _strategy?: any): ModelObject; serializeComputed(_fields?: any): ModelObject; serializeRelations(_fields?: any, _strategy?: any): ModelObject; /** * Process data from DB and apply consume transformations */ processFromDatabase(data: Record): void; }