Add ServerlessFunction to migration v2 (#14698)

This commit is contained in:
Weiko
2025-09-25 14:05:01 +02:00
committed by GitHub
parent edb331d68b
commit 188d66909d
45 changed files with 1671 additions and 112 deletions
@@ -0,0 +1,31 @@
import { type MigrationInterface, type QueryRunner } from 'typeorm';
export class AddUniversalIdentifierToServerlessFunction1758793689363
implements MigrationInterface
{
name = 'AddUniversalIdentifierToServerlessFunction1758793689363';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "core"."serverlessFunction" ADD "universalIdentifier" uuid`,
);
await queryRunner.query(
`ALTER TABLE "core"."serverlessFunction" ADD "applicationId" uuid`,
);
await queryRunner.query(
`CREATE UNIQUE INDEX "IDX_5b43e65e322d516c9307bed97a" ON "core"."serverlessFunction" ("workspaceId", "universalIdentifier") `,
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`DROP INDEX "core"."IDX_5b43e65e322d516c9307bed97a"`,
);
await queryRunner.query(
`ALTER TABLE "core"."serverlessFunction" DROP COLUMN "applicationId"`,
);
await queryRunner.query(
`ALTER TABLE "core"."serverlessFunction" DROP COLUMN "universalIdentifier"`,
);
}
}
@@ -5,4 +5,5 @@ export const ALL_FLAT_ENTITY_MAPS_PROPERTIES = [
'flatViewFieldMaps',
'flatViewMaps',
'flatIndexMaps',
'flatServerlessFunctionMaps',
] as const satisfies (keyof AllFlatEntityMaps)[];
@@ -9,4 +9,5 @@ export const EMPTY_ALL_FLAT_ENTITY_MAPS = {
flatIndexMaps: EMPTY_FLAT_ENTITY_MAPS,
flatViewFieldMaps: EMPTY_FLAT_ENTITY_MAPS,
flatViewMaps: EMPTY_FLAT_ENTITY_MAPS,
flatServerlessFunctionMaps: EMPTY_FLAT_ENTITY_MAPS,
} as const satisfies AllFlatEntityMaps;
@@ -2,6 +2,7 @@ import { type FlatViewField } from 'src/engine/core-modules/view/flat-view/types
import { type FlatView } from 'src/engine/core-modules/view/flat-view/types/flat-view.type';
import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { type FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
export type AllFlatEntitiesByMetadataEngineName = {
// flatFieldMetadata: FlatFieldMetadata;
@@ -9,4 +10,5 @@ export type AllFlatEntitiesByMetadataEngineName = {
view: FlatView;
viewField: FlatViewField;
index: FlatIndexMetadata;
serverlessFunction: FlatServerlessFunction;
};
@@ -234,7 +234,7 @@ export class LambdaDriver implements ServerlessDriver {
}
const layerArn = await this.createLayerIfNotExists(
serverlessFunction.layerVersion,
serverlessFunction.layerVersion ?? 0,
);
const lambdaBuildDirectoryManager = new LambdaBuildDirectoryManager();
@@ -49,7 +49,7 @@ export class LocalDriver implements ServerlessDriver {
async delete() {}
private async build(serverlessFunction: ServerlessFunctionEntity) {
await this.createLayerIfNotExists(serverlessFunction.layerVersion);
await this.createLayerIfNotExists(serverlessFunction.layerVersion ?? 0);
}
private async executeWithTimeout<T>(
@@ -113,6 +113,10 @@ export class LocalDriver implements ServerlessDriver {
await fs.writeFile(compiledCodeFilePath, compiledCode, 'utf8');
try {
if (!serverlessFunction.layerVersion) {
throw new Error('Layer version is not set');
}
await fs.symlink(
join(
this.getInMemoryLayerFolderPath(serverlessFunction.layerVersion),
@@ -9,12 +9,13 @@ import {
ServerlessFunctionException,
ServerlessFunctionExceptionCode,
} from 'src/engine/metadata-modules/serverless-function/serverless-function.exception';
import { type FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
export const getServerlessFolder = ({
serverlessFunction,
version,
}: {
serverlessFunction: ServerlessFunctionEntity;
serverlessFunction: ServerlessFunctionEntity | FlatServerlessFunction;
version?: 'draft' | 'latest' | (string & NonNullable<unknown>);
}) => {
if (version === 'latest' && !isDefined(serverlessFunction.latestVersion)) {
@@ -34,6 +34,7 @@ export const throwOnFieldInputTranspilationsError: ThrowOnFieldInputTranspilatio
flatEntityMinimalInformation: {},
},
],
serverlessFunction: [],
},
status: 'fail',
},
@@ -0,0 +1,7 @@
import { type FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
export const FLAT_SERVERLESS_FUNCTION_EDITABLE_PROPERTIES = [
'name',
'description',
'timeoutSeconds',
] as const satisfies (keyof FlatServerlessFunction)[];
@@ -0,0 +1,6 @@
import { FLAT_SERVERLESS_FUNCTION_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/serverless-function/constants/flat-serverless-function-editable-properties.constant';
import { type FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
export const FLAT_SERVERLESS_FUNCTION_PROPERTIES_TO_COMPARE = [
...FLAT_SERVERLESS_FUNCTION_EDITABLE_PROPERTIES,
] as const satisfies (keyof FlatServerlessFunction)[];
@@ -5,15 +5,18 @@ import {
DeleteDateColumn,
Entity,
Index,
OneToMany,
PrimaryGeneratedColumn,
UpdateDateColumn,
OneToMany,
} from 'typeorm';
import { InputSchema } from 'src/modules/workflow/workflow-builder/workflow-schema/types/input-schema.type';
import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface';
import { Route } from 'src/engine/metadata-modules/route/route.entity';
import { ServerlessFunctionEntityRelationProperties } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
import { CronTrigger } from 'src/engine/metadata-modules/trigger/entities/cron-trigger.entity';
import { DatabaseEventTrigger } from 'src/engine/metadata-modules/trigger/entities/database-event-trigger.entity';
import { Route } from 'src/engine/metadata-modules/route/route.entity';
import { InputSchema } from 'src/modules/workflow/workflow-builder/workflow-schema/types/input-schema.type';
const DEFAULT_SERVERLESS_TIMEOUT_SECONDS = 300; // 5 minutes
@@ -22,26 +25,35 @@ export enum ServerlessFunctionRuntime {
NODE22 = 'nodejs22.x',
}
export const SERVERLESS_FUNCTION_ENTITY_RELATION_PROPERTIES = [
'cronTriggers',
'databaseEventTriggers',
'routes',
] as const satisfies readonly ServerlessFunctionEntityRelationProperties[];
@Entity('serverlessFunction')
@Index('IDX_SERVERLESS_FUNCTION_ID_DELETED_AT', ['id', 'deletedAt'])
export class ServerlessFunctionEntity {
export class ServerlessFunctionEntity
extends SyncableEntity
implements Required<ServerlessFunctionEntity>
{
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ nullable: false })
name: string;
@Column({ nullable: true })
description: string;
@Column({ nullable: true, type: 'varchar' })
description: string | null;
@Column({ nullable: true })
latestVersion: string;
@Column({ nullable: true, type: 'varchar' })
latestVersion: string | null;
@Column({ nullable: false, type: 'jsonb', default: [] })
publishedVersions: string[];
@Column({ nullable: true, type: 'jsonb' })
latestVersionInputSchema: InputSchema;
latestVersionInputSchema: InputSchema | null;
@Column({ nullable: false, default: ServerlessFunctionRuntime.NODE22 })
runtime: ServerlessFunctionRuntime;
@@ -50,12 +62,15 @@ export class ServerlessFunctionEntity {
@Check(`"timeoutSeconds" >= 1 AND "timeoutSeconds" <= 900`)
timeoutSeconds: number;
@Column({ nullable: true })
layerVersion: number;
@Column({ nullable: true, type: 'integer' })
layerVersion: number | null;
@Column({ nullable: false, type: 'uuid' })
workspaceId: string;
@Column({ nullable: true, type: 'uuid' })
applicationId: string | null;
@OneToMany(
() => CronTrigger,
(cronTrigger) => cronTrigger.serverlessFunction,
@@ -86,5 +101,5 @@ export class ServerlessFunctionEntity {
updatedAt: Date;
@DeleteDateColumn({ type: 'timestamptz' })
deletedAt?: Date;
deletedAt: Date | null;
}
@@ -4,15 +4,19 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm';
import { AuditModule } from 'src/engine/core-modules/audit/audit.module';
import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/core-modules/common/services/workspace-many-or-all-flat-entity-maps-cache.module';
import { FeatureFlag } from 'src/engine/core-modules/feature-flag/feature-flag.entity';
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
import { FileUploadModule } from 'src/engine/core-modules/file/file-upload/file-upload.module';
import { FileModule } from 'src/engine/core-modules/file/file.module';
import { ThrottlerModule } from 'src/engine/core-modules/throttler/throttler.module';
import { ServerlessFunctionTriggerJob } from 'src/engine/metadata-modules/serverless-function/jobs/serverless-function-trigger.job';
import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { ServerlessFunctionResolver } from 'src/engine/metadata-modules/serverless-function/serverless-function.resolver';
import { ServerlessFunctionService } from 'src/engine/metadata-modules/serverless-function/serverless-function.service';
import { ServerlessFunctionTriggerJob } from 'src/engine/metadata-modules/serverless-function/jobs/serverless-function-trigger.job';
import { ServerlessFunctionV2Service } from 'src/engine/metadata-modules/serverless-function/services/serverless-function-v2.service';
import { WorkspaceFlatServerlessFunctionMapCacheService } from 'src/engine/metadata-modules/serverless-function/services/workspace-flat-serverless-function-map-cache.service';
import { WorkspaceMigrationV2Module } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-v2.module';
@Module({
imports: [
@@ -23,11 +27,15 @@ import { ServerlessFunctionTriggerJob } from 'src/engine/metadata-modules/server
ThrottlerModule,
AuditModule,
FeatureFlagModule,
WorkspaceManyOrAllFlatEntityMapsCacheModule,
WorkspaceMigrationV2Module,
],
providers: [
ServerlessFunctionService,
ServerlessFunctionV2Service,
ServerlessFunctionTriggerJob,
ServerlessFunctionResolver,
WorkspaceFlatServerlessFunctionMapCacheService,
],
exports: [ServerlessFunctionService],
})
@@ -420,7 +420,7 @@ export class ServerlessFunctionService {
const newServerlessFunction = await this.createOneServerlessFunction(
{
name: serverlessFunctionToDuplicate.name,
description: serverlessFunctionToDuplicate.description,
description: serverlessFunctionToDuplicate.description ?? undefined,
timeoutSeconds: serverlessFunctionToDuplicate.timeoutSeconds,
},
workspaceId,
@@ -0,0 +1,369 @@
import { Injectable } from '@nestjs/common';
import { basename, dirname, join } from 'path';
import { isDefined } from 'twenty-shared/utils';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/core-modules/common/services/workspace-many-or-all-flat-entity-maps-cache.service.';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { getSubFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/get-sub-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service';
import { getBaseTypescriptProjectFiles } from 'src/engine/core-modules/serverless/drivers/utils/get-base-typescript-project-files';
import { ServerlessService } from 'src/engine/core-modules/serverless/serverless.service';
import { getServerlessFolder } from 'src/engine/core-modules/serverless/utils/serverless-get-folder.utils';
import { CreateServerlessFunctionInput } from 'src/engine/metadata-modules/serverless-function/dtos/create-serverless-function.input';
import { ServerlessFunctionIdInput } from 'src/engine/metadata-modules/serverless-function/dtos/serverless-function-id.input';
import { UpdateServerlessFunctionInput } from 'src/engine/metadata-modules/serverless-function/dtos/update-serverless-function.input';
import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import {
ServerlessFunctionException,
ServerlessFunctionExceptionCode,
} from 'src/engine/metadata-modules/serverless-function/serverless-function.exception';
import { FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
import { fromCreateServerlessFunctionInputToFlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/utils/from-create-serverless-function-input-to-flat-serverless-function.util';
import { fromUpdateServerlessFunctionInputToFlatServerlessFunctionToUpdateOrThrow } from 'src/engine/metadata-modules/serverless-function/utils/from-update-serverless-function-input-to-flat-serverless-function-to-update-or-throw.util';
import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2';
import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service';
@Injectable()
export class ServerlessFunctionV2Service {
constructor(
private readonly flatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService,
private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService,
private readonly fileStorageService: FileStorageService,
private readonly serverlessService: ServerlessService,
) {}
async createOne(
serverlessFunctionInput: CreateServerlessFunctionInput,
workspaceId: string,
) {
const flatEntityMaps =
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
{
workspaceId,
flatEntities: ['flatServerlessFunctionMaps'],
},
);
const existingFlatServerlessFunctionMaps =
flatEntityMaps.flatServerlessFunctionMaps;
const flatServerlessFunctionToCreate =
fromCreateServerlessFunctionInputToFlatServerlessFunction({
createServerlessFunctionInput: serverlessFunctionInput,
workspaceId,
});
const toFlatServerlessFunctionMaps = addFlatEntityToFlatEntityMapsOrThrow({
flatEntity: flatServerlessFunctionToCreate,
flatEntityMaps: existingFlatServerlessFunctionMaps,
});
const validateAndBuildResult =
await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration(
{
workspaceId,
fromToAllFlatEntityMaps: {
flatServerlessFunctionMaps: {
from: existingFlatServerlessFunctionMaps,
to: toFlatServerlessFunctionMaps,
},
},
buildOptions: {
isSystemBuild: false,
inferDeletionFromMissingEntities: false,
},
},
);
if (isDefined(validateAndBuildResult)) {
throw new WorkspaceMigrationBuilderExceptionV2(
validateAndBuildResult,
'Multiple validation errors occurred while creating serverless function',
);
}
const updatedFlatEntityMaps =
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
{
workspaceId,
flatEntities: ['flatServerlessFunctionMaps'],
},
);
const createdServerlessFunction =
updatedFlatEntityMaps.flatServerlessFunctionMaps.byId[
flatServerlessFunctionToCreate.id
];
if (!isDefined(createdServerlessFunction)) {
throw new ServerlessFunctionException(
'Created serverless function not found in recomputed cache',
ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
);
}
const draftFileFolder = getServerlessFolder({
serverlessFunction: createdServerlessFunction,
version: 'draft',
});
for (const file of await getBaseTypescriptProjectFiles) {
await this.fileStorageService.write({
file: file.content,
name: file.name,
mimeType: undefined,
folder: join(draftFileFolder, file.path),
});
}
return createdServerlessFunction;
}
async updateOne(
serverlessFunctionInput: UpdateServerlessFunctionInput,
workspaceId: string,
) {
const flatEntityMaps =
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
{
workspaceId,
flatEntities: ['flatServerlessFunctionMaps'],
},
);
const existingFlatServerlessFunctionMaps =
flatEntityMaps.flatServerlessFunctionMaps;
const optimisticallyUpdatedFlatServerlessFunction =
fromUpdateServerlessFunctionInputToFlatServerlessFunctionToUpdateOrThrow({
flatServerlessFunctionMaps: existingFlatServerlessFunctionMaps,
updateServerlessFunctionInput: serverlessFunctionInput,
});
const fromFlatServerlessFunctionMaps = getSubFlatEntityMapsOrThrow({
flatEntityIds: [optimisticallyUpdatedFlatServerlessFunction.id],
flatEntityMaps: existingFlatServerlessFunctionMaps,
});
const toFlatServerlessFunctionMaps =
replaceFlatEntityInFlatEntityMapsOrThrow({
flatEntity: optimisticallyUpdatedFlatServerlessFunction,
flatEntityMaps: fromFlatServerlessFunctionMaps,
});
const validateAndBuildResult =
await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration(
{
workspaceId,
fromToAllFlatEntityMaps: {
flatServerlessFunctionMaps: {
from: existingFlatServerlessFunctionMaps,
to: toFlatServerlessFunctionMaps,
},
},
buildOptions: {
isSystemBuild: false,
inferDeletionFromMissingEntities: false,
},
},
);
if (isDefined(validateAndBuildResult)) {
throw new WorkspaceMigrationBuilderExceptionV2(
validateAndBuildResult,
'Multiple validation errors occurred while updating serverless function',
);
}
const updatedFlatEntityMaps =
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
{
workspaceId,
flatEntities: ['flatServerlessFunctionMaps'],
},
);
const updatedFlatServerlessFunction =
updatedFlatEntityMaps.flatServerlessFunctionMaps.byId[
optimisticallyUpdatedFlatServerlessFunction.id
];
if (!isDefined(updatedFlatServerlessFunction)) {
throw new ServerlessFunctionException(
'Updated serverless function not found in recomputed cache',
ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
);
}
const fileFolder = getServerlessFolder({
serverlessFunction: updatedFlatServerlessFunction,
version: 'draft',
});
for (const key of Object.keys(serverlessFunctionInput.code)) {
await this.fileStorageService.write({
// @ts-expect-error legacy noImplicitAny
file: serverlessFunctionInput.code[key],
name: basename(key),
mimeType: undefined,
folder: join(fileFolder, dirname(key)),
});
}
return updatedFlatServerlessFunction;
}
async deleteOne({
deleteServerlessFunctionInput,
workspaceId,
}: {
deleteServerlessFunctionInput: ServerlessFunctionIdInput;
workspaceId: string;
}): Promise<FlatServerlessFunction> {
const { flatServerlessFunctionMaps: existingFlatServerlessFunctionMaps } =
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
{
workspaceId,
flatEntities: ['flatServerlessFunctionMaps'],
},
);
const existingFlatServerlessFunction =
existingFlatServerlessFunctionMaps.byId[deleteServerlessFunctionInput.id];
if (!isDefined(existingFlatServerlessFunction)) {
throw new ServerlessFunctionException(
'Serverless function to delete not found',
ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
);
}
const optimisticallyUpdatedFlatServerlessFunctionWithDeletedAt = {
...existingFlatServerlessFunction,
deletedAt: new Date(),
};
const toFlatServerlessFunctionMaps =
replaceFlatEntityInFlatEntityMapsOrThrow({
flatEntity: optimisticallyUpdatedFlatServerlessFunctionWithDeletedAt,
flatEntityMaps: existingFlatServerlessFunctionMaps,
});
const validateAndBuildResult =
await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration(
{
fromToAllFlatEntityMaps: {
flatServerlessFunctionMaps: {
from: existingFlatServerlessFunctionMaps,
to: toFlatServerlessFunctionMaps,
},
},
buildOptions: {
isSystemBuild: false,
inferDeletionFromMissingEntities: false,
},
workspaceId,
},
);
if (isDefined(validateAndBuildResult)) {
throw new WorkspaceMigrationBuilderExceptionV2(
validateAndBuildResult,
'Multiple validation errors occurred while deleting serverless function',
);
}
const {
flatServerlessFunctionMaps: recomputedExistingFlatServerlessFunctionMaps,
} =
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
{
workspaceId,
flatEntities: ['flatServerlessFunctionMaps'],
},
);
this.serverlessService.delete(
existingFlatServerlessFunction as ServerlessFunctionEntity,
);
return findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: optimisticallyUpdatedFlatServerlessFunctionWithDeletedAt.id,
flatEntityMaps: recomputedExistingFlatServerlessFunctionMaps,
});
}
async destroyOne({
destroyServerlessFunctionInput,
workspaceId,
}: {
destroyServerlessFunctionInput: ServerlessFunctionIdInput;
workspaceId: string;
}): Promise<FlatServerlessFunction> {
const { flatServerlessFunctionMaps: existingFlatServerlessFunctionMaps } =
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
{
workspaceId,
flatEntities: ['flatServerlessFunctionMaps'],
},
);
const existingFlatServerlessFunction =
existingFlatServerlessFunctionMaps.byId[
destroyServerlessFunctionInput.id
];
if (!isDefined(existingFlatServerlessFunction)) {
throw new ServerlessFunctionException(
'Serverless function to destroy not found',
ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
);
}
const fromFlatServerlessFunctionMaps = getSubFlatEntityMapsOrThrow({
flatEntityIds: [existingFlatServerlessFunction.id],
flatEntityMaps: existingFlatServerlessFunctionMaps,
});
const toFlatServerlessFunctionMaps =
deleteFlatEntityFromFlatEntityMapsOrThrow({
flatEntityMaps: fromFlatServerlessFunctionMaps,
entityToDeleteId: existingFlatServerlessFunction.id,
});
const validateAndBuildResult =
await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration(
{
fromToAllFlatEntityMaps: {
flatServerlessFunctionMaps: {
from: fromFlatServerlessFunctionMaps,
to: toFlatServerlessFunctionMaps,
},
},
buildOptions: {
isSystemBuild: false,
inferDeletionFromMissingEntities: true,
},
workspaceId,
},
);
if (isDefined(validateAndBuildResult)) {
throw new WorkspaceMigrationBuilderExceptionV2(
validateAndBuildResult,
'Multiple validation errors occurred while destroying serverless function',
);
}
this.fileStorageService.delete({
folderPath: getServerlessFolder({
serverlessFunction: existingFlatServerlessFunction,
}),
});
return existingFlatServerlessFunction;
}
}
@@ -0,0 +1,71 @@
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { removePropertiesFromRecord } from 'twenty-shared/utils';
import { Repository } from 'typeorm';
import { InjectCacheStorage } from 'src/engine/core-modules/cache-storage/decorators/cache-storage.decorator';
import { CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service';
import { CacheStorageNamespace } from 'src/engine/core-modules/cache-storage/types/cache-storage-namespace.enum';
import { EMPTY_FLAT_ENTITY_MAPS } from 'src/engine/core-modules/common/constant/empty-flat-entity-maps.constant';
import { FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import {
SERVERLESS_FUNCTION_ENTITY_RELATION_PROPERTIES,
ServerlessFunctionEntity,
} from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
import { WorkspaceFlatMapCache } from 'src/engine/workspace-flat-map-cache/decorators/workspace-flat-map-cache.decorator';
import { WorkspaceFlatMapCacheService } from 'src/engine/workspace-flat-map-cache/services/workspace-flat-map-cache.service';
@Injectable()
@WorkspaceFlatMapCache('flatServerlessFunctionMaps')
export class WorkspaceFlatServerlessFunctionMapCacheService extends WorkspaceFlatMapCacheService<
FlatEntityMaps<FlatServerlessFunction>
> {
constructor(
@InjectCacheStorage(CacheStorageNamespace.EngineWorkspace)
cacheStorageService: CacheStorageService,
@InjectRepository(ServerlessFunctionEntity)
private readonly serverlessFunctionRepository: Repository<ServerlessFunctionEntity>,
) {
super(cacheStorageService);
}
protected async computeFlatMap({
workspaceId,
}: {
workspaceId: string;
}): Promise<FlatEntityMaps<FlatServerlessFunction>> {
const serverlessFunctions = await this.serverlessFunctionRepository.find({
where: {
workspaceId,
},
withDeleted: true,
});
const flatServerlessFunctionMaps = serverlessFunctions.reduce<
FlatEntityMaps<FlatServerlessFunction>
>((flatEntityMaps, serverlessFunction) => {
const flatServerlessFunction = {
...removePropertiesFromRecord(serverlessFunction, [
...SERVERLESS_FUNCTION_ENTITY_RELATION_PROPERTIES,
]),
universalIdentifier: serverlessFunction.universalIdentifier ?? '',
} satisfies FlatServerlessFunction;
return {
byId: {
...flatEntityMaps.byId,
[flatServerlessFunction.id]: flatServerlessFunction,
},
idByUniversalIdentifier: {
...flatEntityMaps.idByUniversalIdentifier,
[flatServerlessFunction.universalIdentifier]:
flatServerlessFunction.id,
},
};
}, EMPTY_FLAT_ENTITY_MAPS);
return flatServerlessFunctionMaps;
}
}
@@ -0,0 +1,4 @@
import { type FLAT_SERVERLESS_FUNCTION_PROPERTIES_TO_COMPARE } from 'src/engine/metadata-modules/serverless-function/constants/flat-serverless-function-properties-to-compare.constant';
export type FlatServerlessFunctionPropertiesToCompare =
(typeof FLAT_SERVERLESS_FUNCTION_PROPERTIES_TO_COMPARE)[number];
@@ -0,0 +1,19 @@
import { type Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
import { type Route } from 'src/engine/metadata-modules/route/route.entity';
import { type ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { type CronTrigger } from 'src/engine/metadata-modules/trigger/entities/cron-trigger.entity';
import { type DatabaseEventTrigger } from 'src/engine/metadata-modules/trigger/entities/database-event-trigger.entity';
import { type ExtractRecordTypeOrmRelationProperties } from 'src/engine/workspace-manager/workspace-migration-v2/types/extract-record-typeorm-relation-properties.type';
export type ServerlessFunctionEntityRelationProperties =
ExtractRecordTypeOrmRelationProperties<
ServerlessFunctionEntity,
CronTrigger | DatabaseEventTrigger | Route | Workspace
>;
export type FlatServerlessFunction = Omit<
ServerlessFunctionEntity,
ServerlessFunctionEntityRelationProperties
> & {
universalIdentifier: string;
};
@@ -0,0 +1,59 @@
import diff from 'microdiff';
import { type FromTo } from 'twenty-shared/types';
import { FLAT_SERVERLESS_FUNCTION_PROPERTIES_TO_COMPARE } from 'src/engine/metadata-modules/serverless-function/constants/flat-serverless-function-properties-to-compare.constant';
import { type FlatServerlessFunctionPropertiesToCompare } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function-properties-to-compare.type';
import { type FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
import { type UpdateServerlessFunctionAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-serverless-function-action-v2.type';
import { transformMetadataForComparison } from 'src/engine/workspace-manager/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util';
type GetWorkspaceMigrationUpdateServerlessFunctionActionArgs = FromTo<
FlatServerlessFunction,
'FlatServerlessFunction'
>;
export const compareTwoFlatServerlessFunction = ({
fromFlatServerlessFunction,
toFlatServerlessFunction,
}: GetWorkspaceMigrationUpdateServerlessFunctionActionArgs) => {
const transformMetadataForComparisonParameters = {
shouldIgnoreProperty: (property: string) =>
!FLAT_SERVERLESS_FUNCTION_PROPERTIES_TO_COMPARE.includes(
property as FlatServerlessFunctionPropertiesToCompare,
),
propertiesToStringify: [],
};
const fromCompare = transformMetadataForComparison(
fromFlatServerlessFunction,
transformMetadataForComparisonParameters,
);
const toCompare = transformMetadataForComparison(
toFlatServerlessFunction,
transformMetadataForComparisonParameters,
);
const flatServerlessFunctionDifferences = diff(fromCompare, toCompare);
return flatServerlessFunctionDifferences.flatMap<
UpdateServerlessFunctionAction['updates'][number]
>((difference) => {
switch (difference.type) {
case 'CHANGE': {
const { oldValue, path, value } = difference;
const property = path[0] as FlatServerlessFunctionPropertiesToCompare;
return {
from: oldValue,
to: value,
property,
};
}
case 'CREATE':
case 'REMOVE':
default: {
// Should never occurs, we should only provide null never undefined and so on
return [];
}
}
});
};
@@ -0,0 +1,36 @@
import { v4 } from 'uuid';
import { LAST_LAYER_VERSION } from 'src/engine/core-modules/serverless/drivers/layers/last-layer-version';
import { type CreateServerlessFunctionInput } from 'src/engine/metadata-modules/serverless-function/dtos/create-serverless-function.input';
import { ServerlessFunctionRuntime } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { type FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
export const fromCreateServerlessFunctionInputToFlatServerlessFunction = ({
createServerlessFunctionInput,
workspaceId,
}: {
createServerlessFunctionInput: CreateServerlessFunctionInput;
workspaceId: string;
}): FlatServerlessFunction => {
const id = v4();
const universalIdentifier = v4();
const currentDate = new Date();
return {
id,
name: createServerlessFunctionInput.name,
description: createServerlessFunctionInput.description ?? null,
universalIdentifier,
createdAt: currentDate,
updatedAt: currentDate,
deletedAt: null,
latestVersion: null,
publishedVersions: [],
applicationId: null,
latestVersionInputSchema: null,
runtime: ServerlessFunctionRuntime.NODE22,
timeoutSeconds: createServerlessFunctionInput.timeoutSeconds ?? 300,
layerVersion: LAST_LAYER_VERSION,
workspaceId,
};
};
@@ -0,0 +1,51 @@
import { t } from '@lingui/core/macro';
import {
extractAndSanitizeObjectStringFields,
isDefined,
trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties,
} from 'twenty-shared/utils';
import { type FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { FLAT_SERVERLESS_FUNCTION_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/serverless-function/constants/flat-serverless-function-editable-properties.constant';
import { type UpdateServerlessFunctionInput } from 'src/engine/metadata-modules/serverless-function/dtos/update-serverless-function.input';
import {
ServerlessFunctionException,
ServerlessFunctionExceptionCode,
} from 'src/engine/metadata-modules/serverless-function/serverless-function.exception';
import { type FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
import { mergeUpdateInExistingRecord } from 'src/utils/merge-update-in-existing-record.util';
export const fromUpdateServerlessFunctionInputToFlatServerlessFunctionToUpdateOrThrow =
({
updateServerlessFunctionInput: rawUpdateServerlessFunctionInput,
flatServerlessFunctionMaps,
}: {
updateServerlessFunctionInput: UpdateServerlessFunctionInput;
flatServerlessFunctionMaps: FlatEntityMaps<FlatServerlessFunction>;
}): FlatServerlessFunction => {
const { id: serverlessFunctionToUpdateId } =
trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties(
rawUpdateServerlessFunctionInput,
['id'],
);
const existingFlatServerlessFunctionToUpdate =
flatServerlessFunctionMaps.byId[serverlessFunctionToUpdateId];
if (!isDefined(existingFlatServerlessFunctionToUpdate)) {
throw new ServerlessFunctionException(
t`Serverless function to update not found`,
ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
);
}
const updatedEditableFieldProperties = extractAndSanitizeObjectStringFields(
rawUpdateServerlessFunctionInput,
FLAT_SERVERLESS_FUNCTION_EDITABLE_PROPERTIES,
);
return mergeUpdateInExistingRecord({
existing: existingFlatServerlessFunctionToUpdate,
properties: FLAT_SERVERLESS_FUNCTION_EDITABLE_PROPERTIES,
update: updatedEditableFieldProperties,
});
};
@@ -15,4 +15,5 @@ export const EMPTY_ORCHESTRATOR_ACTIONS_REPORT = {
view: emptyCreatedDeletedUpdated,
viewField: emptyCreatedDeletedUpdated,
fieldMetadata: emptyCreatedDeletedUpdated,
serverlessFunction: emptyCreatedDeletedUpdated,
} as const satisfies OrchestratorActionsReport;
@@ -10,6 +10,7 @@ export const fromWorkspaceMigrationBuilderExceptionToValidationResponseError = (
invalidView: 0,
invalidViewField: 0,
invalidIndex: 0,
invalidServerlessFunction: 0,
totalErrors: 0,
},
errors: {
@@ -17,6 +18,7 @@ export const fromWorkspaceMigrationBuilderExceptionToValidationResponseError = (
objectMetadata: [],
view: [],
viewField: [],
serverlessFunction: [],
},
};
@@ -12,6 +12,7 @@ import {
WorkspaceMigrationOrchestratorSuccessfulResult,
} from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type';
import { WorkspaceMigrationV2IndexActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/index/workspace-migration-v2-index-actions-builder.service';
import { WorkspaceMigrationV2ServerlessFunctionActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/workspace-migration-v2-serverless-function-actions-builder.service';
import { WorkspaceMigrationV2ViewFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service';
import { WorkspaceMigrationV2ViewActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service';
import { WorkspaceMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service';
@@ -27,6 +28,7 @@ export class WorkspaceMigrationBuildOrchestratorService {
private readonly workspaceMigrationV2IndexActionsBuilderService: WorkspaceMigrationV2IndexActionsBuilderService,
private readonly workspaceMigrationV2ViewActionsBuilderService: WorkspaceMigrationV2ViewActionsBuilderService,
private readonly workspaceMigrationV2ViewFieldActionsBuilderService: WorkspaceMigrationV2ViewFieldActionsBuilderService,
private readonly workspaceMigrationV2ServerlessFunctionActionsBuilderService: WorkspaceMigrationV2ServerlessFunctionActionsBuilderService,
) {}
private setupOptimisticCache({
@@ -77,6 +79,7 @@ export class WorkspaceMigrationBuildOrchestratorService {
view: [],
viewField: [],
index: [],
serverlessFunction: [],
};
const optimisticAllFlatEntityMaps = this.setupOptimisticCache({
@@ -88,6 +91,7 @@ export class WorkspaceMigrationBuildOrchestratorService {
flatViewFieldMaps,
flatViewMaps,
flatIndexMaps,
flatServerlessFunctionMaps,
} = fromToAllFlatEntityMaps;
if (isDefined(flatObjectMetadataMaps)) {
@@ -189,6 +193,35 @@ export class WorkspaceMigrationBuildOrchestratorService {
}
}
if (isDefined(flatServerlessFunctionMaps)) {
const {
from: fromFlatServerlessFunctionMaps,
to: toFlatServerlessFunctionMaps,
} = flatServerlessFunctionMaps;
const serverlessFunctionResult =
await this.workspaceMigrationV2ServerlessFunctionActionsBuilderService.validateAndBuild(
{
from: fromFlatServerlessFunctionMaps,
to: toFlatServerlessFunctionMaps,
buildOptions,
dependencyOptimisticFlatEntityMaps: {} as AllFlatEntityMaps,
},
);
optimisticAllFlatEntityMaps.flatServerlessFunctionMaps =
serverlessFunctionResult.optimisticFlatEntityMaps;
if (serverlessFunctionResult.status === 'fail') {
orchestratorFailureReport.serverlessFunction.push(
...serverlessFunctionResult.errors,
);
} else {
orchestratorActionsReport.serverlessFunction =
serverlessFunctionResult.actions;
}
}
const allErrors = Object.values(orchestratorFailureReport);
if (allErrors.some((report) => report.length > 0)) {
@@ -207,7 +240,7 @@ export class WorkspaceMigrationBuildOrchestratorService {
workspaceMigration: {
relatedFlatEntityMapsKeys,
actions: [
// Object and fields
// Object and fields and indexes
...orchestratorActionsReport.index.deleted,
...orchestratorActionsReport.fieldMetadata.deleted,
...orchestratorActionsReport.objectMetadata.deleted,
@@ -227,6 +260,12 @@ export class WorkspaceMigrationBuildOrchestratorService {
...orchestratorActionsReport.viewField.created,
...orchestratorActionsReport.viewField.updated,
///
// Serverless functions
...orchestratorActionsReport.serverlessFunction.deleted,
...orchestratorActionsReport.serverlessFunction.created,
...orchestratorActionsReport.serverlessFunction.updated,
///
],
workspaceId,
},
@@ -11,10 +11,6 @@ import {
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { WorkspaceMigrationIndexActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2';
import {
getWorkspaceMigrationV2CreateIndexAction,
getWorkspaceMigrationV2DeleteIndexAction,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-index-actions';
import { FlatIndexValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-index-metadata-validator.service';
export type IndexRelatedFlatEntityMaps = Pick<
@@ -62,7 +58,10 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
return {
status: 'success',
action: getWorkspaceMigrationV2CreateIndexAction(flatIndexToValidate),
action: {
type: 'create_index',
flatIndexMetadata: flatIndexToValidate,
},
};
}
@@ -95,7 +94,10 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
return {
status: 'success',
action: getWorkspaceMigrationV2DeleteIndexAction(flatIndexToValidate),
action: {
type: 'delete_index',
flatIndexMetadataId: flatIndexToValidate.id,
},
};
}
@@ -156,8 +158,14 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
return {
status: 'success',
action: [
getWorkspaceMigrationV2DeleteIndexAction(fromFlatIndex),
getWorkspaceMigrationV2CreateIndexAction(toFlatIndex),
{
type: 'delete_index',
flatIndexMetadataId: fromFlatIndex.id,
},
{
type: 'create_index',
flatIndexMetadata: toFlatIndex,
},
],
};
}
@@ -0,0 +1,162 @@
import { Injectable } from '@nestjs/common';
import { FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
import { compareTwoFlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/utils/compare-two-flat-serverless-function.util';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
FlatEntityValidationReturnType,
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import {
UpdateServerlessFunctionAction,
WorkspaceMigrationServerlessFunctionActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-serverless-function-action-v2.type';
import {
FlatServerlessFunctionValidatorService,
ServerlessFunctionRelatedFlatEntityMaps,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-serverless-function-validator.service';
@Injectable()
export class WorkspaceMigrationV2ServerlessFunctionActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service<
FlatServerlessFunction,
WorkspaceMigrationServerlessFunctionActionV2,
ServerlessFunctionRelatedFlatEntityMaps
> {
constructor(
private readonly flatServerlessFunctionValidatorService: FlatServerlessFunctionValidatorService,
) {
super();
}
protected async validateFlatEntityCreation({
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatServerlessFunctionToValidate,
optimisticFlatEntityMaps: optimisticFlatServerlessFunctionMaps,
}: FlatEntityValidationArgs<
FlatServerlessFunction,
ServerlessFunctionRelatedFlatEntityMaps
>): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationServerlessFunctionActionV2,
FlatServerlessFunction
>
> {
const validationResult =
await this.flatServerlessFunctionValidatorService.validateFlatServerlessFunctionCreation(
{
dependencyOptimisticFlatEntityMaps,
flatServerlessFunctionToValidate,
optimisticFlatServerlessFunctionMaps,
},
);
if (validationResult.errors.length > 0) {
return {
status: 'fail',
...validationResult,
};
}
return {
status: 'success',
action: {
type: 'create_serverless_function',
serverlessFunction: flatServerlessFunctionToValidate,
},
};
}
protected async validateFlatEntityDeletion({
dependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatServerlessFunctionToValidate,
optimisticFlatEntityMaps: optimisticFlatServerlessFunctionMaps,
}: FlatEntityValidationArgs<
FlatServerlessFunction,
ServerlessFunctionRelatedFlatEntityMaps
>): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationServerlessFunctionActionV2,
FlatServerlessFunction
>
> {
const validationResult =
this.flatServerlessFunctionValidatorService.validateFlatServerlessFunctionDeletion(
{
dependencyOptimisticFlatEntityMaps,
flatServerlessFunctionToValidate,
optimisticFlatServerlessFunctionMaps,
},
);
if (validationResult.errors.length > 0) {
return {
status: 'fail',
...validationResult,
};
}
return {
status: 'success',
action: {
type: 'delete_serverless_function',
serverlessFunctionId: flatServerlessFunctionToValidate.id,
},
};
}
protected async validateFlatEntityUpdate({
dependencyOptimisticFlatEntityMaps,
flatEntityUpdate: {
from: fromFlatServerlessFunction,
to: toFlatServerlessFunction,
},
optimisticFlatEntityMaps: optimisticFlatServerlessFunctionMaps,
}: FlatEntityUpdateValidationArgs<
FlatServerlessFunction,
ServerlessFunctionRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationServerlessFunctionActionV2,
FlatServerlessFunction
>
| undefined
> {
const serverlessFunctionUpdatedProperties =
compareTwoFlatServerlessFunction({
fromFlatServerlessFunction,
toFlatServerlessFunction,
});
if (serverlessFunctionUpdatedProperties.length === 0) {
return undefined;
}
const validationResult =
this.flatServerlessFunctionValidatorService.validateFlatServerlessFunctionUpdate(
{
dependencyOptimisticFlatEntityMaps,
flatServerlessFunctionToValidate: toFlatServerlessFunction,
optimisticFlatServerlessFunctionMaps,
},
);
if (validationResult.errors.length > 0) {
return {
status: 'fail',
...validationResult,
};
}
const updateServerlessFunctionAction: UpdateServerlessFunctionAction = {
type: 'update_serverless_function',
serverlessFunctionId: toFlatServerlessFunction.id,
updates: serverlessFunctionUpdatedProperties,
};
return {
status: 'success',
action: updateServerlessFunctionAction,
};
}
}
@@ -13,10 +13,6 @@ import {
UpdateViewFieldAction,
WorkspaceMigrationViewFieldActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type';
import {
getWorkspaceMigrationV2ViewFieldCreateAction,
getWorkspaceMigrationV2ViewFieldDeleteAction,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-view-field-action';
import { FlatViewFieldValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-field-validator.service';
@Injectable()
@@ -60,9 +56,10 @@ export class WorkspaceMigrationV2ViewFieldActionsBuilderService extends Workspac
return {
status: 'success',
action: getWorkspaceMigrationV2ViewFieldCreateAction(
flatViewFieldToValidate,
),
action: {
type: 'create_view_field',
viewField: flatViewFieldToValidate,
},
};
}
@@ -95,9 +92,10 @@ export class WorkspaceMigrationV2ViewFieldActionsBuilderService extends Workspac
return {
status: 'success',
action: getWorkspaceMigrationV2ViewFieldDeleteAction(
flatViewFieldToValidate,
),
action: {
type: 'delete_view_field',
viewFieldId: flatViewFieldToValidate.id,
},
};
}
@@ -13,10 +13,6 @@ import {
UpdateViewAction,
WorkspaceMigrationViewActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type';
import {
getWorkspaceMigrationV2ViewCreateAction,
getWorkspaceMigrationV2ViewDeleteAction,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-view-action';
import { FlatViewValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-validator.service';
export type ViewRelatedFlatEntityMaps = Pick<
@@ -59,7 +55,10 @@ export class WorkspaceMigrationV2ViewActionsBuilderService extends WorkspaceEnti
return {
status: 'success',
action: getWorkspaceMigrationV2ViewCreateAction(flatViewToValidate),
action: {
type: 'create_view',
view: flatViewToValidate,
},
};
}
@@ -86,7 +85,10 @@ export class WorkspaceMigrationV2ViewActionsBuilderService extends WorkspaceEnti
return {
status: 'success',
action: getWorkspaceMigrationV2ViewDeleteAction(flatViewToValidate),
action: {
type: 'delete_view',
viewId: flatViewToValidate.id,
},
};
}
@@ -1,6 +1,7 @@
import { type WorkspaceMigrationFieldActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { type WorkspaceMigrationIndexActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2';
import { type WorkspaceMigrationObjectActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { type WorkspaceMigrationServerlessFunctionActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-serverless-function-action-v2.type';
import { type WorkspaceMigrationViewActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type';
import { type WorkspaceMigrationViewFieldActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type';
@@ -9,7 +10,8 @@ export type WorkspaceMigrationActionV2 =
| WorkspaceMigrationFieldActionV2
| WorkspaceMigrationIndexActionV2
| WorkspaceMigrationViewActionV2
| WorkspaceMigrationViewFieldActionV2;
| WorkspaceMigrationViewFieldActionV2
| WorkspaceMigrationServerlessFunctionActionV2;
export type WorkspaceMigrationActionTypeV2 = WorkspaceMigrationActionV2['type'];
export type ExtractAction<T extends WorkspaceMigrationActionTypeV2> = Extract<
@@ -0,0 +1,39 @@
import { type FromTo } from 'twenty-shared/types';
import { type ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { type FlatServerlessFunctionPropertiesToCompare } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function-properties-to-compare.type';
import { type FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
export type FlatServerlessFunctionPropertyUpdate<
P extends FlatServerlessFunctionPropertiesToCompare,
> = {
property: P;
} & FromTo<ServerlessFunctionEntity[P]>;
export type CreateServerlessFunctionAction = {
type: 'create_serverless_function';
serverlessFunction: FlatServerlessFunction;
};
export type UpdateServerlessFunctionAction = {
type: 'update_serverless_function';
serverlessFunctionId: string;
updates: Array<
{
[P in FlatServerlessFunctionPropertiesToCompare]: FlatServerlessFunctionPropertyUpdate<P>;
}[FlatServerlessFunctionPropertiesToCompare]
>;
};
export type DeleteServerlessFunctionAction = {
type: 'delete_serverless_function';
serverlessFunctionId: string;
};
export type WorkspaceMigrationServerlessFunctionActionV2 =
| CreateServerlessFunctionAction
| UpdateServerlessFunctionAction
| DeleteServerlessFunctionAction;
export type WorkspaceMigrationServerlessFunctionActionTypeV2 =
WorkspaceMigrationServerlessFunctionActionV2['type'];
@@ -1,19 +0,0 @@
import { type FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type';
import {
type CreateIndexAction,
type DeleteIndexAction,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2';
export const getWorkspaceMigrationV2CreateIndexAction = (
flatIndexMetadata: FlatIndexMetadata,
): CreateIndexAction => ({
type: 'create_index',
flatIndexMetadata,
});
export const getWorkspaceMigrationV2DeleteIndexAction = (
flatIndexMetadata: FlatIndexMetadata,
): DeleteIndexAction => ({
type: 'delete_index',
flatIndexMetadataId: flatIndexMetadata.id,
});
@@ -1,19 +0,0 @@
import { type FlatView } from 'src/engine/core-modules/view/flat-view/types/flat-view.type';
import {
type CreateViewAction,
type DeleteViewAction,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type';
export const getWorkspaceMigrationV2ViewCreateAction = (
flatView: FlatView,
): CreateViewAction => ({
type: 'create_view',
view: flatView,
});
export const getWorkspaceMigrationV2ViewDeleteAction = (
flatView: FlatView,
): DeleteViewAction => ({
type: 'delete_view',
viewId: flatView.id,
});
@@ -1,19 +0,0 @@
import { type FlatViewField } from 'src/engine/core-modules/view/flat-view/types/flat-view-field.type';
import {
type CreateViewFieldAction,
type DeleteViewFieldAction,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type';
export const getWorkspaceMigrationV2ViewFieldCreateAction = (
flatViewField: FlatViewField,
): CreateViewFieldAction => ({
type: 'create_view_field',
viewField: flatViewField,
});
export const getWorkspaceMigrationV2ViewFieldDeleteAction = (
flatViewField: FlatViewField,
): DeleteViewFieldAction => ({
type: 'delete_view_field',
viewFieldId: flatViewField.id,
});
@@ -0,0 +1,110 @@
import { Injectable } from '@nestjs/common';
import { t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { ServerlessFunctionExceptionCode } from 'src/engine/metadata-modules/serverless-function/serverless-function.exception';
import { FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
export type ServerlessFunctionRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatServerlessFunctionMaps'
>;
type ServerlessFunctionValidationArgs = {
flatServerlessFunctionToValidate: FlatServerlessFunction;
optimisticFlatServerlessFunctionMaps: FlatEntityMaps<FlatServerlessFunction>;
dependencyOptimisticFlatEntityMaps: ServerlessFunctionRelatedFlatEntityMaps;
};
@Injectable()
export class FlatServerlessFunctionValidatorService {
constructor() {}
public validateFlatServerlessFunctionUpdate({
flatServerlessFunctionToValidate: updatedFlatServerlessFunction,
optimisticFlatServerlessFunctionMaps,
}: ServerlessFunctionValidationArgs): FailedFlatEntityValidation<FlatServerlessFunction> {
const errors = [];
const existingFlatServerlessFunction =
optimisticFlatServerlessFunctionMaps.byId[
updatedFlatServerlessFunction.id
];
if (!isDefined(existingFlatServerlessFunction)) {
errors.push({
code: ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: t`Serverless function not found`,
});
}
return {
type: 'update_serverless_function',
errors,
flatEntityMinimalInformation: {
id: updatedFlatServerlessFunction.id,
},
};
}
public validateFlatServerlessFunctionDeletion({
flatServerlessFunctionToValidate: { id: serverlessFunctionIdToDelete },
optimisticFlatServerlessFunctionMaps,
}: ServerlessFunctionValidationArgs): FailedFlatEntityValidation<FlatServerlessFunction> {
const errors = [];
const existingFlatServerlessFunction =
optimisticFlatServerlessFunctionMaps.byId[serverlessFunctionIdToDelete];
if (!isDefined(existingFlatServerlessFunction)) {
errors.push({
code: ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: t`Serverless function not found`,
});
}
return {
type: 'delete_serverless_function',
errors,
flatEntityMinimalInformation: {
id: serverlessFunctionIdToDelete,
},
};
}
public async validateFlatServerlessFunctionCreation({
flatServerlessFunctionToValidate,
optimisticFlatServerlessFunctionMaps,
}: ServerlessFunctionValidationArgs): Promise<
FailedFlatEntityValidation<FlatServerlessFunction>
> {
const errors = [];
if (
isDefined(
optimisticFlatServerlessFunctionMaps.byId[
flatServerlessFunctionToValidate.id
],
)
) {
errors.push({
code: ServerlessFunctionExceptionCode.SERVERLESS_FUNCTION_ALREADY_EXIST,
message: t`Serverless function with same id already exists`,
userFriendlyMessage: t`Serverless function already exists`,
});
}
return {
type: 'create_serverless_function',
errors,
flatEntityMinimalInformation: {
id: flatServerlessFunctionToValidate.id,
},
};
}
}
@@ -7,9 +7,11 @@ import { FlatObjectMetadataValidatorService } from 'src/engine/metadata-modules/
import { WorkspaceMigrationV2FieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/services/workspace-migration-v2-field-actions-builder.service';
import { WorkspaceMigrationV2IndexActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/index/workspace-migration-v2-index-actions-builder.service';
import { WorkspaceMigrationV2ObjectActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/services/workspace-migration-v2-object-actions-builder.service';
import { WorkspaceMigrationV2ServerlessFunctionActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/workspace-migration-v2-serverless-function-actions-builder.service';
import { WorkspaceMigrationV2ViewFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service';
import { WorkspaceMigrationV2ViewActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service';
import { WorkspaceMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service';
import { FlatServerlessFunctionValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-serverless-function-validator.service';
import { FlatViewFieldValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-field-validator.service';
import { FlatViewValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-validator.service';
import { WorkspaceMigrationBuilderValidatorsModule } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/workspace-migration-builder-validators.module';
@@ -26,16 +28,17 @@ import { WorkspaceMigrationBuilderValidatorsModule } from 'src/engine/workspace-
WorkspaceMigrationV2ViewActionsBuilderService,
WorkspaceMigrationV2ViewFieldActionsBuilderService,
WorkspaceMigrationV2IndexActionsBuilderService,
WorkspaceMigrationV2ServerlessFunctionActionsBuilderService,
FlatViewValidatorService,
FlatViewFieldValidatorService,
FlatServerlessFunctionValidatorService,
],
exports: [
WorkspaceMigrationBuilderV2Service,
WorkspaceMigrationV2ViewActionsBuilderService,
WorkspaceMigrationV2IndexActionsBuilderService,
FlatViewValidatorService,
WorkspaceMigrationV2ViewFieldActionsBuilderService,
FlatViewFieldValidatorService,
WorkspaceMigrationV2ServerlessFunctionActionsBuilderService,
],
})
export class WorkspaceMigrationBuilderV2Module {}
@@ -0,0 +1,62 @@
import { Injectable } from '@nestjs/common';
import {
OptimisticallyApplyActionOnAllFlatEntityMapsArgs,
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { CreateServerlessFunctionAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-serverless-function-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
export class CreateServerlessFunctionActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
'create_serverless_function',
) {
constructor() {
super();
}
optimisticallyApplyActionOnAllFlatEntityMaps({
action,
allFlatEntityMaps,
}: OptimisticallyApplyActionOnAllFlatEntityMapsArgs<CreateServerlessFunctionAction>): Partial<AllFlatEntityMaps> {
const { flatServerlessFunctionMaps } = allFlatEntityMaps;
const { serverlessFunction } = action;
const updatedFlatServerlessFunctionMaps =
addFlatEntityToFlatEntityMapsOrThrow({
flatEntity: serverlessFunction,
flatEntityMaps: flatServerlessFunctionMaps,
});
return {
flatServerlessFunctionMaps: updatedFlatServerlessFunctionMaps,
};
}
async executeForMetadata(
context: WorkspaceMigrationActionRunnerArgs<CreateServerlessFunctionAction>,
): Promise<void> {
const { action, queryRunner, workspaceId } = context;
const { serverlessFunction } = action;
const serverlessFunctionRepository =
queryRunner.manager.getRepository<ServerlessFunctionEntity>(
ServerlessFunctionEntity,
);
await serverlessFunctionRepository.insert({
...serverlessFunction,
workspaceId,
});
}
async executeForWorkspaceSchema(
_context: WorkspaceMigrationActionRunnerArgs<CreateServerlessFunctionAction>,
): Promise<void> {
return;
}
}
@@ -0,0 +1,62 @@
import { Injectable } from '@nestjs/common';
import {
OptimisticallyApplyActionOnAllFlatEntityMapsArgs,
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { DeleteServerlessFunctionAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-serverless-function-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
export class DeleteServerlessFunctionActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
'delete_serverless_function',
) {
constructor() {
super();
}
optimisticallyApplyActionOnAllFlatEntityMaps({
action,
allFlatEntityMaps,
}: OptimisticallyApplyActionOnAllFlatEntityMapsArgs<DeleteServerlessFunctionAction>): Partial<AllFlatEntityMaps> {
const { flatServerlessFunctionMaps } = allFlatEntityMaps;
const { serverlessFunctionId } = action;
const updatedFlatServerlessFunctionMaps =
deleteFlatEntityFromFlatEntityMapsOrThrow({
entityToDeleteId: serverlessFunctionId,
flatEntityMaps: flatServerlessFunctionMaps,
});
return {
flatServerlessFunctionMaps: updatedFlatServerlessFunctionMaps,
};
}
async executeForMetadata(
context: WorkspaceMigrationActionRunnerArgs<DeleteServerlessFunctionAction>,
): Promise<void> {
const { action, queryRunner, workspaceId } = context;
const { serverlessFunctionId } = action;
const serverlessFunctionRepository =
queryRunner.manager.getRepository<ServerlessFunctionEntity>(
ServerlessFunctionEntity,
);
await serverlessFunctionRepository.delete({
id: serverlessFunctionId,
workspaceId,
});
}
async executeForWorkspaceSchema(
_context: WorkspaceMigrationActionRunnerArgs<DeleteServerlessFunctionAction>,
): Promise<void> {
return;
}
}
@@ -0,0 +1,75 @@
import { Injectable } from '@nestjs/common';
import {
OptimisticallyApplyActionOnAllFlatEntityMapsArgs,
WorkspaceMigrationRunnerActionHandler,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity';
import { UpdateServerlessFunctionAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-serverless-function-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util';
@Injectable()
export class UpdateServerlessFunctionActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
'update_serverless_function',
) {
constructor() {
super();
}
optimisticallyApplyActionOnAllFlatEntityMaps({
action,
allFlatEntityMaps,
}: OptimisticallyApplyActionOnAllFlatEntityMapsArgs<UpdateServerlessFunctionAction>): Partial<AllFlatEntityMaps> {
const { flatServerlessFunctionMaps } = allFlatEntityMaps;
const { serverlessFunctionId } = action;
const existingServerlessFunction =
findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: serverlessFunctionId,
flatEntityMaps: flatServerlessFunctionMaps,
});
const updatedServerlessFunction = {
...existingServerlessFunction,
...fromWorkspaceMigrationUpdateActionToPartialEntity(action),
};
const updatedFlatServerlessFunctionMaps =
replaceFlatEntityInFlatEntityMapsOrThrow({
flatEntity: updatedServerlessFunction,
flatEntityMaps: flatServerlessFunctionMaps,
});
return {
flatServerlessFunctionMaps: updatedFlatServerlessFunctionMaps,
};
}
async executeForMetadata(
context: WorkspaceMigrationActionRunnerArgs<UpdateServerlessFunctionAction>,
): Promise<void> {
const { action, queryRunner } = context;
const { serverlessFunctionId } = action;
const serverlessFunctionRepository =
queryRunner.manager.getRepository<ServerlessFunctionEntity>(
ServerlessFunctionEntity,
);
await serverlessFunctionRepository.update(
serverlessFunctionId,
fromWorkspaceMigrationUpdateActionToPartialEntity(action),
);
}
async executeForWorkspaceSchema(
_context: WorkspaceMigrationActionRunnerArgs<UpdateServerlessFunctionAction>,
): Promise<void> {
return;
}
}
@@ -9,6 +9,9 @@ import { DeleteIndexActionHandlerService } from 'src/engine/workspace-manager/wo
import { CreateObjectActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/object/services/create-object-action-handler.service';
import { DeleteObjectActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/object/services/delete-object-action-handler.service';
import { UpdateObjectActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/object/services/update-object-action-handler.service';
import { CreateServerlessFunctionActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/serverless-function/services/create-serverless-function-action-handler.service';
import { DeleteServerlessFunctionActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/serverless-function/services/delete-serverless-function-action-handler.service';
import { UpdateServerlessFunctionActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/serverless-function/services/update-serverless-function-action-handler.service';
import { CreateViewFieldActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-field/services/create-view-field-action-handler.service';
import { DeleteViewFieldActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-field/services/delete-view-field-action-handler.service';
import { UpdateViewFieldActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-field/services/update-view-field-action-handler.service';
@@ -37,6 +40,10 @@ import { UpdateViewActionHandlerService } from 'src/engine/workspace-manager/wor
CreateViewFieldActionHandlerService,
UpdateViewFieldActionHandlerService,
DeleteViewFieldActionHandlerService,
CreateServerlessFunctionActionHandlerService,
DeleteServerlessFunctionActionHandlerService,
UpdateServerlessFunctionActionHandlerService,
],
})
export class WorkspaceSchemaMigrationRunnerActionHandlersModule {}
@@ -1,14 +1,5 @@
import { type UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { type UpdateObjectAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { type UpdateViewAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type';
import { type UpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type';
export const fromWorkspaceMigrationUpdateActionToPartialEntity = <
T extends
| UpdateFieldAction
| UpdateObjectAction
| UpdateViewAction
| UpdateViewFieldAction,
T extends { updates: Array<{ property: string; to: unknown }> },
>(
action: T,
) => {
@@ -10,6 +10,10 @@ import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queu
import { ServerlessFunctionService } from 'src/engine/metadata-modules/serverless-function/serverless-function.service';
import { type WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
import {
WorkflowVersionStepException,
WorkflowVersionStepExceptionCode,
} from 'src/modules/workflow/common/exceptions/workflow-version-step.exception';
import {
WorkflowVersionStatus,
type WorkflowVersionWorkspaceEntity,
@@ -178,6 +182,13 @@ export class WorkflowStatusesUpdateJob {
const newStepSettings = { ...step.settings };
if (!isDefined(serverlessFunction.latestVersion)) {
throw new WorkflowVersionStepException(
`Fail to publish serverless function ${serverlessFunction.id}. Latest version is null`,
WorkflowVersionStepExceptionCode.CODE_STEP_FAILURE,
);
}
newStepSettings.input.serverlessFunctionVersion =
serverlessFunction.latestVersion;
@@ -7,6 +7,7 @@ exports[`View Field Resolver - Failing Create Operation - v2 should fail to crea
"errors": {
"index": [],
"objectMetadata": [],
"serverlessFunction": [],
"view": [],
"viewField": [
{
@@ -31,6 +32,7 @@ exports[`View Field Resolver - Failing Create Operation - v2 should fail to crea
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -49,6 +51,7 @@ exports[`View Field Resolver - Failing Create Operation - v2 should fail to crea
"errors": {
"index": [],
"objectMetadata": [],
"serverlessFunction": [],
"view": [],
"viewField": [
{
@@ -73,6 +76,7 @@ exports[`View Field Resolver - Failing Create Operation - v2 should fail to crea
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -25,6 +25,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -32,6 +33,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -69,6 +71,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -76,6 +79,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -112,6 +116,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -119,6 +124,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -170,6 +176,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -177,6 +184,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -228,6 +236,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -235,6 +244,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -286,6 +296,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -293,6 +304,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -344,6 +356,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -351,6 +364,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -387,6 +401,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -394,6 +409,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -431,6 +447,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -438,6 +455,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -479,6 +497,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -486,6 +505,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -522,6 +542,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -529,6 +550,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -566,6 +588,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -573,6 +596,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -609,6 +633,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -616,6 +641,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -667,6 +693,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -674,6 +701,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -710,6 +738,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -717,6 +746,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -753,6 +783,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -760,6 +791,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -797,6 +829,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -804,6 +837,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -841,6 +875,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -848,6 +883,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -884,6 +920,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -891,6 +928,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -928,6 +966,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -935,6 +974,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -971,6 +1011,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -978,6 +1019,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1019,6 +1061,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1026,6 +1069,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1062,6 +1106,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1069,6 +1114,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1106,6 +1152,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1113,6 +1160,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1149,6 +1197,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1156,6 +1205,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1197,6 +1247,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1204,6 +1255,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1240,6 +1292,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1247,6 +1300,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1284,6 +1338,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1291,6 +1346,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1327,6 +1383,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1334,6 +1391,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1375,6 +1433,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1382,6 +1441,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1418,6 +1478,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1425,6 +1486,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1461,6 +1523,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1468,6 +1531,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1509,6 +1573,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1516,6 +1581,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1552,6 +1618,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1559,6 +1626,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1595,6 +1663,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1602,6 +1671,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1639,6 +1709,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1646,6 +1717,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1682,6 +1754,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1689,6 +1762,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1730,6 +1804,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1737,6 +1812,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1773,6 +1849,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1780,6 +1857,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1816,6 +1894,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1823,6 +1902,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1874,6 +1954,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1881,6 +1962,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1932,6 +2014,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1939,6 +2022,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1990,6 +2074,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1997,6 +2082,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2048,6 +2134,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2055,6 +2142,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2092,6 +2180,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2099,6 +2188,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2140,6 +2230,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2147,6 +2238,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2183,6 +2275,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2190,6 +2283,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2227,6 +2321,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2234,6 +2329,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2270,6 +2366,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2277,6 +2374,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2313,6 +2411,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2320,6 +2419,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2356,6 +2456,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2363,6 +2464,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2400,6 +2502,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2407,6 +2510,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2443,6 +2547,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2450,6 +2555,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2487,6 +2593,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2494,6 +2601,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2530,6 +2638,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2537,6 +2646,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2578,6 +2688,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2585,6 +2696,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2621,6 +2733,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2628,6 +2741,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2665,6 +2779,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2672,6 +2787,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2708,6 +2824,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2715,6 +2832,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2756,6 +2874,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2763,6 +2882,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2799,6 +2919,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2806,6 +2927,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2843,6 +2965,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2850,6 +2973,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2886,6 +3010,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2893,6 +3018,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2934,6 +3060,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2941,6 +3068,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2977,6 +3105,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2984,6 +3113,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -3020,6 +3150,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -3027,6 +3158,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -3068,6 +3200,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -3075,6 +3208,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -3111,6 +3245,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -3118,6 +3253,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -3154,6 +3290,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -3161,6 +3298,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -3198,6 +3336,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -3205,6 +3344,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -25,6 +25,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -32,6 +33,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -69,6 +71,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -76,6 +79,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -112,6 +116,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -119,6 +124,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -170,6 +176,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -177,6 +184,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -228,6 +236,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -235,6 +244,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -286,6 +296,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -293,6 +304,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -344,6 +356,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -351,6 +364,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -387,6 +401,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -394,6 +409,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -431,6 +447,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -438,6 +455,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -479,6 +497,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -486,6 +505,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -522,6 +542,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -529,6 +550,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -566,6 +588,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -573,6 +596,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -609,6 +633,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -616,6 +641,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -667,6 +693,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -674,6 +701,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -710,6 +738,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -717,6 +746,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -753,6 +783,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -760,6 +791,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -797,6 +829,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -804,6 +837,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -841,6 +875,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -848,6 +883,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -884,6 +920,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -891,6 +928,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -928,6 +966,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -935,6 +974,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -971,6 +1011,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -978,6 +1019,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1019,6 +1061,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1026,6 +1069,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1062,6 +1106,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1069,6 +1114,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1105,6 +1151,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1112,6 +1159,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1153,6 +1201,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1160,6 +1209,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1196,6 +1246,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1203,6 +1254,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1240,6 +1292,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1247,6 +1300,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1283,6 +1337,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1290,6 +1345,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1331,6 +1387,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1338,6 +1395,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1374,6 +1432,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1381,6 +1440,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1417,6 +1477,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1424,6 +1485,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1465,6 +1527,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1472,6 +1535,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1508,6 +1572,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1515,6 +1580,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1551,6 +1617,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1558,6 +1625,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1594,6 +1662,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1601,6 +1670,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1637,6 +1707,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1644,6 +1715,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1685,6 +1757,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1692,6 +1765,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1728,6 +1802,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1735,6 +1810,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1771,6 +1847,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1778,6 +1855,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1829,6 +1907,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1836,6 +1915,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1887,6 +1967,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1894,6 +1975,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1945,6 +2027,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -1952,6 +2035,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2003,6 +2087,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2010,6 +2095,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2047,6 +2133,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2054,6 +2141,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2095,6 +2183,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2102,6 +2191,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2138,6 +2228,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2145,6 +2236,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2182,6 +2274,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2189,6 +2282,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2225,6 +2319,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2232,6 +2327,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2268,6 +2364,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2275,6 +2372,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2311,6 +2409,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2318,6 +2417,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2355,6 +2455,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2362,6 +2463,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2398,6 +2500,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2405,6 +2508,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2442,6 +2546,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2449,6 +2554,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2485,6 +2591,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2492,6 +2599,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2533,6 +2641,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2540,6 +2649,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2576,6 +2686,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2583,6 +2694,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2619,6 +2731,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2626,6 +2739,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2667,6 +2781,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2674,6 +2789,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2710,6 +2826,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2717,6 +2834,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2754,6 +2872,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2761,6 +2880,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2797,6 +2917,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2804,6 +2925,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2845,6 +2967,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2852,6 +2975,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2888,6 +3012,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2895,6 +3020,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2931,6 +3057,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2938,6 +3065,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2979,6 +3107,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -2986,6 +3115,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -3022,6 +3152,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -3029,6 +3160,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -3065,6 +3197,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -3072,6 +3205,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -3108,6 +3242,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"type": "update_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -3115,6 +3250,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -71,6 +71,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -78,6 +79,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -113,6 +115,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -120,6 +123,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -150,6 +154,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -157,6 +162,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -187,6 +193,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -194,6 +201,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -251,6 +259,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -258,6 +267,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -309,6 +319,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -316,6 +327,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -367,6 +379,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -374,6 +387,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -431,6 +445,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -438,6 +453,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -476,6 +492,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -483,6 +500,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -521,6 +539,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -528,6 +547,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -565,6 +585,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -572,6 +593,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -602,6 +624,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -609,6 +632,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -639,6 +663,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -646,6 +671,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -676,6 +702,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -683,6 +710,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -716,6 +744,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -723,6 +752,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -754,6 +784,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -761,6 +792,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -791,6 +823,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [],
"viewField": [],
},
@@ -798,6 +831,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -44,6 +44,7 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -298,6 +299,7 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -353,6 +355,7 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -607,6 +610,7 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -662,6 +666,7 @@ exports[`Object metadata creation should fail v2 when labelPlural is empty 1`] =
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -916,6 +921,7 @@ exports[`Object metadata creation should fail v2 when labelPlural is empty 1`] =
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -971,6 +977,7 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -1225,6 +1232,7 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1280,6 +1288,7 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -1534,6 +1543,7 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1589,6 +1599,7 @@ exports[`Object metadata creation should fail v2 when labelSingular is empty 1`]
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -1843,6 +1854,7 @@ exports[`Object metadata creation should fail v2 when labelSingular is empty 1`]
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -1899,6 +1911,7 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] =
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -2153,6 +2166,7 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] =
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2209,6 +2223,7 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -2463,6 +2478,7 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2598,6 +2614,7 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -2852,6 +2869,7 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -2907,6 +2925,7 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -3161,6 +3180,7 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -3216,6 +3236,7 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -3470,6 +3491,7 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -3530,6 +3552,7 @@ exports[`Object metadata creation should fail v2 when namePlural is an empty str
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -3784,6 +3807,7 @@ exports[`Object metadata creation should fail v2 when namePlural is an empty str
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -3844,6 +3868,7 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -4098,6 +4123,7 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -4268,6 +4294,7 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -4522,6 +4549,7 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -4692,6 +4720,7 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -4946,6 +4975,7 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -5081,6 +5111,7 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -5335,6 +5366,7 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -5470,6 +5502,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -5724,6 +5757,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -5894,6 +5928,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is an empty s
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -6148,6 +6183,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is an empty s
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -6318,6 +6354,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC
"type": "create_field",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -6572,6 +6609,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -6628,6 +6666,7 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] =
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -6882,6 +6921,7 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] =
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,
@@ -6938,6 +6978,7 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res
"type": "create_object",
},
],
"serverlessFunction": [],
"view": [
{
"errors": [
@@ -7192,6 +7233,7 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res
"summary": {
"invalidIndex": 0,
"invalidObjectMetadata": 0,
"invalidServerlessFunction": 0,
"invalidView": 0,
"invalidViewField": 0,
"totalErrors": 0,