Remove singular/plural from field-metadata (#2085)
* Remove singular/plural from field-metadata * revert removing id from create input * remove console log * remove console log * codegen * missing files * fix tests
This commit is contained in:
@ -13,22 +13,12 @@ export class CreateFieldInput {
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Field()
|
||||
nameSingular: string;
|
||||
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
@Field({ nullable: true })
|
||||
namePlural?: string;
|
||||
name: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
@Field()
|
||||
labelSingular: string;
|
||||
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
@Field({ nullable: true })
|
||||
labelPlural?: string;
|
||||
label: string;
|
||||
|
||||
// Todo: use a type enum and share with typeorm entity
|
||||
@IsEnum([
|
||||
|
||||
@ -1,28 +1,18 @@
|
||||
import { Field, InputType } from '@nestjs/graphql';
|
||||
|
||||
import { IsBoolean, IsOptional, IsString } from 'class-validator';
|
||||
import { IsBoolean, IsNotEmpty, IsOptional, IsString } from 'class-validator';
|
||||
|
||||
@InputType()
|
||||
export class UpdateFieldInput {
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
@Field({ nullable: true })
|
||||
nameSingular?: string;
|
||||
@IsNotEmpty()
|
||||
@Field()
|
||||
name: string;
|
||||
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
@Field({ nullable: true })
|
||||
namePlural?: string;
|
||||
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
@Field({ nullable: true })
|
||||
labelSingular?: string;
|
||||
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
@Field({ nullable: true })
|
||||
labelPlural?: string;
|
||||
@IsNotEmpty()
|
||||
@Field()
|
||||
label: string;
|
||||
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
|
||||
@ -38,7 +38,7 @@ export const fieldMetadataAutoResolverOpts: AutoResolverOpts<
|
||||
update: {
|
||||
many: { disabled: true },
|
||||
},
|
||||
delete: { disabled: true },
|
||||
delete: { many: { disabled: true } },
|
||||
guards: [JwtAuthGuard],
|
||||
},
|
||||
];
|
||||
|
||||
@ -51,20 +51,12 @@ export class FieldMetadata {
|
||||
type: string;
|
||||
|
||||
@Field()
|
||||
@Column({ nullable: false, name: 'name_singular' })
|
||||
nameSingular: string;
|
||||
@Column({ nullable: false })
|
||||
name: string;
|
||||
|
||||
@Field()
|
||||
@Column({ nullable: true, name: 'name_plural' })
|
||||
namePlural: string;
|
||||
|
||||
@Field()
|
||||
@Column({ nullable: false, name: 'label_singular' })
|
||||
labelSingular: string;
|
||||
|
||||
@Field()
|
||||
@Column({ nullable: true, name: 'label_plural' })
|
||||
labelPlural: string;
|
||||
@Column({ nullable: false })
|
||||
label: string;
|
||||
|
||||
@Column({ nullable: false, name: 'target_column_map', type: 'jsonb' })
|
||||
targetColumnMap: FieldMetadataTargetColumnMap;
|
||||
|
||||
@ -44,8 +44,7 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadata> {
|
||||
|
||||
const fieldAlreadyExists = await this.fieldMetadataRepository.findOne({
|
||||
where: {
|
||||
nameSingular: record.nameSingular,
|
||||
namePlural: record.namePlural,
|
||||
name: record.name,
|
||||
objectId: record.objectId,
|
||||
workspaceId: record.workspaceId,
|
||||
},
|
||||
|
||||
@ -10,6 +10,7 @@ import { AddTargetColumnMap1696409050890 } from './migrations/1696409050890-add-
|
||||
import { MetadataNameLabelRefactoring1697126636202 } from './migrations/1697126636202-MetadataNameLabelRefactoring';
|
||||
import { RemoveFieldMetadataPlaceholder1697471445015 } from './migrations/1697471445015-removeFieldMetadataPlaceholder';
|
||||
import { AddSoftDelete1697474804403 } from './migrations/1697474804403-addSoftDelete';
|
||||
import { RemoveSingularPluralFromFieldLabelAndName1697534910933 } from './migrations/1697534910933-removeSingularPluralFromFieldLabelAndName';
|
||||
|
||||
config();
|
||||
|
||||
@ -31,6 +32,7 @@ export const typeORMMetadataModuleOptions: TypeOrmModuleOptions = {
|
||||
MetadataNameLabelRefactoring1697126636202,
|
||||
RemoveFieldMetadataPlaceholder1697471445015,
|
||||
AddSoftDelete1697474804403,
|
||||
RemoveSingularPluralFromFieldLabelAndName1697534910933,
|
||||
],
|
||||
};
|
||||
|
||||
|
||||
@ -116,17 +116,17 @@ export class MigrationRunnerService {
|
||||
default: 'public.uuid_generate_v4()',
|
||||
},
|
||||
{
|
||||
name: 'created_at',
|
||||
name: 'createdAt',
|
||||
type: 'timestamp',
|
||||
default: 'now()',
|
||||
},
|
||||
{
|
||||
name: 'updated_at',
|
||||
name: 'updatedAt',
|
||||
type: 'timestamp',
|
||||
default: 'now()',
|
||||
},
|
||||
{
|
||||
name: 'deleted_at',
|
||||
name: 'deletedAt',
|
||||
type: 'timestamp',
|
||||
isNullable: true,
|
||||
},
|
||||
|
||||
@ -0,0 +1,49 @@
|
||||
import { MigrationInterface, QueryRunner } from 'typeorm';
|
||||
|
||||
export class RemoveSingularPluralFromFieldLabelAndName1697534910933
|
||||
implements MigrationInterface
|
||||
{
|
||||
name = 'RemoveSingularPluralFromFieldLabelAndName1697534910933';
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "metadata"."field_metadata" DROP COLUMN "name_singular"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "metadata"."field_metadata" DROP COLUMN "name_plural"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "metadata"."field_metadata" DROP COLUMN "label_singular"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "metadata"."field_metadata" DROP COLUMN "label_plural"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "metadata"."field_metadata" ADD "name" character varying NOT NULL`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "metadata"."field_metadata" ADD "label" character varying NOT NULL`,
|
||||
);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "metadata"."field_metadata" DROP COLUMN "label"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "metadata"."field_metadata" DROP COLUMN "name"`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "metadata"."field_metadata" ADD "label_plural" character varying`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "metadata"."field_metadata" ADD "label_singular" character varying NOT NULL`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "metadata"."field_metadata" ADD "name_plural" character varying`,
|
||||
);
|
||||
await queryRunner.query(
|
||||
`ALTER TABLE "metadata"."field_metadata" ADD "name_singular" character varying NOT NULL`,
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -30,7 +30,7 @@ export class BeforeCreateOneObject<T extends ObjectMetadata>
|
||||
);
|
||||
|
||||
instance.input.dataSourceId = lastDataSourceMetadata.id;
|
||||
instance.input.targetTableName = instance.input.nameSingular;
|
||||
instance.input.targetTableName = instance.input.namePlural;
|
||||
instance.input.workspaceId = workspaceId;
|
||||
instance.input.isActive = false;
|
||||
instance.input.isCustom = true;
|
||||
|
||||
@ -38,6 +38,7 @@ export const objectMetadataAutoResolverOpts: AutoResolverOpts<
|
||||
update: {
|
||||
many: { disabled: true },
|
||||
},
|
||||
delete: { many: { disabled: true } },
|
||||
guards: [JwtAuthGuard],
|
||||
},
|
||||
];
|
||||
|
||||
@ -36,19 +36,19 @@ describe('PGGraphQLQueryBuilder', () => {
|
||||
beforeEach(() => {
|
||||
const fields = [
|
||||
{
|
||||
nameSingular: 'name',
|
||||
name: 'name',
|
||||
targetColumnMap: {
|
||||
value: 'column_name',
|
||||
} as FieldMetadataTargetColumnMap,
|
||||
},
|
||||
{
|
||||
nameSingular: 'age',
|
||||
name: 'age',
|
||||
targetColumnMap: {
|
||||
value: 'column_age',
|
||||
} as FieldMetadataTargetColumnMap,
|
||||
},
|
||||
{
|
||||
nameSingular: 'complexField',
|
||||
name: 'complexField',
|
||||
targetColumnMap: {
|
||||
subField1: 'column_subField1',
|
||||
subField2: 'column_subField2',
|
||||
|
||||
@ -10,21 +10,21 @@ describe('convertArguments', () => {
|
||||
beforeEach(() => {
|
||||
fields = [
|
||||
{
|
||||
nameSingular: 'firstName',
|
||||
name: 'firstName',
|
||||
targetColumnMap: {
|
||||
value: 'column_1randomFirstNameKey',
|
||||
} as FieldMetadataTargetColumnMap,
|
||||
type: 'text',
|
||||
},
|
||||
{
|
||||
nameSingular: 'age',
|
||||
name: 'age',
|
||||
targetColumnMap: {
|
||||
value: 'column_randomAgeKey',
|
||||
} as FieldMetadataTargetColumnMap,
|
||||
type: 'text',
|
||||
},
|
||||
{
|
||||
nameSingular: 'website',
|
||||
name: 'website',
|
||||
targetColumnMap: {
|
||||
link: 'column_randomLinkKey',
|
||||
text: 'column_randomTex7Key',
|
||||
|
||||
@ -12,13 +12,13 @@ describe('convertFieldsToGraphQL', () => {
|
||||
beforeEach(() => {
|
||||
fields = [
|
||||
{
|
||||
nameSingular: 'simpleField',
|
||||
name: 'simpleField',
|
||||
targetColumnMap: {
|
||||
value: 'column_RANDOMSTRING1',
|
||||
} as FieldMetadataTargetColumnMap,
|
||||
},
|
||||
{
|
||||
nameSingular: 'complexField',
|
||||
name: 'complexField',
|
||||
targetColumnMap: {
|
||||
link: 'column_RANDOMSTRING2',
|
||||
text: 'column_RANDOMSTRING3',
|
||||
@ -74,7 +74,7 @@ describe('convertFieldsToGraphQL', () => {
|
||||
|
||||
test('should handle empty targetColumnMap gracefully', () => {
|
||||
const emptyField = {
|
||||
nameSingular: 'emptyField',
|
||||
name: 'emptyField',
|
||||
targetColumnMap: {},
|
||||
} as FieldMetadata;
|
||||
|
||||
|
||||
@ -11,15 +11,13 @@ describe('getFieldAliases', () => {
|
||||
// Setup sample field metadata
|
||||
fields = [
|
||||
{
|
||||
nameSingular: 'singleValueField',
|
||||
namePlural: 'singleValueFields',
|
||||
name: 'singleValueField',
|
||||
targetColumnMap: {
|
||||
value: 'column_singleValue',
|
||||
} as FieldMetadataTargetColumnMap,
|
||||
},
|
||||
{
|
||||
nameSingular: 'multipleValuesField',
|
||||
namePlural: 'multipleValuesFields',
|
||||
name: 'multipleValuesField',
|
||||
targetColumnMap: {
|
||||
link: 'column_value1',
|
||||
text: 'column_value2',
|
||||
@ -47,8 +45,7 @@ describe('getFieldAliases', () => {
|
||||
const fieldsWithEmptyMap = [
|
||||
...fields,
|
||||
{
|
||||
nameSingular: 'emptyField',
|
||||
namePlural: 'emptyFields',
|
||||
name: 'emptyField',
|
||||
targetColumnMap: {} as FieldMetadataTargetColumnMap,
|
||||
},
|
||||
] as FieldMetadata[];
|
||||
|
||||
@ -4,8 +4,7 @@ import { FieldMetadata } from 'src/metadata/field-metadata/field-metadata.entity
|
||||
|
||||
export const convertArguments = (args: any, fields: FieldMetadata[]): any => {
|
||||
const fieldsMap = new Map(
|
||||
// TODO: Handle plural for fields when we add relations
|
||||
fields.map((metadata) => [metadata.nameSingular, metadata]),
|
||||
fields.map((metadata) => [metadata.name, metadata]),
|
||||
);
|
||||
|
||||
if (Array.isArray(args)) {
|
||||
|
||||
@ -8,8 +8,7 @@ export const convertFieldsToGraphQL = (
|
||||
acc = '',
|
||||
) => {
|
||||
const fieldsMap = new Map(
|
||||
// TODO: Handle plural for fields when we add relations
|
||||
fields.map((metadata) => [metadata.nameSingular, metadata]),
|
||||
fields.map((metadata) => [metadata.name, metadata]),
|
||||
);
|
||||
|
||||
for (const [key, value] of Object.entries(select)) {
|
||||
@ -29,9 +28,7 @@ export const convertFieldsToGraphQL = (
|
||||
// Otherwise it means it's a special type with multiple values, so we need fetch all fields
|
||||
fieldAlias = `
|
||||
${entries
|
||||
.map(
|
||||
([key, value]) => `___${metadata.nameSingular}_${key}: ${value}`,
|
||||
)
|
||||
.map(([key, value]) => `___${metadata.name}_${key}: ${value}`)
|
||||
.join('\n')}
|
||||
`;
|
||||
}
|
||||
|
||||
@ -7,8 +7,7 @@ export const getFieldAliases = (fields: FieldMetadata[]) => {
|
||||
if (values.length === 1) {
|
||||
return {
|
||||
...acc,
|
||||
// TODO: Handle plural for fields when we add relations
|
||||
[column.nameSingular]: values[0],
|
||||
[column.name]: values[0],
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
|
||||
@ -30,12 +30,12 @@ describe('generateCreateInputType', () => {
|
||||
test('should generate fields with correct types and descriptions', () => {
|
||||
const columns = [
|
||||
{
|
||||
nameSingular: 'firstName',
|
||||
name: 'firstName',
|
||||
type: 'text',
|
||||
isNullable: false,
|
||||
},
|
||||
{
|
||||
nameSingular: 'age',
|
||||
name: 'age',
|
||||
type: 'number',
|
||||
isNullable: true,
|
||||
},
|
||||
|
||||
@ -46,12 +46,12 @@ describe('generateObjectType', () => {
|
||||
test('should generate fields based on provided columns', () => {
|
||||
const columns = [
|
||||
{
|
||||
nameSingular: 'firstName',
|
||||
name: 'firstName',
|
||||
type: 'text',
|
||||
isNullable: false,
|
||||
},
|
||||
{
|
||||
nameSingular: 'age',
|
||||
name: 'age',
|
||||
type: 'number',
|
||||
isNullable: true,
|
||||
},
|
||||
|
||||
@ -29,12 +29,12 @@ describe('generateUpdateInputType', () => {
|
||||
test('should generate fields with correct types and descriptions', () => {
|
||||
const columns = [
|
||||
{
|
||||
nameSingular: 'firstName',
|
||||
name: 'firstName',
|
||||
type: 'text',
|
||||
isNullable: true,
|
||||
},
|
||||
{
|
||||
nameSingular: 'age',
|
||||
name: 'age',
|
||||
type: 'number',
|
||||
isNullable: true,
|
||||
},
|
||||
|
||||
@ -40,7 +40,7 @@ describe('mapColumnTypeToGraphQLType', () => {
|
||||
test('should create a GraphQLEnumType for enum fields', () => {
|
||||
const column = new FieldMetadata();
|
||||
column.type = 'enum';
|
||||
column.nameSingular = 'Status';
|
||||
column.name = 'Status';
|
||||
column.enums = ['ACTIVE', 'INACTIVE'];
|
||||
const result = mapColumnTypeToGraphQLType(column);
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ export const generateCreateInputType = (
|
||||
columns.forEach((column) => {
|
||||
const graphqlType = mapColumnTypeToGraphQLType(column, true);
|
||||
|
||||
fields[column.nameSingular] = {
|
||||
fields[column.name] = {
|
||||
type: !column.isNullable ? new GraphQLNonNull(graphqlType) : graphqlType,
|
||||
};
|
||||
});
|
||||
|
||||
@ -33,7 +33,7 @@ export const generateObjectType = <TSource = any, TContext = any>(
|
||||
columns.forEach((column) => {
|
||||
const graphqlType = mapColumnTypeToGraphQLType(column);
|
||||
|
||||
fields[column.nameSingular] = {
|
||||
fields[column.name] = {
|
||||
type: !column.isNullable ? new GraphQLNonNull(graphqlType) : graphqlType,
|
||||
};
|
||||
});
|
||||
|
||||
@ -22,7 +22,7 @@ export const generateUpdateInputType = (
|
||||
columns.forEach((column) => {
|
||||
const graphqlType = mapColumnTypeToGraphQLType(column, true);
|
||||
// No GraphQLNonNull wrapping here, so all fields are optional
|
||||
fields[column.nameSingular] = {
|
||||
fields[column.name] = {
|
||||
type: graphqlType,
|
||||
};
|
||||
});
|
||||
|
||||
@ -65,7 +65,7 @@ export const mapColumnTypeToGraphQLType = (
|
||||
return GraphQLInt;
|
||||
case 'enum': {
|
||||
if (column.enums && column.enums.length > 0) {
|
||||
const enumName = `${pascalCase(column.nameSingular)}Enum`;
|
||||
const enumName = `${pascalCase(column.name)}Enum`;
|
||||
|
||||
return new GraphQLEnumType({
|
||||
name: enumName,
|
||||
|
||||
Reference in New Issue
Block a user