Skip to content

Commit

Permalink
feat: generate relation associations
Browse files Browse the repository at this point in the history
  • Loading branch information
Victor Korzunin committed Sep 5, 2021
1 parent 23b1ece commit 637e367
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 70 deletions.
51 changes: 33 additions & 18 deletions .plop/Model.ts.hbs
Original file line number Diff line number Diff line change
@@ -1,24 +1,39 @@
import {Optional, Sequelize, ModelAttributes, Model, DataTypes} from 'sequelize';
import { Sequelize, Model, DataTypes, ModelCtor } from 'sequelize';

export const {{model.name}}Factory = (sequelize: Sequelize) => {
const {{model.name}} = sequelize.define('{{model.name}}', {
{{#each scalarFields}}
{{name}}: {
type: {{#if isList}}DataTypes.ARRAY(DataTypes.{{type}}){{else}}DataTypes.{{type}}{{/if}},{{#if (eq allowNull false)}}
allowNull: {{allowNull}},{{/if}}{{#if isId}}
primaryKey: {{isId}},{{/if}}{{#if isAutoincrement}}
autoIncrement: {{isAutoincrement}},{{/if}}{{#if isUnique}}
unique: {{isUnique}},{{/if}}
class {{model.name}} extends Model {
{{#if relationFields}}
static associate(models: Record<string, ModelCtor<Model>>) {
{{#each relationFields}}
this.belongsTo(models.{{name}}, { targetKey: '{{targetKey}}', foreignKey: '{{foreignKey}}' });
{{/each}}
}
{{/if}}
}

{{model.name}}.init(
{
{{#each scalarFields}}
{{name}}: {
type: {{#if isList}}DataTypes.ARRAY(DataTypes.{{type}}){{else}}DataTypes.{{type}}{{/if}},{{#if (eq allowNull false)}}
allowNull: {{allowNull}},{{/if}}{{#if isId}}
primaryKey: {{isId}},{{/if}}{{#if isAutoincrement}}
autoIncrement: {{isAutoincrement}},{{/if}}{{#if isUnique}}
unique: {{isUnique}},{{/if}}
},
{{/each}}
},
{{/each}}
}, {
tableName: '{{#if model.dbName}}{{model.dbName}}{{else}}{{model.name}}{{/if}}',
timestamps: {{or (or hasCreatedAt hasUpdatedAt) hasDeletedAt}},{{#if (or (or hasCreatedAt hasUpdatedAt) hasDeletedAt)}}{{#if (eq hasCreatedAt false)}}
createdAt: false,{{/if}}{{#if (eq hasUpdatedAt false)}}
updatedAt: false,{{/if}}{{!-- {{#if (eq hasDeletedAt false)}}
deletedAt: false,{{/if}} --}}{{#if hasDeletedAt}}
paranoid: true,{{/if}}{{/if}}
});
{
sequelize,
modelName: '{{model.name}}',
tableName: '{{#if model.dbName}}{{model.dbName}}{{else}}{{model.name}}{{/if}}',
timestamps: {{or (or hasCreatedAt hasUpdatedAt) hasDeletedAt}},{{#if (or (or hasCreatedAt hasUpdatedAt) hasDeletedAt)}}{{#if (eq hasCreatedAt false)}}
createdAt: false,{{/if}}{{#if (eq hasUpdatedAt false)}}
updatedAt: false,{{/if}}{{!-- {{#if (eq hasDeletedAt false)}}
deletedAt: false,{{/if}} --}}{{#if hasDeletedAt}}
paranoid: true,{{/if}}{{/if}}
}
);

return {{model.name}};
};
39 changes: 25 additions & 14 deletions prisma/models/Post.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,31 @@
import {Optional, Sequelize, ModelAttributes, Model, DataTypes} from 'sequelize';
import { Sequelize, Model, DataTypes, ModelCtor } from 'sequelize';

export const PostFactory = (sequelize: Sequelize) => {
const Post = sequelize.define('Post', {
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
userId: {
type: DataTypes.INTEGER,
class Post extends Model {
static associate(models: Record<string, ModelCtor<Model>>) {
this.belongsTo(models.User, { targetKey: 'id', foreignKey: 'userId' });
}
}

Post.init(
{
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
userId: {
type: DataTypes.INTEGER,
},
},
}, {
tableName: 'Posts',
timestamps: false,
});
{
sequelize,
modelName: 'Post',
tableName: 'Posts',
timestamps: false,
}
);

return Post;
};
88 changes: 50 additions & 38 deletions prisma/models/User.ts
Original file line number Diff line number Diff line change
@@ -1,43 +1,55 @@
import {Optional, Sequelize, ModelAttributes, Model, DataTypes} from 'sequelize';
import { Sequelize, Model, DataTypes, ModelCtor } from 'sequelize';

export const UserFactory = (sequelize: Sequelize) => {
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
weight: {
type: DataTypes.FLOAT,
},
is18: {
type: DataTypes.BOOLEAN,
},
name: {
type: DataTypes.STRING,
},
successorId: {
type: DataTypes.INTEGER,
},
keywords: {
type: DataTypes.ARRAY(DataTypes.STRING),
allowNull: false,
},
biography: {
type: DataTypes.JSONB,
allowNull: false,
},
}, {
tableName: 'User',
timestamps: true,
updatedAt: false,
});
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: '' });
}
}

User.init(
{
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
weight: {
type: DataTypes.FLOAT,
},
is18: {
type: DataTypes.BOOLEAN,
},
name: {
type: DataTypes.STRING,
},
successorId: {
type: DataTypes.INTEGER,
},
keywords: {
type: DataTypes.ARRAY(DataTypes.STRING),
allowNull: false,
},
biography: {
type: DataTypes.JSONB,
allowNull: false,
},
},
{
sequelize,
modelName: 'User',
tableName: 'User',
timestamps: true,
updatedAt: false,
}
);

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

0 comments on commit 637e367

Please sign in to comment.