import { type Constructor, computeIfAbsent } from '@wener/utils'; import { Field, InputType, ObjectType } from 'type-graphql'; import { getObjectName } from '../getObjectName'; import { getTypeCache } from '../getTypeCache'; import { type RelayMutationInput, RelayMutationPayload } from '../relay'; import { BaseCreateResourceInput, BaseUpdateResourceInput } from './types'; export interface CreateResourceInput extends BaseCreateResourceInput { data: T; } export interface UpdateResourceInput extends BaseUpdateResourceInput { data: T; } export interface MutationResourcePayload extends RelayMutationInput { data: T; clientMutationId?: string; } export function createCreateResourceInput(Type: Constructor): Constructor> { // ResourceCreateInput let name = Type.name.replace(/(Update|Creare)?Input$/, ''); // CreateResourceInput let key = `Create${name}Input`; return computeIfAbsent(getTypeCache(), key, () => { @InputType(key) class CreateResourceInput extends BaseCreateResourceInput { @Field((_type) => Type) data!: T; } return CreateResourceInput; }); } export function createUpdateResourceInput(Type: Constructor): Constructor> { // ResourceCreateInput let name = Type.name.replace(/(Update|Create)?Input$/, ''); // CreateResourceInput let key = `Update${name}Input`; return computeIfAbsent(getTypeCache(), key, () => { @InputType(key) class UpdateResourceInput extends BaseUpdateResourceInput { @Field((_type) => Type) data!: T; } return UpdateResourceInput; }); } export function createMutationResourcePayload( Type: Constructor, ): Constructor> { let name = getObjectName(Type); let key = `Mutation${name}Payload`; return computeIfAbsent(getTypeCache(), key, () => { @ObjectType(key) class MutationResourcePayload extends RelayMutationPayload { @Field((_type) => Type) data!: T; } return MutationResourcePayload; }); } export function createUpdateResourcePayload( Type: Constructor, ): Constructor> { let name = getObjectName(Type); let key = `Update${name}Payload`; return computeIfAbsent(getTypeCache(), key, () => { @ObjectType(key) class UpdateResourcePayload extends RelayMutationPayload { @Field((_type) => Type) data!: T; } return UpdateResourcePayload; }); } export function createCreateResourcePayload( Type: Constructor, ): Constructor> { let name = getObjectName(Type); let key = `Create${name}Payload`; return computeIfAbsent(getTypeCache(), key, () => { @ObjectType(key) class CreateResourcePayload extends RelayMutationPayload { @Field((_type) => Type) data!: T; } return CreateResourcePayload; }); }