Handle relation fields in subgraph entities (#87)

This commit is contained in:
nikugogoi 2021-12-22 18:46:46 +05:30 committed by nabarun
parent 4b1b0e0ed6
commit d96cc095bb
2 changed files with 41 additions and 66 deletions

View File

@ -282,7 +282,8 @@ export class Entity {
_addBigIntTransformerOption (entityObject: any): void {
entityObject.columns.forEach((column: any) => {
if (column.tsType === 'bigint') {
// Implement bigintTransformer for bigint types.
if (['bigint', 'bigint[]'].includes(column.tsType)) {
column.columnOptions.push(
{
option: 'transformer',
@ -310,6 +311,11 @@ export class Entity {
_addSubgraphColumns (subgraphTypeDefs: any, entityObject: any, def: any): any {
def.fields.forEach((field: any) => {
if (field.directives.some((directive: any) => directive.name.value === 'derivedFrom')) {
// Do not add column if it is a derived field.
return;
}
let name = field.name.value;
// Column id is already added.
@ -331,7 +337,12 @@ export class Entity {
const { typeName, array, nullable } = this._getFieldType(field.type);
let tsType = getTsForGql(typeName);
if (tsType) {
if (!tsType) {
tsType = 'string';
}
columnObject.tsType = tsType;
// Handle basic array types.
if (array) {
columnObject.columnOptions.push({
@ -340,21 +351,8 @@ export class Entity {
});
columnObject.tsType = `${tsType}[]`;
} else {
columnObject.tsType = tsType;
}
} else {
// TODO Handle array of custom types.
tsType = typeName;
columnObject.tsType = tsType;
}
const pgType = getPgForTs(tsType);
// If basic type: create a column.
if (pgType) {
columnObject.pgType = pgType;
} else {
if (subgraphTypeDefs.some((typeDef: any) => typeDef.kind === 'EnumTypeDefinition' && typeDef.name.value === typeName)) {
// Create enum type column.
@ -382,28 +380,8 @@ export class Entity {
}
);
} else {
// Create a relation.
columnObject.columnType = 'ManyToOne';
columnObject.lhs = '()';
columnObject.rhs = tsType;
entityObject.imports[0].toImport.add('ManyToOne');
// Check if type import already added.
const importObject = entityObject.imports.find((element: any) => {
return element.from === `./${tsType}`;
});
if (!importObject) {
entityObject.imports.push(
{
toImport: new Set([tsType]),
from: `./${tsType}`
}
);
}
}
// Enum type does not require pgType.
columnObject.pgType = getPgForTs(tsType);
}
if (nullable) {

View File

@ -25,9 +25,6 @@ export function parseSubgraphSchema (subgraphPath: string): any {
if (def.kind === 'ObjectTypeDefinition') {
def.fields.forEach((field: any) => {
// Remove field directives.
field.directives = [];
// Parse the field type.
field.type = parseType(field.type);
});