493 lines
14 KiB
TypeScript
493 lines
14 KiB
TypeScript
import {
|
|
BulkCreateOptions,
|
|
CreateOptions,
|
|
Filterable,
|
|
FindAttributeOptions,
|
|
FindOptions,
|
|
InstanceDestroyOptions,
|
|
InstanceUpdateOptions,
|
|
Model,
|
|
ModelCtor,
|
|
ModelType,
|
|
Transactionable
|
|
} from '../model';
|
|
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.
|
|
* Can be a string if you want the model to be generated by sequelize.
|
|
*/
|
|
model: ModelType | string;
|
|
|
|
/**
|
|
* If true the generated join table will be paranoid
|
|
* @default false
|
|
*/
|
|
paranoid?: boolean;
|
|
|
|
/**
|
|
* 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: ModelType | 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;
|
|
|
|
/**
|
|
* The name of the field to use as the key for the association in the source table. Defaults to the primary
|
|
* key of the source table
|
|
*/
|
|
sourceKey?: string;
|
|
|
|
/**
|
|
* The name of the field to use as the key for the association in the target table. Defaults to the primary
|
|
* key of the target table
|
|
*/
|
|
targetKey?: string;
|
|
|
|
/**
|
|
* 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 sourceKey: string;
|
|
public targetKey: 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<any> {
|
|
/**
|
|
* A list of the attributes from the join table that you want to select.
|
|
*/
|
|
joinTableAttributes?: FindAttributeOptions
|
|
/**
|
|
* 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 https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html
|
|
* @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<any>,
|
|
BulkCreateOptions<any>,
|
|
InstanceUpdateOptions<any>,
|
|
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 https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html
|
|
* @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<any>,
|
|
BulkCreateOptions<any>,
|
|
InstanceUpdateOptions<any>,
|
|
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 https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html
|
|
* @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<any>,
|
|
BulkCreateOptions<any>,
|
|
InstanceUpdateOptions<any>,
|
|
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 https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html
|
|
* @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<any> {
|
|
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 https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html
|
|
* @see Instance
|
|
*/
|
|
export type BelongsToManyCreateAssociationMixin<TModel extends Model> = (
|
|
values?: TModel['_creationAttributes'],
|
|
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 https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html
|
|
* @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 https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html
|
|
* @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 https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html
|
|
* @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 https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html
|
|
* @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<any> {
|
|
/**
|
|
* 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 https://sequelize.org/master/class/lib/associations/belongs-to-many.js~BelongsToMany.html
|
|
* @see Instance
|
|
*/
|
|
export type BelongsToManyCountAssociationsMixin = (
|
|
options?: BelongsToManyCountAssociationsMixinOptions
|
|
) => Promise<number>;
|