Skip to content

Commit

Permalink
fix: must sent stringified json to pg_graphql
Browse files Browse the repository at this point in the history
  • Loading branch information
magrinj authored and thaisguigon committed May 1, 2024
1 parent adc29d9 commit 8ad9895
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { FieldMetadataInterface } from 'src/engine/metadata-modules/field-metada
import { compositeTypeDefintions } from 'src/engine/metadata-modules/field-metadata/composite-types';
import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util';
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util';
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';

@Injectable()
export class ArgsAliasFactory {
Expand Down Expand Up @@ -46,11 +45,6 @@ export class ArgsAliasFactory {
for (const [key, value] of Object.entries(args)) {
const fieldMetadata = fieldMetadataMap.get(key);

if (fieldMetadata?.type === FieldMetadataType.RAW_JSON) {
newArgs[key] = JSON.stringify(value);
continue;
}

// If it's a composite type, we need to transform args to properly map column name
if (
fieldMetadata &&
Expand Down Expand Up @@ -82,11 +76,7 @@ export class ArgsAliasFactory {
compositeProperty,
);

if (compositeType.type === FieldMetadataType.RAW_JSON) {
newArgs[columnName] = JSON.stringify(subValue);
} else {
newArgs[columnName] = subValue;
}
newArgs[columnName] = subValue;
}
}
} else if (fieldMetadata) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { JsonScalarType } from './json.scalar';
import { RawJSONScalar } from './raw-json.scalar';
import { PositionScalarType } from './position.scalar';
import { CursorScalarType } from './cursor.scalar';
import { BigFloatScalarType } from './big-float.scalar';
Expand All @@ -25,5 +25,5 @@ export const scalars = [
UUIDScalarType,
CursorScalarType,
PositionScalarType,
JsonScalarType,
RawJSONScalar,
];

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import { GraphQLScalarType } from 'graphql';
import { Maybe } from 'graphql-yoga';
import { ObjMap } from 'graphql/jsutils/ObjMap';
import { ASTNode, Kind, ValueNode } from 'graphql/language';

const parseLiteral = (
ast: ValueNode,
variables?: Maybe<ObjMap<unknown>>,
): any => {
switch (ast.kind) {
case Kind.STRING:
case Kind.BOOLEAN:
return ast.value;
case Kind.INT:
case Kind.FLOAT:
return parseFloat(ast.value);
case Kind.OBJECT:
return parseObject(ast as any, variables);
case Kind.LIST:
return (ast as any).values.map((n: ValueNode) =>
parseLiteral(n, variables),
);
case Kind.NULL:
return null;
case Kind.VARIABLE:
return variables ? variables[ast.name.value] : undefined;
default:
throw new TypeError(
`JSONStringify cannot represent value: ${JSON.stringify(ast)}`,
);
}
};

const parseObject = (
ast: ASTNode,
variables?: Maybe<ObjMap<unknown>>,
): object => {
const value = Object.create(null);

if ('fields' in ast) {
ast.fields?.forEach((field: any) => {
value[field.name.value] = parseLiteral(field.value, variables);
});
}

return value;
};

const stringify = (value: any): string => {
return JSON.stringify(value);
};

const parseJSON = (value: string): object => {
try {
return JSON.parse(value);
} catch (e) {
throw new TypeError(`Value is not valid JSON: ${value}`);
}
};

export const RawJSONScalar = new GraphQLScalarType({
name: 'RawJSONScalar',
description:
'The `RawJSONScalar` scalar type represents JSON values, but stringifies inputs and parses outputs.',
serialize: parseJSON,
parseValue: stringify,
parseLiteral: (ast, variables) => {
if (ast.kind === Kind.STRING) {
return stringify(ast.value);
} else {
return stringify(parseLiteral(ast, variables));
}
},
});
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import {
UUIDScalarType,
} from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
import { PositionScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars/position.scalar';
import { JsonScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars/json.scalar';
import { RawJSONScalar } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars/raw-json.scalar';
import { IDFilterType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/id-filter.input-type';

export interface TypeOptions<T = any> {
Expand Down Expand Up @@ -76,7 +76,7 @@ export class TypeMapperService {
[FieldMetadataType.NUMERIC, BigFloatScalarType],
[FieldMetadataType.PROBABILITY, GraphQLFloat],
[FieldMetadataType.POSITION, PositionScalarType],
[FieldMetadataType.RAW_JSON, JsonScalarType],
[FieldMetadataType.RAW_JSON, RawJSONScalar],
]);

return typeScalarMapping.get(fieldMetadataType);
Expand Down

0 comments on commit 8ad9895

Please sign in to comment.