UNPKG

sequelize

Version:

Multi dialect ORM for Node.JS

469 lines (440 loc) 13.8 kB
import { BulkCreateOptions, CreateOptions, Filterable, FindOptions, InstanceDestroyOptions, InstanceUpdateOptions, Model, ModelCtor, Transactionable, WhereOptions, } from '../model'; import { Promise } from '../promise'; import { Transaction } from '../transaction'; import { Association, AssociationScope, ForeignKeyOptions, ManyToManyOptions, MultiAssociationAccessors } from './base'; /** * Used for a association table in n:m associations. */ export interface ThroughOptions { /** * The model used to join both sides of the N:M association. */ model: typeof Model; /** * A key/value set that will be used for association create and find defaults on the through model. * (Remember to add the attributes to the through model) */ scope?: AssociationScope; /** * If true a unique key will be generated from the foreign keys used (might want to turn this off and create * specific unique keys when using scopes) * * @default true */ unique?: boolean; } /** * Attributes for the join table */ export interface JoinTableAttributes { [attribute: string]: unknown; } /** * Options provided when associating models with belongsToMany relationship */ export interface BelongsToManyOptions extends ManyToManyOptions { /** * The name of the table that is used to join source and target in n:m associations. Can also be a * sequelize model if you want to define the junction table yourself and add extra attributes to it. */ through: typeof Model | string | ThroughOptions; /** * The name of the foreign key in the join table (representing the target model) or an object representing * the type definition for the other column (see `Sequelize.define` for syntax). When using an object, you * can add a `name` property to set the name of the colum. Defaults to the name of target + primary key of * target */ otherKey?: string | ForeignKeyOptions; /** * Should the join model have timestamps */ timestamps?: boolean; /** * The unique key name to override the autogenerated one when primary key is not present on through model */ uniqueKey?: string; } export class BelongsToMany<S extends Model = Model, T extends Model = Model> extends Association<S, T> { public otherKey: string; public accessors: MultiAssociationAccessors; constructor(source: ModelCtor<S>, target: ModelCtor<T>, options: BelongsToManyOptions); } /** * The options for the getAssociations mixin of the belongsToMany association. * @see BelongsToManyGetAssociationsMixin */ export interface BelongsToManyGetAssociationsMixinOptions extends FindOptions { /** * Apply a scope on the related model, or remove its default scope by passing false. */ scope?: string | boolean; } /** * The getAssociations mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * getRoles: Sequelize.BelongsToManyGetAssociationsMixin<RoleInstance>; * // setRoles... * // addRoles... * // addRole... * // createRole... * // removeRole... * // removeRoles... * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see http://docs.sequelizejs.com/en/latest/api/associations/belongs-to-many/ * @see Instance */ export type BelongsToManyGetAssociationsMixin<TModel> = ( options?: BelongsToManyGetAssociationsMixinOptions ) => Promise<TModel[]>; /** * The options for the setAssociations mixin of the belongsToMany association. * @see BelongsToManySetAssociationsMixin */ export interface BelongsToManySetAssociationsMixinOptions extends FindOptions, BulkCreateOptions, InstanceUpdateOptions, InstanceDestroyOptions { through?: JoinTableAttributes; } /** * The setAssociations mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * setRoles: Sequelize.BelongsToManySetAssociationsMixin<RoleInstance, RoleId, UserRoleAttributes>; * // addRoles... * // addRole... * // createRole... * // removeRole... * // removeRoles... * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see http://docs.sequelizejs.com/en/latest/api/associations/belongs-to-many/ * @see Instance */ export type BelongsToManySetAssociationsMixin<TModel, TModelPrimaryKey> = ( newAssociations?: (TModel | TModelPrimaryKey)[], options?: BelongsToManySetAssociationsMixinOptions ) => Promise<void>; /** * The options for the addAssociations mixin of the belongsToMany association. * @see BelongsToManyAddAssociationsMixin */ export interface BelongsToManyAddAssociationsMixinOptions extends FindOptions, BulkCreateOptions, InstanceUpdateOptions, InstanceDestroyOptions { through?: JoinTableAttributes; } /** * The addAssociations mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * addRoles: Sequelize.BelongsToManyAddAssociationsMixin<RoleInstance, RoleId, UserRoleAttributes>; * // addRole... * // createRole... * // removeRole... * // removeRoles... * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see http://docs.sequelizejs.com/en/latest/api/associations/belongs-to-many/ * @see Instance */ export type BelongsToManyAddAssociationsMixin<TModel, TModelPrimaryKey> = ( newAssociations?: (TModel | TModelPrimaryKey)[], options?: BelongsToManyAddAssociationsMixinOptions ) => Promise<void>; /** * The options for the addAssociation mixin of the belongsToMany association. * @see BelongsToManyAddAssociationMixin */ export interface BelongsToManyAddAssociationMixinOptions extends FindOptions, BulkCreateOptions, InstanceUpdateOptions, InstanceDestroyOptions { through?: JoinTableAttributes; } /** * The addAssociation mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * addRole: Sequelize.BelongsToManyAddAssociationMixin<RoleInstance, RoleId, UserRoleAttributes>; * // createRole... * // removeRole... * // removeRoles... * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see http://docs.sequelizejs.com/en/latest/api/associations/belongs-to-many/ * @see Instance */ export type BelongsToManyAddAssociationMixin<TModel, TModelPrimaryKey> = ( newAssociation?: TModel | TModelPrimaryKey, options?: BelongsToManyAddAssociationMixinOptions ) => Promise<void>; /** * The options for the createAssociation mixin of the belongsToMany association. * @see BelongsToManyCreateAssociationMixin */ export interface BelongsToManyCreateAssociationMixinOptions extends CreateOptions { through?: JoinTableAttributes; } /** * The createAssociation mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * // addRole... * createRole: Sequelize.BelongsToManyCreateAssociationMixin<RoleAttributes, UserRoleAttributes>; * // removeRole... * // removeRoles... * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see http://docs.sequelizejs.com/en/latest/api/associations/belongs-to-many/ * @see Instance */ export type BelongsToManyCreateAssociationMixin<TModel> = ( values?: { [attribute: string]: unknown }, options?: BelongsToManyCreateAssociationMixinOptions ) => Promise<TModel>; /** * The options for the removeAssociation mixin of the belongsToMany association. * @see BelongsToManyRemoveAssociationMixin */ export interface BelongsToManyRemoveAssociationMixinOptions extends InstanceDestroyOptions {} /** * The removeAssociation mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * // addRole... * // createRole... * removeRole: Sequelize.BelongsToManyRemoveAssociationMixin<RoleInstance, RoleId>; * // removeRoles... * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see http://docs.sequelizejs.com/en/latest/api/associations/belongs-to-many/ * @see Instance */ export type BelongsToManyRemoveAssociationMixin<TModel, TModelPrimaryKey> = ( oldAssociated?: TModel | TModelPrimaryKey, options?: BelongsToManyRemoveAssociationMixinOptions ) => Promise<void>; /** * The options for the removeAssociations mixin of the belongsToMany association. * @see BelongsToManyRemoveAssociationsMixin */ export interface BelongsToManyRemoveAssociationsMixinOptions extends InstanceDestroyOptions, InstanceDestroyOptions {} /** * The removeAssociations mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * // addRole... * // createRole... * // removeRole... * removeRoles: Sequelize.BelongsToManyRemoveAssociationsMixin<RoleInstance, RoleId>; * // hasRole... * // hasRoles... * // countRoles... * } * ``` * * @see http://docs.sequelizejs.com/en/latest/api/associations/belongs-to-many/ * @see Instance */ export type BelongsToManyRemoveAssociationsMixin<TModel, TModelPrimaryKey> = ( oldAssociateds?: (TModel | TModelPrimaryKey)[], options?: BelongsToManyRemoveAssociationsMixinOptions ) => Promise<void>; /** * The options for the hasAssociation mixin of the belongsToMany association. * @see BelongsToManyHasAssociationMixin */ export interface BelongsToManyHasAssociationMixinOptions extends BelongsToManyGetAssociationsMixinOptions {} /** * The hasAssociation mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * // addRole... * // createRole... * // removeRole... * // removeRoles... * hasRole: Sequelize.BelongsToManyHasAssociationMixin<RoleInstance, RoleId>; * // hasRoles... * // countRoles... * } * ``` * * @see http://docs.sequelizejs.com/en/latest/api/associations/belongs-to-many/ * @see Instance */ export type BelongsToManyHasAssociationMixin<TModel, TModelPrimaryKey> = ( target: TModel | TModelPrimaryKey, options?: BelongsToManyHasAssociationMixinOptions ) => Promise<boolean>; /** * The options for the hasAssociations mixin of the belongsToMany association. * @see BelongsToManyHasAssociationsMixin */ export interface BelongsToManyHasAssociationsMixinOptions extends BelongsToManyGetAssociationsMixinOptions {} /** * The removeAssociations mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * // addRole... * // createRole... * // removeRole... * // removeRoles * // hasRole... * hasRoles: Sequelize.BelongsToManyHasAssociationsMixin<RoleInstance, RoleId>; * // countRoles... * } * ``` * * @see http://docs.sequelizejs.com/en/latest/api/associations/belongs-to-many/ * @see Instance */ export type BelongsToManyHasAssociationsMixin<TModel, TModelPrimaryKey> = ( targets: (TModel | TModelPrimaryKey)[], options?: BelongsToManyHasAssociationsMixinOptions ) => Promise<boolean>; /** * The options for the countAssociations mixin of the belongsToMany association. * @see BelongsToManyCountAssociationsMixin */ export interface BelongsToManyCountAssociationsMixinOptions extends Transactionable, Filterable { /** * Apply a scope on the related model, or remove its default scope by passing false. */ scope?: string | boolean; } /** * The countAssociations mixin applied to models with belongsToMany. * An example of usage is as follows: * * ```js * * User.belongsToMany(Role, { through: UserRole }); * * interface UserInstance extends Sequelize.Instance<UserInstance, UserAttributes>, UserAttributes { * // getRoles... * // setRoles... * // addRoles... * // addRole... * // createRole... * // removeRole... * // removeRoles... * // hasRole... * // hasRoles... * countRoles: Sequelize.BelongsToManyCountAssociationsMixin; * } * ``` * * @see http://docs.sequelizejs.com/en/latest/api/associations/belongs-to-many/ * @see Instance */ export type BelongsToManyCountAssociationsMixin = ( options?: BelongsToManyCountAssociationsMixinOptions ) => Promise<number>;