[COMMAND MENU ITEMS] Create union type for command menu item payload (#19432)

Replace generic JSON scalar with a typed GraphQL union
CommandMenuItemPayload (PathNavigationPayload |
ObjectMetadataNavigationPayload) for the CommandMenuItem.payload field
This commit is contained in:
Raphaël Bosi
2026-04-08 14:47:34 +02:00
committed by GitHub
parent 265d859c6e
commit d07c27a907
28 changed files with 673 additions and 305 deletions
@@ -0,0 +1,29 @@
import { createUnionType } from '@nestjs/graphql';
import { ObjectMetadataCommandMenuItemPayloadDTO } from 'src/engine/metadata-modules/command-menu-item/dtos/object-metadata-command-menu-item-payload.dto';
import { PathCommandMenuItemPayloadDTO } from 'src/engine/metadata-modules/command-menu-item/dtos/path-command-menu-item-payload.dto';
import { type ObjectMetadataCommandMenuItemPayload } from 'src/engine/metadata-modules/command-menu-item/dtos/types/object-metadata-command-menu-item-payload.type';
import { type PathCommandMenuItemPayload } from 'src/engine/metadata-modules/command-menu-item/dtos/types/path-command-menu-item-payload.type';
export type CommandMenuItemPayload =
| PathCommandMenuItemPayload
| ObjectMetadataCommandMenuItemPayload;
export const CommandMenuItemPayloadUnion = createUnionType({
name: 'CommandMenuItemPayload',
types: () => [
PathCommandMenuItemPayloadDTO,
ObjectMetadataCommandMenuItemPayloadDTO,
],
resolveType(payload: CommandMenuItemPayload) {
if ('path' in payload) {
return PathCommandMenuItemPayloadDTO;
}
if ('objectMetadataItemId' in payload) {
return ObjectMetadataCommandMenuItemPayloadDTO;
}
return undefined;
},
});
@@ -10,10 +10,13 @@ import {
IsString,
IsUUID,
} from 'class-validator';
import { GraphQLJSON } from 'graphql-type-json';
import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
import { CommandMenuItemAvailabilityType } from 'src/engine/metadata-modules/command-menu-item/enums/command-menu-item-availability-type.enum';
import {
type CommandMenuItemPayload,
CommandMenuItemPayloadUnion,
} from 'src/engine/metadata-modules/command-menu-item/dtos/command-menu-item-payload.union';
import { EngineComponentKey } from 'src/engine/metadata-modules/command-menu-item/enums/engine-component-key.enum';
import { FrontComponentDTO } from 'src/engine/metadata-modules/front-component/dtos/front-component.dto';
@@ -70,8 +73,8 @@ export class CommandMenuItemDTO {
availabilityType: CommandMenuItemAvailabilityType;
@IsOptional()
@Field(() => GraphQLJSON, { nullable: true })
payload?: Record<string, unknown>;
@Field(() => CommandMenuItemPayloadUnion, { nullable: true })
payload?: CommandMenuItemPayload;
@IsString({ each: true })
@IsOptional()
@@ -13,6 +13,7 @@ import {
import GraphQLJSON from 'graphql-type-json';
import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
import { type CommandMenuItemPayload } from 'src/engine/metadata-modules/command-menu-item/dtos/command-menu-item-payload.union';
import { CommandMenuItemAvailabilityType } from 'src/engine/metadata-modules/command-menu-item/enums/command-menu-item-availability-type.enum';
import { EngineComponentKey } from 'src/engine/metadata-modules/command-menu-item/enums/engine-component-key.enum';
@@ -81,5 +82,5 @@ export class CreateCommandMenuItemInput {
@IsObject()
@IsOptional()
@Field(() => GraphQLJSON, { nullable: true })
payload?: Record<string, unknown>;
payload?: CommandMenuItemPayload;
}
@@ -0,0 +1,13 @@
import { Field, ObjectType } from '@nestjs/graphql';
import { IsNotEmpty, IsUUID } from 'class-validator';
import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars';
@ObjectType('ObjectMetadataCommandMenuItemPayload')
export class ObjectMetadataCommandMenuItemPayloadDTO {
@IsUUID()
@IsNotEmpty()
@Field(() => UUIDScalarType)
objectMetadataItemId: string;
}
@@ -0,0 +1,11 @@
import { Field, ObjectType } from '@nestjs/graphql';
import { IsNotEmpty, IsString } from 'class-validator';
@ObjectType('PathCommandMenuItemPayload')
export class PathCommandMenuItemPayloadDTO {
@IsString()
@IsNotEmpty()
@Field()
path: string;
}
@@ -0,0 +1,3 @@
export type ObjectMetadataCommandMenuItemPayload = {
objectMetadataItemId: string;
};
@@ -0,0 +1,3 @@
export type PathCommandMenuItemPayload = {
path: string;
};
@@ -11,6 +11,7 @@ import {
UpdateDateColumn,
} from 'typeorm';
import { type CommandMenuItemPayload } from 'src/engine/metadata-modules/command-menu-item/dtos/command-menu-item-payload.union';
import { CommandMenuItemAvailabilityType } from 'src/engine/metadata-modules/command-menu-item/enums/command-menu-item-availability-type.enum';
import { EngineComponentKey } from 'src/engine/metadata-modules/command-menu-item/enums/engine-component-key.enum';
import { FrontComponentEntity } from 'src/engine/metadata-modules/front-component/entities/front-component.entity';
@@ -80,7 +81,7 @@ export class CommandMenuItemEntity
availabilityType: CommandMenuItemAvailabilityType;
@Column({ type: 'jsonb', nullable: true })
payload: Record<string, unknown> | null;
payload: CommandMenuItemPayload | null;
@Column({ type: 'text', array: true, nullable: true })
hotKeys: string[] | null;