Skip to content

Commit

Permalink
fix: set join props for m-t-m JoinTable decorator
Browse files Browse the repository at this point in the history
  • Loading branch information
metmirr committed Jul 2, 2020
1 parent 6f761ee commit 4b25c02
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 19 deletions.
@@ -1,4 +1,5 @@
import { WarthogModel, Field, ObjectType } from '../model';
import { generateJoinColumnName, generateJoinTableName } from './utils';

export class RelationshipGenerator {
visited: string[];
Expand All @@ -10,8 +11,21 @@ export class RelationshipGenerator {
}

addMany2Many(field: Field, relatedField: Field, objType: ObjectType, relatedObject: ObjectType): void {
field.relation = { type: 'mtm', columnType: field.type, joinTable: true, relatedTsProp: relatedField.name };
relatedField.relation = { type: 'mtm', columnType: relatedField.type, relatedTsProp: field.name };
field.relation = {
type: 'mtm',
columnType: field.type,
joinTable: {
tableName: generateJoinTableName(objType.name, relatedObject.name),
joinColumn: generateJoinColumnName(objType.name),
inverseJoinColumn: generateJoinColumnName(relatedObject.name),
},
relatedTsProp: relatedField.name,
};
relatedField.relation = {
type: 'mtm',
columnType: relatedField.type,
relatedTsProp: field.name,
};

objType.relatedEntityImports.add(relatedObject.name);
relatedObject.relatedEntityImports.add(objType.name);
Expand All @@ -20,8 +34,16 @@ export class RelationshipGenerator {
}

addOne2Many(field: Field, relatedField: Field, objType: ObjectType, relatedObject: ObjectType): void {
field.relation = { type: 'otm', columnType: field.type, relatedTsProp: relatedField.name };
relatedField.relation = { type: 'mto', columnType: relatedField.type, relatedTsProp: field.name };
field.relation = {
type: 'otm',
columnType: field.type,
relatedTsProp: relatedField.name,
};
relatedField.relation = {
type: 'mto',
columnType: relatedField.type,
relatedTsProp: field.name,
};

objType.relatedEntityImports.add(field.type);
relatedObject.relatedEntityImports.add(objType.name);
Expand All @@ -36,8 +58,17 @@ export class RelationshipGenerator {
}

addOne2One(field: Field, relatedField: Field, objType: ObjectType, relatedObject: ObjectType): void {
field.relation = { type: 'oto', columnType: field.type, joinColumn: true, relatedTsProp: relatedField.name };
relatedField.relation = { type: 'oto', columnType: relatedField.type, relatedTsProp: field.name };
field.relation = {
type: 'oto',
columnType: field.type,
joinColumn: true,
relatedTsProp: relatedField.name,
};
relatedField.relation = {
type: 'oto',
columnType: relatedField.type,
relatedTsProp: field.name,
};

objType.relatedEntityImports.add(relatedObject.name);
relatedObject.relatedEntityImports.add(objType.name);
Expand Down Expand Up @@ -85,7 +116,8 @@ export class RelationshipGenerator {
const derivedFields = relatedFields.filter(f => f.derivedFrom?.argument === field.name);
if (derivedFields.length === 0) {
throw new Error(
`Incorrect one to one relationship. '${relatedObject.name}' should have a derived field with @derivedFrom(field: "${field.name}") directive`
`Incorrect one to one relationship. '${relatedObject.name}' should have a derived field
with @derivedFrom(field: "${field.name}") directive`
);
} else if (derivedFields.length === 1) {
if (!derivedFields[0].isList) {
Expand Down
11 changes: 9 additions & 2 deletions substrate-query-framework/cli/src/generate/utils.ts
@@ -1,4 +1,4 @@
import { upperFirst, kebabCase, camelCase } from 'lodash';
import { upperFirst, kebabCase, camelCase, snakeCase } from 'lodash';
import { GeneratorContext } from './SourcesGenerator';
import { ObjectType, Field } from '../model';
import _ from 'lodash';
Expand Down Expand Up @@ -57,4 +57,11 @@ export function ownFields(o: ObjectType): Field[] {

const intrFields = o.interfaces[0].fields || [];
return _.differenceBy(o.fields, intrFields, 'name');
}
}
export function generateJoinColumnName(name: string): string {
return snakeCase(name.concat('_id'));
}

export function generateJoinTableName(table1: string, table2: string): string {
return snakeCase(table1.concat('_', table2));
}
9 changes: 7 additions & 2 deletions substrate-query-framework/cli/src/model/Relation.ts
@@ -1,15 +1,20 @@
interface JoinTable {
tableName: string;
joinColumn: string;
inverseJoinColumn: string;
}

export interface Relation {
// Relation type oto, otm, mtm
type: string;

// Column type
columnType: string;

// Table that will hold relation id (foreign key)
joinColumn?: boolean;

joinTable?: boolean;
joinTable?: JoinTable;

relatedTsProp?: string;
}
27 changes: 19 additions & 8 deletions substrate-query-framework/cli/src/templates/entities/model.ts.mst
Expand Up @@ -49,27 +49,38 @@ export {{#isInterface}}abstract{{/isInterface}} class {{className}}

{{#fields}}
{{#is.otm}}
@OneToMany(() => {{relation.columnType}}, ({{camelName}}: {{relation.columnType}}) => {{camelName}}.{{relation.relatedTsProp}})
@OneToMany(() => {{relation.columnType}}, (param: {{relation.columnType}}) => param.{{relation.relatedTsProp}})
{{camelName}}?: {{relation.columnType}}[];
{{/is.otm}}

{{#is.mto}}
@ManyToOne(() => {{relation.columnType}}, {{#relation.relatedTsProp}}({{camelName}}: {{relation.columnType}}) => {{camelName}}.{{relation.relatedTsProp}},{{/relation.relatedTsProp}} {
skipGraphQLField: true{{^required}},
nullable: true{{/required}}
@ManyToOne(() => {{relation.columnType}},
{{#relation.relatedTsProp}}
(param: {{relation.columnType}}) => param.{{relation.relatedTsProp}},
{{/relation.relatedTsProp}}
{
skipGraphQLField: true{{^required}},
nullable: true{{/required}}
})
{{camelName}}{{^required}}?{{/required}}{{#required}}!{{/required}}: {{relation.columnType}};
{{/is.mto}}

{{#is.oto}}
{{^relation.joinColumn}}@OneToOne{{/relation.joinColumn}}{{#relation.joinColumn}}@OneToOneJoin{{/relation.joinColumn}}(() => {{relation.columnType}}
,({{camelName}}: {{relation.columnType}}) => {{camelName}}.{{relation.relatedTsProp}})
{{^relation.joinColumn}}@OneToOne{{/relation.joinColumn}}
{{#relation.joinColumn}}@OneToOneJoin{{/relation.joinColumn}}
(() => {{relation.columnType}},(param: {{relation.columnType}}) => param.{{relation.relatedTsProp}})
{{camelName}}{{^required}}?{{/required}}{{#required}}!{{/required}}: {{relation.columnType}};
{{/is.oto}}

{{#is.mtm}}
@ManyToMany(() => {{relation.columnType}}, ({{camelName}}: {{relation.columnType}}) => {{camelName}}.{{relation.relatedTsProp}})
{{#relation.joinTable}}@JoinTable(){{/relation.joinTable}}
@ManyToMany(() => {{relation.columnType}}, (param: {{relation.columnType}}) => param.{{relation.relatedTsProp}})
{{#relation.joinTable}}
@JoinTable({
name: '{{relation.joinTable.tableName}}',
joinColumn: {name: '{{relation.joinTable.joinColumn}}' },
inverseJoinColumn: {name: '{{relation.joinTable.inverseJoinColumn}}' }
})
{{/relation.joinTable}}
{{camelName}}{{^required}}?{{/required}}{{#required}}!{{/required}}: {{relation.columnType}}[];
{{/is.mtm}}

Expand Down

0 comments on commit 4b25c02

Please sign in to comment.