Skip to content

Commit

Permalink
feat: support hasOne and hasMany relations
Browse files Browse the repository at this point in the history
  • Loading branch information
Victor Korzunin committed Sep 10, 2021
1 parent 9e7b54b commit 8d63d3f
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 8 deletions.
12 changes: 9 additions & 3 deletions .plop/Model.ts.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,16 @@ import { Sequelize, Model, DataTypes, ModelCtor } from 'sequelize';

export const {{model.name}}Factory = (sequelize: Sequelize) => {
class {{model.name}} extends Model {
{{#if relationFields}}
{{#if (or belongsToFields (or hasManyFields hasOneFields))}}
static associate(models: Record<string, ModelCtor<Model>>) {
{{#each relationFields}}
this.belongsTo(models.{{name}}, { targetKey: '{{targetKey}}', foreignKey: '{{foreignKey}}' });
{{#each belongsToFields}}
this.belongsTo(models.{{name}}, { as: '{{as}}', targetKey: '{{targetKey}}', foreignKey: '{{foreignKey}}' });
{{/each}}
{{#each hasManyFields}}
this.hasMany(models.{{name}}, { as: '{{as}}' });
{{/each}}
{{#each hasOneFields}}
this.hasOne(models.{{name}}, { as: '{{as}}' });
{{/each}}
}
{{/if}}
Expand Down
2 changes: 1 addition & 1 deletion prisma/models/Post.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Sequelize, Model, DataTypes, ModelCtor } from 'sequelize';
export const PostFactory = (sequelize: Sequelize) => {
class Post extends Model {
static associate(models: Record<string, ModelCtor<Model>>) {
this.belongsTo(models.User, { targetKey: 'id', foreignKey: 'userId' });
this.belongsTo(models.User, { as: 'user', targetKey: 'id', foreignKey: 'userId' });
}
}

Expand Down
5 changes: 3 additions & 2 deletions prisma/models/User.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ import { Sequelize, Model, DataTypes, ModelCtor } from 'sequelize';
export const UserFactory = (sequelize: Sequelize) => {
class User extends Model {
static associate(models: Record<string, ModelCtor<Model>>) {
this.belongsTo(models.User, { targetKey: 'id', foreignKey: 'successorId' });
this.belongsTo(models.User, { targetKey: '', foreignKey: '' });
this.belongsTo(models.User, { as: 'successor', targetKey: 'id', foreignKey: 'successorId' });
this.hasMany(models.Post, { as: 'posts' });
this.hasOne(models.User, { as: 'predecessor' });
}
}

Expand Down
19 changes: 17 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,29 @@ generatorHandler({
isAutoincrement:
field.hasDefaultValue && typeof field.default === 'object' && field.default.name === 'autoincrement',
})),
relationFields: model.fields
belongsToFields: model.fields
.filter((field) => field.kind === 'object')
.filter((field) => !field.isList)
.filter((field) => !field.isList && field.relationToFields!.length)
.map((field) => ({
as: field.name,
name: field.type,
targetKey: field.relationToFields![0],
foreignKey: field.relationFromFields[0],
})),
hasOneFields: model.fields
.filter((field) => field.kind === 'object')
.filter((field) => !field.isList && !field.relationToFields?.length)
.map((field) => ({
as: field.name,
name: field.type,
})),
hasManyFields: model.fields
.filter((field) => field.kind === 'object')
.filter((field) => field.isList)
.map((field) => ({
as: field.name,
name: field.type,
})),
hasCreatedAt: attributes.includes('createdAt'),
hasUpdatedAt: attributes.includes('updatedAt'),
hasDeletedAt: attributes.includes('deletedAt'),
Expand Down

0 comments on commit 8d63d3f

Please sign in to comment.