UNPKG

@decaf-ts/core

Version:

Core persistence module for the decaf framework

230 lines (229 loc) 10.9 kB
import { RepositoryFlags, Context } from "@decaf-ts/db-decorators"; import { CascadeMetadata } from "../repository/types"; import { OrderDirection } from "../repository/constants"; import { Constructor, Model } from "@decaf-ts/decorator-validation"; import { Repo } from "../repository/Repository"; import { RelationsMetadata } from "./types"; /** * @description Specifies the database table name for a model * @summary Decorator that sets the table name for a model class in the database * @param {string} tableName - The name of the table in the database * @return {Function} A decorator function that can be applied to a class * @function table * @category Class Decorators */ export declare function table(tableName: string): (target: object, propertyKey?: string | symbol | unknown, descriptor?: PropertyDescriptor) => void; /** * @description Specifies the database column name for a model property * @summary Decorator that maps a model property to a specific column name in the database * @param {string} columnName - The name of the column in the database * @return {Function} A decorator function that can be applied to a class property * @function column * @category Property Decorators */ export declare function column(columnName: string): (target: object, propertyKey?: string | symbol | unknown, descriptor?: PropertyDescriptor) => void; /** * @description Creates an index on a model property for improved query performance * @summary Decorator that marks a property to be indexed in the database, optionally with specific directions and compositions * @param {OrderDirection[]} [directions] - Optional array of sort directions for the index * @param {string[]} [compositions] - Optional array of property names to create a composite index * @return {Function} A decorator function that can be applied to a class property * @function index * @category Property Decorators */ export declare function index(directions?: OrderDirection[], compositions?: string[]): (target: object, propertyKey?: string | symbol | unknown, descriptor?: PropertyDescriptor) => void; /** * @description Enforces uniqueness constraint during model creation and update * @summary Internal function used by the unique decorator to check if a property value already exists in the database * @template M - The model type extending Model * @template R - The repository type extending Repo<M, F, C> * @template V - The metadata type * @template F - The repository flags type * @template C - The context type extending Context<F> * @param {R} this - The repository instance * @param {Context<F>} context - The context for the operation * @param {V} data - The metadata for the property * @param key - The property key to check for uniqueness * @param {M} model - The model instance being created or updated * @return {Promise<void>} A promise that resolves when the check is complete or rejects with a ConflictError * @function uniqueOnCreateUpdate * @memberOf module:core */ export declare function uniqueOnCreateUpdate<M extends Model, R extends Repo<M, F, C>, V extends object, F extends RepositoryFlags, C extends Context<F>>(this: R, context: Context<F>, data: V, key: keyof M, model: M): Promise<void>; /** * @description Tags a property as unique * @summary Decorator that ensures a property value is unique across all instances of a model in the database * @return {Function} A decorator function that can be applied to a class property * @function unique * @category Property Decorators * @example * ```typescript * class User extends BaseModel { * @unique() * @required() * username!: string; * } * ``` */ export declare function unique(): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any; /** * @description Handles user identification for ownership tracking * @summary Internal function used by the createdBy and updatedBy decorators to set ownership information * @template M - The model type extending Model * @template R - The repository type extending Repo<M, F, C> * @template V - The relations metadata type extending RelationsMetadata * @template F - The repository flags type * @template C - The context type extending Context<F> * @param {R} this - The repository instance * @param {Context<F>} context - The context for the operation * @param {V} data - The metadata for the property * @param key - The property key to store the user identifier * @param {M} model - The model instance being created or updated * @return {Promise<void>} A promise that rejects with an AuthorizationError if user identification is not supported * @function createdByOnCreateUpdate * @memberOf module:core */ export declare function createdByOnCreateUpdate<M extends Model, R extends Repo<M, F, C>, V extends RelationsMetadata, F extends RepositoryFlags, C extends Context<F>>(this: R, context: Context<F>, data: V, key: keyof M, model: M): Promise<void>; /** * @description Tracks the creator of a model instance * @summary Decorator that marks a property to store the identifier of the user who created the model instance * @return {Function} A decorator function that can be applied to a class property * @function createdBy * @category Property Decorators * @example * ```typescript * class Document extends BaseModel { * @createdBy() * creator!: string; * } * ``` */ export declare function createdBy(): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any; /** * @description Tracks the last updater of a model instance * @summary Decorator that marks a property to store the identifier of the user who last updated the model instance * @return {Function} A decorator function that can be applied to a class property * @function updatedBy * @category Property Decorators * @example * ```typescript * class Document extends BaseModel { * @updatedBy() * lastEditor!: string; * } * ``` */ export declare function updatedBy(): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any; /** * @description Defines a one-to-one relationship between models * @summary Decorator that establishes a one-to-one relationship between the current model and another model * @template M - The related model type extending Model * @param {Constructor<M>} clazz - The constructor of the related model class * @param {CascadeMetadata} [cascadeOptions=DefaultCascade] - Options for cascading operations (create, update, delete) * @param {boolean} [populate=true] - If true, automatically populates the relationship when the model is retrieved * @return {Function} A decorator function that can be applied to a class property * @function oneToOne * @category Property Decorators * @example * ```typescript * class User extends BaseModel { * @oneToOne(Profile) * profile!: string | Profile; * } * * class Profile extends BaseModel { * @required() * bio!: string; * } * ``` * @see oneToMany * @see manyToOne */ export declare function oneToOne<M extends Model>(clazz: Constructor<M>, cascadeOptions?: CascadeMetadata, populate?: boolean): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any; /** * @description Defines a one-to-many relationship between models * @summary Decorator that establishes a one-to-many relationship between the current model and multiple instances of another model * @template M - The related model type extending Model * @param {Constructor<M>} clazz - The constructor of the related model class * @param {CascadeMetadata} [cascadeOptions=DefaultCascade] - Options for cascading operations (create, update, delete) * @param {boolean} [populate=true] - If true, automatically populates the relationship when the model is retrieved * @return {Function} A decorator function that can be applied to a class property * @function oneToMany * @category Property Decorators * @example * ```typescript * class Author extends BaseModel { * @required() * name!: string; * * @oneToMany(Book) * books!: string[] | Book[]; * } * * class Book extends BaseModel { * @required() * title!: string; * } * ``` * @see oneToOne * @see manyToOne */ export declare function oneToMany<M extends Model>(clazz: Constructor<M>, cascadeOptions?: CascadeMetadata, populate?: boolean): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any; /** * @description Defines a many-to-one relationship between models * @summary Decorator that establishes a many-to-one relationship between multiple instances of the current model and another model * @template M - The related model type extending Model * @param {Constructor<M>} clazz - The constructor of the related model class * @param {CascadeMetadata} [cascadeOptions=DefaultCascade] - Options for cascading operations (create, update, delete) * @param {boolean} [populate=true] - If true, automatically populates the relationship when the model is retrieved * @return {Function} A decorator function that can be applied to a class property * @function manyToOne * @category Property Decorators * @example * ```typescript * class Book extends BaseModel { * @required() * title!: string; * * @manyToOne(Author) * author!: string | Author; * } * * class Author extends BaseModel { * @required() * name!: string; * } * ``` * @see oneToMany * @see oneToOne */ export declare function manyToOne<M extends Model>(clazz: Constructor<M>, cascadeOptions?: CascadeMetadata, populate?: boolean): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any; /** * @description Defines a many-to-one relationship between models * @summary Decorator that establishes a many-to-one relationship between multiple instances of the current model and another model * @template M - The related model type extending Model * @param {Constructor<M>} clazz - The constructor of the related model class * @param {CascadeMetadata} [cascadeOptions=DefaultCascade] - Options for cascading operations (create, update, delete) * @param {boolean} [populate=true] - If true, automatically populates the relationship when the model is retrieved * @return {Function} A decorator function that can be applied to a class property * @function manyToOne * @category Property Decorators * @example * ```typescript * class Book extends BaseModel { * @required() * title!: string; * * @manyToOne(Author) * author!: string | Author; * } * * class Author extends BaseModel { * @required() * name!: string; * } * ``` * @see oneToMany * @see oneToOne */ export declare function manyToMany<M extends Model>(clazz: Constructor<M>, cascadeOptions?: CascadeMetadata, populate?: boolean): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any;