From 8d63d3f0fe527254e949a256eb3c0a0f451730cf Mon Sep 17 00:00:00 2001 From: Victor Korzunin Date: Sat, 11 Sep 2021 01:31:56 +0200 Subject: [PATCH] feat: support hasOne and hasMany relations --- .plop/Model.ts.hbs | 12 +++++++++--- prisma/models/Post.ts | 2 +- prisma/models/User.ts | 5 +++-- src/index.ts | 19 +++++++++++++++++-- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/.plop/Model.ts.hbs b/.plop/Model.ts.hbs index e9f4b04..6e768b4 100644 --- a/.plop/Model.ts.hbs +++ b/.plop/Model.ts.hbs @@ -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>) { - {{#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}} diff --git a/prisma/models/Post.ts b/prisma/models/Post.ts index f0db6d5..c743f9b 100644 --- a/prisma/models/Post.ts +++ b/prisma/models/Post.ts @@ -3,7 +3,7 @@ import { Sequelize, Model, DataTypes, ModelCtor } from 'sequelize'; export const PostFactory = (sequelize: Sequelize) => { class Post extends Model { static associate(models: Record>) { - this.belongsTo(models.User, { targetKey: 'id', foreignKey: 'userId' }); + this.belongsTo(models.User, { as: 'user', targetKey: 'id', foreignKey: 'userId' }); } } diff --git a/prisma/models/User.ts b/prisma/models/User.ts index 54965e2..da31f03 100644 --- a/prisma/models/User.ts +++ b/prisma/models/User.ts @@ -3,8 +3,9 @@ import { Sequelize, Model, DataTypes, ModelCtor } from 'sequelize'; export const UserFactory = (sequelize: Sequelize) => { class User extends Model { static associate(models: Record>) { - 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' }); } } diff --git a/src/index.ts b/src/index.ts index 4d38c0e..3ddcf65 100644 --- a/src/index.ts +++ b/src/index.ts @@ -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'),