feat: rename tenant into workspace (#2553)

* feat: rename tenant into workspace

* fix: missing some files and reset not working

* fix: wrong import

* Use link in company seeds

* Use link in company seeds

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Jérémy M
2023-11-17 11:26:33 +01:00
committed by GitHub
parent bc579d64a6
commit b86ada6d2b
239 changed files with 1603 additions and 1618 deletions

View File

@ -21,7 +21,7 @@ server
└───health
└───integrations
└───metadata
└───tenant
└───workspace
└───utils
```
@ -51,7 +51,7 @@ Includes a publicly available REST API (healthz) that returns a JSON to confirm
Defines custom objects and makes available a GraphQL API (graphql/metadata).
## Tenant
## Workspace
Generates and serves custom GraphQL schema based on the metadata.

View File

@ -33,7 +33,7 @@
"database:truncate": "npx ts-node ./scripts/truncate-db.ts",
"database:migrate": "yarn typeorm:migrate && yarn prisma:migrate",
"database:generate": "yarn prisma:generate",
"database:seed": "yarn prisma:seed && yarn build && yarn command tenant:seed",
"database:seed": "yarn prisma:seed && yarn build && yarn command workspace:seed",
"database:reset": "yarn database:truncate && yarn database:init",
"command": "node dist/src/command"
},

View File

@ -16,13 +16,13 @@ import { IntegrationsModule } from './integrations/integrations.module';
import { PrismaModule } from './database/prisma.module';
import { HealthModule } from './health/health.module';
import { AbilityModule } from './ability/ability.module';
import { TenantModule } from './tenant/tenant.module';
import { WorkspaceModule } from './workspace/workspace.module';
import { EnvironmentService } from './integrations/environment/environment.service';
import {
JwtAuthStrategy,
JwtPayload,
} from './core/auth/strategies/jwt.auth.strategy';
import { TenantService } from './tenant/tenant.service';
import { WorkspaceFactory } from './workspace/workspace.factory';
import { ExceptionFilter } from './filters/exception.filter';
@Module({
@ -73,15 +73,15 @@ import { ExceptionFilter } from './filters/exception.filter';
AppModule.moduleRef.registerRequestByContextId(request, contextId);
// Get the SchemaGenerationService from the AppModule
const tenantService = await AppModule.moduleRef.resolve(
TenantService,
const workspaceFactory = await AppModule.moduleRef.resolve(
WorkspaceFactory,
contextId,
{
strict: false,
},
);
return await tenantService.createTenantSchema(workspace.id);
return await workspaceFactory.createGraphQLSchema(workspace.id);
} catch (error) {
if (error instanceof JsonWebTokenError) {
//mockedUserJWT
@ -109,7 +109,7 @@ import { ExceptionFilter } from './filters/exception.filter';
AbilityModule,
IntegrationsModule,
CoreModule,
TenantModule,
WorkspaceModule,
],
providers: [
AppService,

View File

@ -4,14 +4,14 @@ import { DatabaseCommandModule } from 'src/database/commands/database-command.mo
import { AppModule } from './app.module';
import { TenantManagerCommandsModule } from './tenant-manager/commands/tenant-manager-commands.module';
import { TenantMigrationRunnerCommandsModule } from './tenant-migration-runner/commands/tenant-migration-runner-commands.module';
import { WorkspaceManagerCommandsModule } from './workspace/workspace-manager/commands/workspace-manager-commands.module';
import { WorkspaceMigrationRunnerCommandsModule } from './workspace/workspace-migration-runner/commands/workspace-migration-runner-commands.module';
@Module({
imports: [
AppModule,
TenantMigrationRunnerCommandsModule,
TenantManagerCommandsModule,
WorkspaceMigrationRunnerCommandsModule,
WorkspaceManagerCommandsModule,
DatabaseCommandModule,
],
})

View File

@ -7,7 +7,7 @@ import { PipelineStageService } from 'src/core/pipeline/services/pipeline-stage.
import { PersonService } from 'src/core/person/person.service';
import { CompanyService } from 'src/core/company/company.service';
import { PipelineProgressService } from 'src/core/pipeline/services/pipeline-progress.service';
import { TenantManagerService } from 'src/tenant-manager/tenant-manager.service';
import { WorkspaceManagerService } from 'src/workspace/workspace-manager/workspace-manager.service';
import { WorkspaceService } from './workspace.service';
@ -43,7 +43,7 @@ describe('WorkspaceService', () => {
useValue: {},
},
{
provide: TenantManagerService,
provide: WorkspaceManagerService,
useValue: {},
},
],

View File

@ -10,7 +10,7 @@ import { PipelineStageService } from 'src/core/pipeline/services/pipeline-stage.
import { PipelineService } from 'src/core/pipeline/services/pipeline.service';
import { PrismaService } from 'src/database/prisma.service';
import { assert } from 'src/utils/assert';
import { TenantManagerService } from 'src/tenant-manager/tenant-manager.service';
import { WorkspaceManagerService } from 'src/workspace/workspace-manager/workspace-manager.service';
@Injectable()
export class WorkspaceService {
@ -21,7 +21,7 @@ export class WorkspaceService {
private readonly personService: PersonService,
private readonly pipelineStageService: PipelineStageService,
private readonly pipelineProgressService: PipelineProgressService,
private readonly tenantManagerService: TenantManagerService,
private readonly workspaceManagerService: WorkspaceManagerService,
) {}
// Find
@ -64,7 +64,7 @@ export class WorkspaceService {
});
// Create workspace schema
await this.tenantManagerService.init(workspace.id);
await this.workspaceManagerService.init(workspace.id);
// Create default companies
const companies = await this.companyService.createDefaultCompanies({
@ -161,7 +161,7 @@ export class WorkspaceService {
this.delete({ where: { id: workspaceId } }),
]);
await this.tenantManagerService.delete(workspaceId);
await this.workspaceManagerService.delete(workspaceId);
return workspace;
}

View File

@ -4,7 +4,7 @@ import { FileUploadService } from 'src/core/file/services/file-upload.service';
import { PipelineModule } from 'src/core/pipeline/pipeline.module';
import { CompanyModule } from 'src/core/company/company.module';
import { PersonModule } from 'src/core/person/person.module';
import { TenantManagerModule } from 'src/tenant-manager/tenant-manager.module';
import { WorkspaceManagerModule } from 'src/workspace/workspace-manager/workspace-manager.module';
import { AbilityModule } from 'src/ability/ability.module';
import { PrismaModule } from 'src/database/prisma.module';
@ -19,7 +19,7 @@ import { WorkspaceResolver } from './resolvers/workspace.resolver';
PipelineModule,
CompanyModule,
PersonModule,
TenantManagerModule,
WorkspaceManagerModule,
PrismaModule,
],
providers: [

View File

@ -1,30 +1,30 @@
import { Command, CommandRunner } from 'nest-commander';
import { DataSourceService } from 'src/metadata/data-source/data-source.service';
import { TenantMigrationService } from 'src/metadata/tenant-migration/tenant-migration.service';
import { TenantMigrationRunnerService } from 'src/tenant-migration-runner/tenant-migration-runner.service';
import { seedCompanies } from 'src/database/typeorm-seeds/tenant/companies';
import { seedViewFields } from 'src/database/typeorm-seeds/tenant/view-fields';
import { seedViews } from 'src/database/typeorm-seeds/tenant/views';
import { WorkspaceMigrationService } from 'src/metadata/workspace-migration/workspace-migration.service';
import { WorkspaceMigrationRunnerService } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.service';
import { seedCompanies } from 'src/database/typeorm-seeds/workspace/companies';
import { seedViewFields } from 'src/database/typeorm-seeds/workspace/view-fields';
import { seedViews } from 'src/database/typeorm-seeds/workspace/views';
import { TypeORMService } from 'src/database/typeorm/typeorm.service';
import { seedMetadataSchema } from 'src/database/typeorm-seeds/metadata';
import { seedWorkspaceMember } from 'src/database/typeorm-seeds/tenant/workspaceMember';
import { seedPeople } from 'src/database/typeorm-seeds/tenant/people';
import { seedWorkspaceMember } from 'src/database/typeorm-seeds/workspace/workspaceMember';
import { seedPeople } from 'src/database/typeorm-seeds/workspace/people';
// TODO: implement dry-run
@Command({
name: 'tenant:seed',
name: 'workspace:seed',
description:
'Seed tenant with initial data. This command is intended for development only.',
'Seed workspace with initial data. This command is intended for development only.',
})
export class DataSeedTenantCommand extends CommandRunner {
export class DataSeedWorkspaceCommand extends CommandRunner {
workspaceId = '20202020-1c25-4d02-bf25-6aeccf7ea419';
constructor(
private readonly dataSourceService: DataSourceService,
private readonly typeORMService: TypeORMService,
private readonly tenantMigrationService: TenantMigrationService,
private readonly migrationRunnerService: TenantMigrationRunnerService,
private readonly workspaceMigrationService: WorkspaceMigrationService,
private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService,
) {
super();
}
@ -46,10 +46,10 @@ export class DataSeedTenantCommand extends CommandRunner {
try {
await seedMetadataSchema(workspaceDataSource, 'metadata');
await this.tenantMigrationService.insertStandardMigrations(
await this.workspaceMigrationService.insertStandardMigrations(
this.workspaceId,
);
await this.migrationRunnerService.executeMigrationFromPendingMigrations(
await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations(
this.workspaceId,
);

View File

@ -6,30 +6,29 @@ import { PipelineModule } from 'src/core/pipeline/pipeline.module';
import { CompanyModule } from 'src/core/company/company.module';
import { PersonModule } from 'src/core/person/person.module';
import { PrismaModule } from 'src/database/prisma.module';
import { TenantManagerModule } from 'src/tenant-manager/tenant-manager.module';
import { WorkspaceManagerModule } from 'src/workspace/workspace-manager/workspace-manager.module';
import { DataSourceModule } from 'src/metadata/data-source/data-source.module';
import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module';
import { TenantMigrationRunnerModule } from 'src/tenant-migration-runner/tenant-migration-runner.module';
import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module';
import { WorkspaceMigrationRunnerModule } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.module';
import { TypeORMModule } from 'src/database/typeorm/typeorm.module';
import { WorkspaceModule } from 'src/core/workspace/workspace.module';
import { DataSeedTenantCommand } from './data-seed-tenant.command';
import { DataSeedWorkspaceCommand } from 'src/database/commands/data-seed-workspace.command';
@Module({
imports: [
PipelineModule,
CompanyModule,
PersonModule,
TenantManagerModule,
WorkspaceManagerModule,
PrismaModule,
DataSourceModule,
TypeORMModule,
TenantMigrationModule,
TenantMigrationRunnerModule,
WorkspaceMigrationModule,
WorkspaceMigrationRunnerModule,
WorkspaceModule,
],
providers: [
DataSeedTenantCommand,
DataSeedWorkspaceCommand,
DataCleanInactiveCommand,
ConfirmationQuestion,
],

View File

@ -192,11 +192,12 @@ export const seedCompanyFieldMetadata = async (
isCustom: false,
workspaceId: SeedWorkspaceId,
isActive: true,
type: FieldMetadataType.TEXT,
name: 'linkedinUrl',
type: FieldMetadataType.LINK,
name: 'linkedinLink',
label: 'Linkedin',
targetColumnMap: {
value: 'linkedinUrl',
label: 'linkedinLinkLabel',
url: 'linkedinLinkUrl',
},
description: 'The company Linkedin account',
icon: 'IconBrandLinkedin',
@ -210,11 +211,12 @@ export const seedCompanyFieldMetadata = async (
isCustom: false,
workspaceId: SeedWorkspaceId,
isActive: true,
type: FieldMetadataType.TEXT,
name: 'xUrl',
type: FieldMetadataType.LINK,
name: 'xLink',
label: 'X',
targetColumnMap: {
value: 'xUrl',
label: 'xLinkLabel',
url: 'xLinkUrl',
},
description: 'The company Twitter/X account',
icon: 'IconBrandX',

View File

@ -1,6 +1,6 @@
import { DataSource } from 'typeorm';
import { SeedViewIds } from 'src/database/typeorm-seeds/tenant/views';
import { SeedViewIds } from 'src/database/typeorm-seeds/workspace/views';
import { SeedCompanyFieldMetadataIds } from 'src/database/typeorm-seeds/metadata/field-metadata/company';
const tableName = 'viewField';

View File

@ -20,7 +20,7 @@ export class SetupMetadataTables1700140427984 implements MigrationInterface {
`CREATE TABLE "metadata"."dataSource" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "url" character varying, "schema" character varying, "type" "metadata"."dataSource_type_enum" NOT NULL DEFAULT 'postgres', "label" character varying, "isRemote" boolean NOT NULL DEFAULT false, "workspaceId" character varying NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_6d01ae6c0f47baf4f8e37342268" PRIMARY KEY ("id"))`,
);
await queryRunner.query(
`CREATE TABLE "metadata"."tenantMigration" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "migrations" jsonb, "name" character varying, "isCustom" boolean NOT NULL DEFAULT false, "appliedAt" TIMESTAMP, "workspaceId" character varying NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_f9b06eb42494795f73acb5c2350" PRIMARY KEY ("id"))`,
`CREATE TABLE "metadata"."workspaceMigration" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "migrations" jsonb, "name" character varying, "isCustom" boolean NOT NULL DEFAULT false, "appliedAt" TIMESTAMP, "workspaceId" character varying NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_f9b06eb42494795f73acb5c2350" PRIMARY KEY ("id"))`,
);
await queryRunner.query(
`ALTER TABLE "metadata"."relationMetadata" ADD CONSTRAINT "FK_f2a0acd3a548ee446a1a35df44d" FOREIGN KEY ("fromObjectMetadataId") REFERENCES "metadata"."objectMetadata"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`,
@ -61,7 +61,7 @@ export class SetupMetadataTables1700140427984 implements MigrationInterface {
await queryRunner.query(
`ALTER TABLE "metadata"."relationMetadata" DROP CONSTRAINT "FK_f2a0acd3a548ee446a1a35df44d"`,
);
await queryRunner.query(`DROP TABLE "metadata"."tenantMigration"`);
await queryRunner.query(`DROP TABLE "metadata"."workspaceMigration"`);
await queryRunner.query(`DROP TABLE "metadata"."dataSource"`);
await queryRunner.query(`DROP TYPE "metadata"."dataSource_type_enum"`);
await queryRunner.query(`DROP TABLE "metadata"."objectMetadata"`);

View File

@ -10,7 +10,7 @@ import {
UpdateDateColumn,
} from 'typeorm';
import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface';
import { FieldMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/field-metadata.interface';
import { FieldMetadataTargetColumnMap } from 'src/metadata/field-metadata/interfaces/field-metadata-target-column-map.interface';
import { FieldMetadataDefaultValue } from 'src/metadata/field-metadata/interfaces/field-metadata-default-value.interface';

View File

@ -7,8 +7,8 @@ import {
import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm';
import { SortDirection } from '@ptc-org/nestjs-query-core';
import { TenantMigrationRunnerModule } from 'src/tenant-migration-runner/tenant-migration-runner.module';
import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module';
import { WorkspaceMigrationRunnerModule } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.module';
import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module';
import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module';
import { JwtAuthGuard } from 'src/guards/jwt.auth.guard';
@ -24,8 +24,8 @@ import { UpdateFieldInput } from './dtos/update-field.input';
NestjsQueryGraphQLModule.forFeature({
imports: [
NestjsQueryTypeOrmModule.forFeature([FieldMetadataEntity], 'metadata'),
TenantMigrationModule,
TenantMigrationRunnerModule,
WorkspaceMigrationModule,
WorkspaceMigrationRunnerModule,
ObjectMetadataModule,
],
services: [FieldMetadataService],

View File

@ -10,12 +10,12 @@ import { Repository } from 'typeorm';
import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm';
import { DeleteOneOptions } from '@ptc-org/nestjs-query-core';
import { TenantMigrationRunnerService } from 'src/tenant-migration-runner/tenant-migration-runner.service';
import { TenantMigrationService } from 'src/metadata/tenant-migration/tenant-migration.service';
import { WorkspaceMigrationRunnerService } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.service';
import { WorkspaceMigrationService } from 'src/metadata/workspace-migration/workspace-migration.service';
import { ObjectMetadataService } from 'src/metadata/object-metadata/object-metadata.service';
import { FieldMetadataDTO } from 'src/metadata/field-metadata/dtos/field-metadata.dto';
import { CreateFieldInput } from 'src/metadata/field-metadata/dtos/create-field.input';
import { TenantMigrationTableAction } from 'src/metadata/tenant-migration/tenant-migration.entity';
import { WorkspaceMigrationTableAction } from 'src/metadata/workspace-migration/workspace-migration.entity';
import { generateTargetColumnMap } from 'src/metadata/field-metadata/utils/generate-target-column-map.util';
import { convertFieldMetadataToColumnActions } from 'src/metadata/field-metadata/utils/convert-field-metadata-to-column-action.util';
@ -28,8 +28,8 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadataEntit
private readonly fieldMetadataRepository: Repository<FieldMetadataEntity>,
private readonly objectMetadataService: ObjectMetadataService,
private readonly tenantMigrationService: TenantMigrationService,
private readonly migrationRunnerService: TenantMigrationRunnerService,
private readonly workspaceMigrationService: WorkspaceMigrationService,
private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService,
) {
super(fieldMetadataRepository);
}
@ -90,18 +90,18 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadataEntit
isCustom: true,
});
await this.tenantMigrationService.createCustomMigration(
await this.workspaceMigrationService.createCustomMigration(
record.workspaceId,
[
{
name: objectMetadata.targetTableName,
action: 'alter',
columns: convertFieldMetadataToColumnActions(createdFieldMetadata),
} satisfies TenantMigrationTableAction,
} satisfies WorkspaceMigrationTableAction,
],
);
await this.migrationRunnerService.executeMigrationFromPendingMigrations(
await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations(
record.workspaceId,
);

View File

@ -5,14 +5,14 @@ import {
FieldMetadataType,
} from 'src/metadata/field-metadata/field-metadata.entity';
import {
TenantMigrationColumnAction,
TenantMigrationColumnActionType,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnAction,
WorkspaceMigrationColumnActionType,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
import { serializeDefaultValue } from 'src/metadata/field-metadata/utils/serialize-default-value';
export function convertFieldMetadataToColumnActions(
fieldMetadata: FieldMetadataEntity,
): TenantMigrationColumnAction[] {
): WorkspaceMigrationColumnAction[] {
switch (fieldMetadata.type) {
case FieldMetadataType.TEXT: {
const defaultValue =
@ -20,7 +20,7 @@ export function convertFieldMetadataToColumnActions(
return [
{
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.value,
columnType: 'text',
defaultValue: serializeDefaultValue(defaultValue?.value),
@ -36,7 +36,7 @@ export function convertFieldMetadataToColumnActions(
return [
{
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.value,
columnType: 'varchar',
defaultValue: serializeDefaultValue(defaultValue?.value),
@ -52,7 +52,7 @@ export function convertFieldMetadataToColumnActions(
return [
{
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.value,
columnType: 'float',
defaultValue: serializeDefaultValue(defaultValue?.value),
@ -65,7 +65,7 @@ export function convertFieldMetadataToColumnActions(
return [
{
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.value,
columnType: 'boolean',
defaultValue: serializeDefaultValue(defaultValue?.value),
@ -78,7 +78,7 @@ export function convertFieldMetadataToColumnActions(
return [
{
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.value,
columnType: 'timestamp',
defaultValue: serializeDefaultValue(defaultValue?.value),
@ -91,13 +91,13 @@ export function convertFieldMetadataToColumnActions(
return [
{
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.label,
columnType: 'varchar',
defaultValue: serializeDefaultValue(defaultValue?.label),
},
{
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.url,
columnType: 'varchar',
defaultValue: serializeDefaultValue(defaultValue?.url),
@ -110,13 +110,13 @@ export function convertFieldMetadataToColumnActions(
return [
{
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.amountMicros,
columnType: 'integer',
defaultValue: serializeDefaultValue(defaultValue?.amountMicros),
},
{
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.currencyCode,
columnType: 'varchar',
defaultValue: serializeDefaultValue(defaultValue?.currencyCode),

View File

@ -4,8 +4,8 @@ import { GraphQLModule } from '@nestjs/graphql';
import { YogaDriverConfig, YogaDriver } from '@graphql-yoga/nestjs';
import GraphQLJSON from 'graphql-type-json';
import { TenantMigrationRunnerModule } from 'src/tenant-migration-runner/tenant-migration-runner.module';
import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module';
import { WorkspaceMigrationRunnerModule } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.module';
import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module';
import { DataSourceModule } from './data-source/data-source.module';
import { FieldMetadataModule } from './field-metadata/field-metadata.module';
@ -25,8 +25,8 @@ import { RelationMetadataModule } from './relation-metadata/relation-metadata.mo
DataSourceModule,
FieldMetadataModule,
ObjectMetadataModule,
TenantMigrationRunnerModule,
TenantMigrationModule,
WorkspaceMigrationRunnerModule,
WorkspaceMigrationModule,
RelationMetadataModule,
],
})

View File

@ -9,7 +9,7 @@ import {
ManyToOne,
} from 'typeorm';
import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface';
import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface';
import { FieldMetadataEntity } from 'src/metadata/field-metadata/field-metadata.entity';
import { RelationMetadataEntity } from 'src/metadata/relation-metadata/relation-metadata.entity';

View File

@ -8,8 +8,8 @@ import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm';
import { SortDirection } from '@ptc-org/nestjs-query-core';
import { DataSourceModule } from 'src/metadata/data-source/data-source.module';
import { TenantMigrationRunnerModule } from 'src/tenant-migration-runner/tenant-migration-runner.module';
import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module';
import { WorkspaceMigrationRunnerModule } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.module';
import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module';
import { JwtAuthGuard } from 'src/guards/jwt.auth.guard';
import { ObjectMetadataService } from './object-metadata.service';
@ -25,8 +25,8 @@ import { ObjectMetadataDTO } from './dtos/object-metadata.dto';
imports: [
NestjsQueryTypeOrmModule.forFeature([ObjectMetadataEntity], 'metadata'),
DataSourceModule,
TenantMigrationModule,
TenantMigrationRunnerModule,
WorkspaceMigrationModule,
WorkspaceMigrationRunnerModule,
],
services: [ObjectMetadataService],
resolvers: [

View File

@ -8,9 +8,9 @@ import { InjectRepository } from '@nestjs/typeorm';
import { Equal, In, Repository } from 'typeorm';
import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm';
import { TenantMigrationService } from 'src/metadata/tenant-migration/tenant-migration.service';
import { TenantMigrationRunnerService } from 'src/tenant-migration-runner/tenant-migration-runner.service';
import { TenantMigrationTableAction } from 'src/metadata/tenant-migration/tenant-migration.entity';
import { WorkspaceMigrationService } from 'src/metadata/workspace-migration/workspace-migration.service';
import { WorkspaceMigrationRunnerService } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.service';
import { WorkspaceMigrationTableAction } from 'src/metadata/workspace-migration/workspace-migration.entity';
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
import { ObjectMetadataEntity } from './object-metadata.entity';
@ -23,8 +23,8 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
@InjectRepository(ObjectMetadataEntity, 'metadata')
private readonly objectMetadataRepository: Repository<ObjectMetadataEntity>,
private readonly tenantMigrationService: TenantMigrationService,
private readonly migrationRunnerService: TenantMigrationRunnerService,
private readonly workspaceMigrationService: WorkspaceMigrationService,
private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService,
) {
super(objectMetadataRepository);
}
@ -61,7 +61,7 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
fields:
// Creating default fields.
// No need to create a custom migration for this though as the default columns are already
// created with default values which is not supported yet by tenant migrations.
// created with default values which is not supported yet by workspace migrations.
[
{
type: FieldMetadataType.UUID,
@ -109,17 +109,17 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
],
});
await this.tenantMigrationService.createCustomMigration(
await this.workspaceMigrationService.createCustomMigration(
createdObjectMetadata.workspaceId,
[
{
name: createdObjectMetadata.targetTableName,
action: 'create',
} satisfies TenantMigrationTableAction,
} satisfies WorkspaceMigrationTableAction,
],
);
await this.migrationRunnerService.executeMigrationFromPendingMigrations(
await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations(
createdObjectMetadata.workspaceId,
);

View File

@ -9,7 +9,7 @@ import {
UpdateDateColumn,
} from 'typeorm';
import { RelationMetadataInterface } from 'src/tenant/schema-builder/interfaces/relation-metadata.interface';
import { RelationMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/relation-metadata.interface';
import { FieldMetadataEntity } from 'src/metadata/field-metadata/field-metadata.entity';
import { ObjectMetadataEntity } from 'src/metadata/object-metadata/object-metadata.entity';

View File

@ -9,8 +9,8 @@ import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm';
import { JwtAuthGuard } from 'src/guards/jwt.auth.guard';
import { FieldMetadataModule } from 'src/metadata/field-metadata/field-metadata.module';
import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module';
import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module';
import { TenantMigrationRunnerModule } from 'src/tenant-migration-runner/tenant-migration-runner.module';
import { WorkspaceMigrationModule } from 'src/metadata/workspace-migration/workspace-migration.module';
import { WorkspaceMigrationRunnerModule } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.module';
import { RelationMetadataService } from './relation-metadata.service';
import { RelationMetadataEntity } from './relation-metadata.entity';
@ -28,8 +28,8 @@ import { RelationMetadataDTO } from './dtos/relation-metadata.dto';
),
ObjectMetadataModule,
FieldMetadataModule,
TenantMigrationRunnerModule,
TenantMigrationModule,
WorkspaceMigrationRunnerModule,
WorkspaceMigrationModule,
],
services: [RelationMetadataService],
resolvers: [

View File

@ -12,10 +12,10 @@ import camelCase from 'lodash.camelcase';
import { ObjectMetadataService } from 'src/metadata/object-metadata/object-metadata.service';
import { FieldMetadataService } from 'src/metadata/field-metadata/field-metadata.service';
import { CreateRelationInput } from 'src/metadata/relation-metadata/dtos/create-relation.input';
import { TenantMigrationRunnerService } from 'src/tenant-migration-runner/tenant-migration-runner.service';
import { TenantMigrationService } from 'src/metadata/tenant-migration/tenant-migration.service';
import { WorkspaceMigrationRunnerService } from 'src/workspace/workspace-migration-runner/workspace-migration-runner.service';
import { WorkspaceMigrationService } from 'src/metadata/workspace-migration/workspace-migration.service';
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
import { TenantMigrationColumnActionType } from 'src/metadata/tenant-migration/tenant-migration.entity';
import { WorkspaceMigrationColumnActionType } from 'src/metadata/workspace-migration/workspace-migration.entity';
import {
RelationMetadataEntity,
@ -29,8 +29,8 @@ export class RelationMetadataService extends TypeOrmQueryService<RelationMetadat
private readonly relationMetadataRepository: Repository<RelationMetadataEntity>,
private readonly objectMetadataService: ObjectMetadataService,
private readonly fieldMetadataService: FieldMetadataService,
private readonly tenantMigrationService: TenantMigrationService,
private readonly migrationRunnerService: TenantMigrationRunnerService,
private readonly workspaceMigrationService: WorkspaceMigrationService,
private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService,
) {
super(relationMetadataRepository);
}
@ -136,7 +136,7 @@ export class RelationMetadataService extends TypeOrmQueryService<RelationMetadat
toFieldMetadataId: createdFieldMap[record.toObjectMetadataId].id,
});
await this.tenantMigrationService.createCustomMigration(
await this.workspaceMigrationService.createCustomMigration(
record.workspaceId,
[
// Create the column
@ -145,7 +145,7 @@ export class RelationMetadataService extends TypeOrmQueryService<RelationMetadat
action: 'alter',
columns: [
{
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
columnName: foreignKeyColumnName,
columnType: 'uuid',
},
@ -157,7 +157,7 @@ export class RelationMetadataService extends TypeOrmQueryService<RelationMetadat
action: 'alter',
columns: [
{
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
columnName: foreignKeyColumnName,
referencedTableName:
objectMetadataMap[record.fromObjectMetadataId].targetTableName,
@ -169,7 +169,7 @@ export class RelationMetadataService extends TypeOrmQueryService<RelationMetadat
],
);
await this.migrationRunnerService.executeMigrationFromPendingMigrations(
await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations(
record.workspaceId,
);

View File

@ -1,62 +0,0 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
export const addCompanyTable: TenantMigrationTableAction[] = [
{
name: 'company',
action: 'create',
},
{
name: 'company',
action: 'alter',
columns: [
{
columnName: 'name',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'domainName',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'address',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'employees',
columnType: 'integer',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'linkedinUrl',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'xUrl',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'annualRecurringRevenue',
columnType: 'float',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'idealCustomerProfile',
columnType: 'boolean',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'accountOwnerId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -1,32 +0,0 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
export const addViewTable: TenantMigrationTableAction[] = [
{
name: 'view',
action: 'create',
},
{
name: 'view',
action: 'alter',
columns: [
{
columnName: 'name',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'objectMetadataId',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'type',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -1,32 +0,0 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
export const addActivityTargetTable: TenantMigrationTableAction[] = [
{
name: 'activityTarget',
action: 'create',
},
{
name: 'activityTarget',
action: 'alter',
columns: [
{
columnName: 'companyId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'activityId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'personId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -1,32 +0,0 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
export const addApiKeyTable: TenantMigrationTableAction[] = [
{
name: 'apiKey',
action: 'create',
},
{
name: 'apiKey',
action: 'alter',
columns: [
{
columnName: 'name',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'revokedAt',
columnType: 'timestamp',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'expiresAt',
columnType: 'timestamp',
action: TenantMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -1,32 +0,0 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
export const addCommentTable: TenantMigrationTableAction[] = [
{
name: 'comment',
action: 'create',
},
{
name: 'comment',
action: 'alter',
columns: [
{
columnName: 'body',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'authorId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'activityId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -1,32 +0,0 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
export const addPipelineStepTable: TenantMigrationTableAction[] = [
{
name: 'pipelineStep',
action: 'create',
},
{
name: 'pipelineStep',
action: 'alter',
columns: [
{
columnName: 'name',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'color',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'position',
columnType: 'float',
action: TenantMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -1,27 +0,0 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
export const addWebhookTable: TenantMigrationTableAction[] = [
{
name: 'webhook',
action: 'create',
},
{
name: 'webhook',
action: 'alter',
columns: [
{
columnName: 'targetUrl',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
{
columnName: 'operation',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -1,19 +0,0 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
export const addCompanyRelations: TenantMigrationTableAction[] = [
{
name: 'company',
action: 'alter',
columns: [
{
columnName: 'accountOwnerId',
referencedTableName: 'workspaceMember',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
},
],
},
];

View File

@ -1,19 +0,0 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
export const addPersonRelations: TenantMigrationTableAction[] = [
{
name: 'person',
action: 'alter',
columns: [
{
columnName: 'companyId',
referencedTableName: 'company',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
},
],
},
];

View File

@ -1,54 +0,0 @@
import { addActivityTargetTable } from 'src/metadata/tenant-migration/migrations/1697618015-addActivityTargetTable';
import { addActivityTable } from 'src/metadata/tenant-migration/migrations/1697618016-addActivityTable';
import { addApiKeyTable } from 'src/metadata/tenant-migration/migrations/1697618017-addApiKeyTable';
import { addAttachmentTable } from 'src/metadata/tenant-migration/migrations/1697618018-addAttachmentTable';
import { addCommentTable } from 'src/metadata/tenant-migration/migrations/1697618019-addCommentTable';
import { addFavoriteTable } from 'src/metadata/tenant-migration/migrations/1697618020-addFavoriteTable';
import { addOpportunityTable } from 'src/metadata/tenant-migration/migrations/1697618021-addOpportunityTable';
import { addPersonTable } from 'src/metadata/tenant-migration/migrations/1697618022-addPersonTable';
import { addPipelineStepTable } from 'src/metadata/tenant-migration/migrations/1697618023-addPipelineStepTable';
import { addWebhookTable } from 'src/metadata/tenant-migration/migrations/1697618024-addWebhookTable';
import { addWorkspaceMemberTable } from 'src/metadata/tenant-migration/migrations/1697618026-addWorspaceMemberTable';
import { addCompanyRelations } from 'src/metadata/tenant-migration/migrations/1697618027-addCompanyRelations';
import { addAttachmentRelations } from 'src/metadata/tenant-migration/migrations/1697618028-addAttachmentRelations';
import { addPersonRelations } from 'src/metadata/tenant-migration/migrations/1697618029-addPersonRelations';
import { addFavoriteRelations } from 'src/metadata/tenant-migration/migrations/1697618030-addFavoriteRelations';
import { addActivityTargetRelations } from 'src/metadata/tenant-migration/migrations/1697618032-addActivityTargetRelations';
import { addActivityRelations } from 'src/metadata/tenant-migration/migrations/1697618033-addActivityRelations';
import { addCommentRelations } from 'src/metadata/tenant-migration/migrations/1697618034-addCommentRelations';
import { addOpportunityRelations } from 'src/metadata/tenant-migration/migrations/1697618031-addOpportunityRelations';
import { addCompanyTable } from './migrations/1697618009-addCompanyTable';
import { addViewTable } from './migrations/1697618011-addViewTable';
import { addViewFieldTable } from './migrations/1697618012-addViewFieldTable';
import { addViewFilterTable } from './migrations/1697618013-addViewFilterTable';
import { addViewSortTable } from './migrations/1697618014-addViewSortTable';
// TODO: read the folder and return all migrations
export const standardMigrations = {
'1697618009-addCompanyTable': addCompanyTable,
'1697618011-addViewTable': addViewTable,
'1697618012-addViewFieldTable': addViewFieldTable,
'1697618013-addViewFilterTable': addViewFilterTable,
'1697618014-addViewSortTable': addViewSortTable,
'1697618015-addActivityTargetTable': addActivityTargetTable,
'1697618016-addActivityTable': addActivityTable,
'1697618017-addApiKeyTable': addApiKeyTable,
'1697618018-addAttachmentTable': addAttachmentTable,
'1697618019-addCommentTable': addCommentTable,
'1697618020-addFavoriteTable': addFavoriteTable,
'1697618021-addOpportunityTable': addOpportunityTable,
'1697618022-addPersonTable': addPersonTable,
'1697618023-addPipelineStepTable': addPipelineStepTable,
'1697618024-addWebhookTable': addWebhookTable,
'1697618026-addWorkspaceMemberTable': addWorkspaceMemberTable,
'1697618027-addCompanyRelations': addCompanyRelations,
'1697618028-addAttachmentRelations': addAttachmentRelations,
'1697618029-addPersonRelations': addPersonRelations,
'1697618030-addFavoriteRelations': addFavoriteRelations,
'1697618031-addOpportunitiesRelations': addOpportunityRelations,
'1697618032-addActivityTargetRelations': addActivityTargetRelations,
'1697618033-addActivityRelations': addActivityRelations,
'1697618034-addCommentRelations': addCommentRelations,
};

View File

@ -1,12 +0,0 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TenantMigrationService } from './tenant-migration.service';
import { TenantMigrationEntity } from './tenant-migration.entity';
@Module({
imports: [TypeOrmModule.forFeature([TenantMigrationEntity], 'metadata')],
exports: [TenantMigrationService],
providers: [TenantMigrationService],
})
export class TenantMigrationModule {}

View File

@ -0,0 +1,72 @@
import {
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addCompanyTable: WorkspaceMigrationTableAction[] = [
{
name: 'company',
action: 'create',
},
{
name: 'company',
action: 'alter',
columns: [
{
columnName: 'name',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'domainName',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'address',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'employees',
columnType: 'integer',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'linkedinLinklUrl',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'linkedinLinkLabel',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'xLinkUrl',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'xLinkLabel',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'annualRecurringRevenue',
columnType: 'float',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'idealCustomerProfile',
columnType: 'boolean',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'accountOwnerId',
columnType: 'uuid',
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -0,0 +1,32 @@
import {
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addViewTable: WorkspaceMigrationTableAction[] = [
{
name: 'view',
action: 'create',
},
{
name: 'view',
action: 'alter',
columns: [
{
columnName: 'name',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'objectMetadataId',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'type',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addViewFieldTable: TenantMigrationTableAction[] = [
export const addViewFieldTable: WorkspaceMigrationTableAction[] = [
{
name: 'viewField',
action: 'create',
@ -15,33 +15,33 @@ export const addViewFieldTable: TenantMigrationTableAction[] = [
{
columnName: 'fieldMetadataId',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'position',
columnType: 'integer',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'isVisible',
columnType: 'boolean',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'size',
columnType: 'integer',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'viewId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'viewId',
referencedTableName: 'view',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
],
},

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addViewFilterTable: TenantMigrationTableAction[] = [
export const addViewFilterTable: WorkspaceMigrationTableAction[] = [
{
name: 'viewFilter',
action: 'create',
@ -15,33 +15,33 @@ export const addViewFilterTable: TenantMigrationTableAction[] = [
{
columnName: 'fieldMetadataId',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'operand',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'value',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'displayValue',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'viewId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'viewId',
referencedTableName: 'view',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
],
},

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addViewSortTable: TenantMigrationTableAction[] = [
export const addViewSortTable: WorkspaceMigrationTableAction[] = [
{
name: 'viewSort',
action: 'create',
@ -15,23 +15,23 @@ export const addViewSortTable: TenantMigrationTableAction[] = [
{
columnName: 'fieldMetadataId',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'direction',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'viewId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'viewId',
referencedTableName: 'view',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
],
},

View File

@ -0,0 +1,32 @@
import {
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addActivityTargetTable: WorkspaceMigrationTableAction[] = [
{
name: 'activityTarget',
action: 'create',
},
{
name: 'activityTarget',
action: 'alter',
columns: [
{
columnName: 'companyId',
columnType: 'uuid',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'activityId',
columnType: 'uuid',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'personId',
columnType: 'uuid',
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addActivityTable: TenantMigrationTableAction[] = [
export const addActivityTable: WorkspaceMigrationTableAction[] = [
{
name: 'activity',
action: 'create',
@ -15,42 +15,42 @@ export const addActivityTable: TenantMigrationTableAction[] = [
{
columnName: 'title',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'body',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'type',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'reminderAt',
columnType: 'timestamp',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'dueAt',
columnType: 'timestamp',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'completedAt',
columnType: 'timestamp',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'authorId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'assigneeId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},

View File

@ -0,0 +1,32 @@
import {
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addApiKeyTable: WorkspaceMigrationTableAction[] = [
{
name: 'apiKey',
action: 'create',
},
{
name: 'apiKey',
action: 'alter',
columns: [
{
columnName: 'name',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'revokedAt',
columnType: 'timestamp',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'expiresAt',
columnType: 'timestamp',
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addAttachmentTable: TenantMigrationTableAction[] = [
export const addAttachmentTable: WorkspaceMigrationTableAction[] = [
{
name: 'attachment',
action: 'create',
@ -15,37 +15,37 @@ export const addAttachmentTable: TenantMigrationTableAction[] = [
{
columnName: 'name',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'fullPath',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'type',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'companyId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'authorId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'activityId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'personId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},

View File

@ -0,0 +1,32 @@
import {
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addCommentTable: WorkspaceMigrationTableAction[] = [
{
name: 'comment',
action: 'create',
},
{
name: 'comment',
action: 'alter',
columns: [
{
columnName: 'body',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'authorId',
columnType: 'uuid',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'activityId',
columnType: 'uuid',
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addFavoriteTable: TenantMigrationTableAction[] = [
export const addFavoriteTable: WorkspaceMigrationTableAction[] = [
{
name: 'favorite',
action: 'create',
@ -15,22 +15,22 @@ export const addFavoriteTable: TenantMigrationTableAction[] = [
{
columnName: 'position',
columnType: 'float',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'companyId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'personId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'workspaceMemberId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addOpportunityTable: TenantMigrationTableAction[] = [
export const addOpportunityTable: WorkspaceMigrationTableAction[] = [
{
name: 'opportunity',
action: 'create',
@ -15,37 +15,37 @@ export const addOpportunityTable: TenantMigrationTableAction[] = [
{
columnName: 'amount',
columnType: 'float',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'probability',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'closeDate',
columnType: 'timestamp',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'companyId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'personId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'pipelineStepId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'pointOfContactId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addPersonTable: TenantMigrationTableAction[] = [
export const addPersonTable: WorkspaceMigrationTableAction[] = [
{
name: 'person',
action: 'create',
@ -15,52 +15,52 @@ export const addPersonTable: TenantMigrationTableAction[] = [
{
columnName: 'firstName',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'lastName',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'email',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'linkedinUrl',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'xUrl',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'jobTitle',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'phone',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'city',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'avatarUrl',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'companyId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},

View File

@ -0,0 +1,32 @@
import {
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addPipelineStepTable: WorkspaceMigrationTableAction[] = [
{
name: 'pipelineStep',
action: 'create',
},
{
name: 'pipelineStep',
action: 'alter',
columns: [
{
columnName: 'name',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'color',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'position',
columnType: 'float',
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -0,0 +1,27 @@
import {
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addWebhookTable: WorkspaceMigrationTableAction[] = [
{
name: 'webhook',
action: 'create',
},
{
name: 'webhook',
action: 'alter',
columns: [
{
columnName: 'targetUrl',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'operation',
columnType: 'varchar',
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},
];

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addWorkspaceMemberTable: TenantMigrationTableAction[] = [
export const addWorkspaceMemberTable: WorkspaceMigrationTableAction[] = [
{
name: 'workspaceMember',
action: 'create',
@ -15,37 +15,37 @@ export const addWorkspaceMemberTable: TenantMigrationTableAction[] = [
{
columnName: 'firstName',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'lastName',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'avatarUrl',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'colorScheme',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'locale',
columnType: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'allowImpersonation',
columnType: 'boolean',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
{
columnName: 'userId',
columnType: 'uuid',
action: TenantMigrationColumnActionType.CREATE,
action: WorkspaceMigrationColumnActionType.CREATE,
},
],
},

View File

@ -0,0 +1,19 @@
import {
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addCompanyRelations: WorkspaceMigrationTableAction[] = [
{
name: 'company',
action: 'alter',
columns: [
{
columnName: 'accountOwnerId',
referencedTableName: 'workspaceMember',
referencedTableColumnName: 'id',
action: WorkspaceMigrationColumnActionType.RELATION,
},
],
},
];

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addAttachmentRelations: TenantMigrationTableAction[] = [
export const addAttachmentRelations: WorkspaceMigrationTableAction[] = [
{
name: 'attachment',
action: 'alter',
@ -12,25 +12,25 @@ export const addAttachmentRelations: TenantMigrationTableAction[] = [
columnName: 'companyId',
referencedTableName: 'company',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
{
columnName: 'personId',
referencedTableName: 'person',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
{
columnName: 'activityId',
referencedTableName: 'activity',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
{
columnName: 'authorId',
referencedTableName: 'workspaceMember',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
],
},

View File

@ -0,0 +1,19 @@
import {
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addPersonRelations: WorkspaceMigrationTableAction[] = [
{
name: 'person',
action: 'alter',
columns: [
{
columnName: 'companyId',
referencedTableName: 'company',
referencedTableColumnName: 'id',
action: WorkspaceMigrationColumnActionType.RELATION,
},
],
},
];

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addFavoriteRelations: TenantMigrationTableAction[] = [
export const addFavoriteRelations: WorkspaceMigrationTableAction[] = [
{
name: 'favorite',
action: 'alter',
@ -12,19 +12,19 @@ export const addFavoriteRelations: TenantMigrationTableAction[] = [
columnName: 'companyId',
referencedTableName: 'company',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
{
columnName: 'personId',
referencedTableName: 'person',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
{
columnName: 'workspaceMemberId',
referencedTableName: 'workspaceMember',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
],
},

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addOpportunityRelations: TenantMigrationTableAction[] = [
export const addOpportunityRelations: WorkspaceMigrationTableAction[] = [
{
name: 'opportunity',
action: 'alter',
@ -12,25 +12,25 @@ export const addOpportunityRelations: TenantMigrationTableAction[] = [
columnName: 'companyId',
referencedTableName: 'company',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
{
columnName: 'personId',
referencedTableName: 'person',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
{
columnName: 'pointOfContactId',
referencedTableName: 'person',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
{
columnName: 'pipelineStepId',
referencedTableName: 'pipelineStep',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
],
},

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addActivityTargetRelations: TenantMigrationTableAction[] = [
export const addActivityTargetRelations: WorkspaceMigrationTableAction[] = [
{
name: 'activityTarget',
action: 'alter',
@ -12,19 +12,19 @@ export const addActivityTargetRelations: TenantMigrationTableAction[] = [
columnName: 'companyId',
referencedTableName: 'company',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
{
columnName: 'personId',
referencedTableName: 'person',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
{
columnName: 'activityId',
referencedTableName: 'activity',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
],
},

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addActivityRelations: TenantMigrationTableAction[] = [
export const addActivityRelations: WorkspaceMigrationTableAction[] = [
{
name: 'activity',
action: 'alter',
@ -12,13 +12,13 @@ export const addActivityRelations: TenantMigrationTableAction[] = [
columnName: 'authorId',
referencedTableName: 'workspaceMember',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
{
columnName: 'assigneeId',
referencedTableName: 'workspaceMember',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
],
},

View File

@ -1,9 +1,9 @@
import {
TenantMigrationColumnActionType,
TenantMigrationTableAction,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
WorkspaceMigrationColumnActionType,
WorkspaceMigrationTableAction,
} from 'src/metadata/workspace-migration/workspace-migration.entity';
export const addCommentRelations: TenantMigrationTableAction[] = [
export const addCommentRelations: WorkspaceMigrationTableAction[] = [
{
name: 'comment',
action: 'alter',
@ -12,13 +12,13 @@ export const addCommentRelations: TenantMigrationTableAction[] = [
columnName: 'authorId',
referencedTableName: 'workspaceMember',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
{
columnName: 'activityId',
referencedTableName: 'activity',
referencedTableColumnName: 'id',
action: TenantMigrationColumnActionType.RELATION,
action: WorkspaceMigrationColumnActionType.RELATION,
},
],
},

View File

@ -0,0 +1,54 @@
import { addActivityTargetTable } from 'src/metadata/workspace-migration/migrations/1697618015-addActivityTargetTable';
import { addActivityTable } from 'src/metadata/workspace-migration/migrations/1697618016-addActivityTable';
import { addApiKeyTable } from 'src/metadata/workspace-migration/migrations/1697618017-addApiKeyTable';
import { addAttachmentTable } from 'src/metadata/workspace-migration/migrations/1697618018-addAttachmentTable';
import { addCommentTable } from 'src/metadata/workspace-migration/migrations/1697618019-addCommentTable';
import { addFavoriteTable } from 'src/metadata/workspace-migration/migrations/1697618020-addFavoriteTable';
import { addOpportunityTable } from 'src/metadata/workspace-migration/migrations/1697618021-addOpportunityTable';
import { addPersonTable } from 'src/metadata/workspace-migration/migrations/1697618022-addPersonTable';
import { addPipelineStepTable } from 'src/metadata/workspace-migration/migrations/1697618023-addPipelineStepTable';
import { addWebhookTable } from 'src/metadata/workspace-migration/migrations/1697618024-addWebhookTable';
import { addWorkspaceMemberTable } from 'src/metadata/workspace-migration/migrations/1697618026-addWorspaceMemberTable';
import { addCompanyRelations } from 'src/metadata/workspace-migration/migrations/1697618027-addCompanyRelations';
import { addAttachmentRelations } from 'src/metadata/workspace-migration/migrations/1697618028-addAttachmentRelations';
import { addPersonRelations } from 'src/metadata/workspace-migration/migrations/1697618029-addPersonRelations';
import { addFavoriteRelations } from 'src/metadata/workspace-migration/migrations/1697618030-addFavoriteRelations';
import { addActivityTargetRelations } from 'src/metadata/workspace-migration/migrations/1697618032-addActivityTargetRelations';
import { addActivityRelations } from 'src/metadata/workspace-migration/migrations/1697618033-addActivityRelations';
import { addCommentRelations } from 'src/metadata/workspace-migration/migrations/1697618034-addCommentRelations';
import { addOpportunityRelations } from 'src/metadata/workspace-migration/migrations/1697618031-addOpportunityRelations';
import { addCompanyTable } from './migrations/1697618009-addCompanyTable';
import { addViewTable } from './migrations/1697618011-addViewTable';
import { addViewFieldTable } from './migrations/1697618012-addViewFieldTable';
import { addViewFilterTable } from './migrations/1697618013-addViewFilterTable';
import { addViewSortTable } from './migrations/1697618014-addViewSortTable';
// TODO: read the folder and return all migrations
export const standardMigrations = {
'1697618009-addCompanyTable': addCompanyTable,
'1697618011-addViewTable': addViewTable,
'1697618012-addViewFieldTable': addViewFieldTable,
'1697618013-addViewFilterTable': addViewFilterTable,
'1697618014-addViewSortTable': addViewSortTable,
'1697618015-addActivityTargetTable': addActivityTargetTable,
'1697618016-addActivityTable': addActivityTable,
'1697618017-addApiKeyTable': addApiKeyTable,
'1697618018-addAttachmentTable': addAttachmentTable,
'1697618019-addCommentTable': addCommentTable,
'1697618020-addFavoriteTable': addFavoriteTable,
'1697618021-addOpportunityTable': addOpportunityTable,
'1697618022-addPersonTable': addPersonTable,
'1697618023-addPipelineStepTable': addPipelineStepTable,
'1697618024-addWebhookTable': addWebhookTable,
'1697618026-addWorkspaceMemberTable': addWorkspaceMemberTable,
'1697618027-addCompanyRelations': addCompanyRelations,
'1697618028-addAttachmentRelations': addAttachmentRelations,
'1697618029-addPersonRelations': addPersonRelations,
'1697618030-addFavoriteRelations': addFavoriteRelations,
'1697618031-addOpportunitiesRelations': addOpportunityRelations,
'1697618032-addActivityTargetRelations': addActivityTargetRelations,
'1697618033-addActivityRelations': addActivityRelations,
'1697618034-addCommentRelations': addCommentRelations,
};

View File

@ -5,42 +5,42 @@ import {
PrimaryGeneratedColumn,
} from 'typeorm';
export enum TenantMigrationColumnActionType {
export enum WorkspaceMigrationColumnActionType {
CREATE = 'CREATE',
RELATION = 'RELATION',
}
export type TenantMigrationColumnCreate = {
action: TenantMigrationColumnActionType.CREATE;
export type WorkspaceMigrationColumnCreate = {
action: WorkspaceMigrationColumnActionType.CREATE;
columnName: string;
columnType: string;
defaultValue?: any;
};
export type TenantMigrationColumnRelation = {
action: TenantMigrationColumnActionType.RELATION;
export type WorkspaceMigrationColumnRelation = {
action: WorkspaceMigrationColumnActionType.RELATION;
columnName: string;
referencedTableName: string;
referencedTableColumnName: string;
isUnique?: boolean;
};
export type TenantMigrationColumnAction = {
action: TenantMigrationColumnActionType;
} & (TenantMigrationColumnCreate | TenantMigrationColumnRelation);
export type WorkspaceMigrationColumnAction = {
action: WorkspaceMigrationColumnActionType;
} & (WorkspaceMigrationColumnCreate | WorkspaceMigrationColumnRelation);
export type TenantMigrationTableAction = {
export type WorkspaceMigrationTableAction = {
name: string;
action: 'create' | 'alter';
columns?: TenantMigrationColumnAction[];
columns?: WorkspaceMigrationColumnAction[];
};
@Entity('tenantMigration')
export class TenantMigrationEntity {
@Entity('workspaceMigration')
export class WorkspaceMigrationEntity {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ nullable: true, type: 'jsonb' })
migrations: TenantMigrationTableAction[];
migrations: WorkspaceMigrationTableAction[];
@Column({ nullable: true })
name: string;

View File

@ -0,0 +1,12 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { WorkspaceMigrationService } from './workspace-migration.service';
import { WorkspaceMigrationEntity } from './workspace-migration.entity';
@Module({
imports: [TypeOrmModule.forFeature([WorkspaceMigrationEntity], 'metadata')],
exports: [WorkspaceMigrationService],
providers: [WorkspaceMigrationService],
})
export class WorkspaceMigrationModule {}

View File

@ -5,15 +5,15 @@ import { IsNull, Repository } from 'typeorm';
import { standardMigrations } from './standard-migrations';
import {
TenantMigrationEntity,
TenantMigrationTableAction,
} from './tenant-migration.entity';
WorkspaceMigrationEntity,
WorkspaceMigrationTableAction,
} from './workspace-migration.entity';
@Injectable()
export class TenantMigrationService {
export class WorkspaceMigrationService {
constructor(
@InjectRepository(TenantMigrationEntity, 'metadata')
private readonly tenantMigrationRepository: Repository<TenantMigrationEntity>,
@InjectRepository(WorkspaceMigrationEntity, 'metadata')
private readonly workspaceMigrationRepository: Repository<WorkspaceMigrationEntity>,
) {}
/**
@ -24,7 +24,7 @@ export class TenantMigrationService {
public async insertStandardMigrations(workspaceId: string): Promise<void> {
// TODO: we actually don't need to fetch all of them, to improve later so it scales well.
const insertedStandardMigrations =
await this.tenantMigrationRepository.find({
await this.workspaceMigrationRepository.find({
where: { workspaceId, isCustom: false },
});
@ -47,7 +47,7 @@ export class TenantMigrationService {
isCustom: false,
}));
await this.tenantMigrationRepository.save(
await this.workspaceMigrationRepository.save(
standardMigrationsThatNeedToBeInserted,
);
}
@ -56,12 +56,12 @@ export class TenantMigrationService {
* Get all pending migrations for a given workspaceId
*
* @param workspaceId: string
* @returns Promise<TenantMigration[]>
* @returns Promise<WorkspaceMigration[]>
*/
public async getPendingMigrations(
workspaceId: string,
): Promise<TenantMigrationEntity[]> {
return await this.tenantMigrationRepository.find({
): Promise<WorkspaceMigrationEntity[]> {
return await this.workspaceMigrationRepository.find({
order: { createdAt: 'ASC', name: 'ASC' },
where: {
appliedAt: IsNull(),
@ -75,13 +75,13 @@ export class TenantMigrationService {
* Should be called once the migration has been applied
*
* @param workspaceId: string
* @param migration: TenantMigration
* @param migration: WorkspaceMigration
*/
public async setAppliedAtForMigration(
workspaceId: string,
migration: TenantMigrationEntity,
migration: WorkspaceMigrationEntity,
) {
await this.tenantMigrationRepository.save({
await this.workspaceMigrationRepository.save({
id: migration.id,
appliedAt: new Date(),
});
@ -95,9 +95,9 @@ export class TenantMigrationService {
*/
public async createCustomMigration(
workspaceId: string,
migrations: TenantMigrationTableAction[],
migrations: WorkspaceMigrationTableAction[],
) {
await this.tenantMigrationRepository.save({
await this.workspaceMigrationRepository.save({
migrations,
workspaceId,
isCustom: true,
@ -105,6 +105,6 @@ export class TenantMigrationService {
}
public async delete(workspaceId: string) {
await this.tenantMigrationRepository.delete({ workspaceId });
await this.workspaceMigrationRepository.delete({ workspaceId });
}
}

View File

@ -1,12 +0,0 @@
import { Module } from '@nestjs/common';
import { TenantManagerModule } from 'src/tenant-manager/tenant-manager.module';
import { DataSourceModule } from 'src/metadata/data-source/data-source.module';
import { SyncTenantMetadataCommand } from './sync-tenant-metadata.command';
@Module({
imports: [TenantManagerModule, DataSourceModule],
providers: [SyncTenantMetadataCommand],
})
export class TenantManagerCommandsModule {}

View File

@ -1,78 +0,0 @@
import activityTargetMetadata from 'src/tenant-manager/standard-objects/activity-target';
import activityMetadata from 'src/tenant-manager/standard-objects/activity';
import apiKeyMetadata from 'src/tenant-manager/standard-objects/api-key';
import attachmentMetadata from 'src/tenant-manager/standard-objects/attachment';
import commentMetadata from 'src/tenant-manager/standard-objects/comment';
import favoriteMetadata from 'src/tenant-manager/standard-objects/favorite';
import opportunityMetadata from 'src/tenant-manager/standard-objects/opportunity';
import personMetadata from 'src/tenant-manager/standard-objects/person';
import viewMetadata from 'src/tenant-manager/standard-objects/view';
import viewFieldMetadata from 'src/tenant-manager/standard-objects/view-field';
import viewFilterMetadata from 'src/tenant-manager/standard-objects/view-filter';
import viewSortMetadata from 'src/tenant-manager/standard-objects/view-sort';
import webhookMetadata from 'src/tenant-manager/standard-objects/webhook';
import pipelineStepMetadata from 'src/tenant-manager/standard-objects/pipeline-step';
import companyMetadata from 'src/tenant-manager/standard-objects/company';
import workspaceMemberMetadata from 'src/tenant-manager/standard-objects/workspace-member';
import {
FieldMetadataEntity,
FieldMetadataType,
} from 'src/metadata/field-metadata/field-metadata.entity';
export const standardObjectsMetadata = {
activityTargetV2: activityTargetMetadata,
activityV2: activityMetadata,
apiKeyV2: apiKeyMetadata,
attachmentV2: attachmentMetadata,
commentV2: commentMetadata,
companyV2: companyMetadata,
favoriteV2: favoriteMetadata,
opportunityV2: opportunityMetadata,
personV2: personMetadata,
pipelineStepV2: pipelineStepMetadata,
viewFieldV2: viewFieldMetadata,
viewFilterV2: viewFilterMetadata,
viewSortV2: viewSortMetadata,
viewV2: viewMetadata,
webhookV2: webhookMetadata,
workspaceMemberV2: workspaceMemberMetadata,
};
export const basicFieldsMetadata: Partial<FieldMetadataEntity>[] = [
{
name: 'id',
label: 'Id',
type: FieldMetadataType.UUID,
targetColumnMap: {
value: 'id',
},
isNullable: true,
// isSystem: true,
isCustom: false,
isActive: true,
},
{
name: 'createdAt',
label: 'Creation date',
type: FieldMetadataType.DATE,
targetColumnMap: {
value: 'createdAt',
},
icon: 'IconCalendar',
isNullable: true,
isCustom: false,
isActive: true,
},
{
name: 'updatedAt',
label: 'Update date',
type: FieldMetadataType.DATE,
targetColumnMap: {
value: 'updatedAt',
},
icon: 'IconCalendar',
isNullable: true,
isCustom: false,
isActive: true,
},
];

View File

@ -1,15 +0,0 @@
import activityRelationMetadata from 'src/tenant-manager/standard-objects/relations/activity';
import companyRelationMetadata from 'src/tenant-manager/standard-objects/relations/company';
import personRelationMetadata from 'src/tenant-manager/standard-objects/relations/person';
import pipelineStepRelationMetadata from 'src/tenant-manager/standard-objects/relations/pipeline-step';
import viewRelationMetadata from 'src/tenant-manager/standard-objects/relations/view';
import workspaceMemberRelationMetadata from 'src/tenant-manager/standard-objects/relations/workspace-member';
export const standardObjectRelationMetadata = [
...activityRelationMetadata,
...companyRelationMetadata,
...personRelationMetadata,
...pipelineStepRelationMetadata,
...viewRelationMetadata,
...workspaceMemberRelationMetadata,
];

View File

@ -1,26 +0,0 @@
import { Module } from '@nestjs/common';
import { DataSourceModule } from 'src/metadata/data-source/data-source.module';
import { FieldMetadataModule } from 'src/metadata/field-metadata/field-metadata.module';
import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module';
import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module';
import { TenantMigrationRunnerModule } from 'src/tenant-migration-runner/tenant-migration-runner.module';
import { TenantDataSourceModule } from 'src/tenant-datasource/tenant-datasource.module';
import { RelationMetadataModule } from 'src/metadata/relation-metadata/relation-metadata.module';
import { TenantManagerService } from './tenant-manager.service';
@Module({
imports: [
TenantDataSourceModule,
TenantMigrationModule,
TenantMigrationRunnerModule,
ObjectMetadataModule,
FieldMetadataModule,
DataSourceModule,
RelationMetadataModule,
],
exports: [TenantManagerService],
providers: [TenantManagerService],
})
export class TenantManagerModule {}

View File

@ -1,45 +0,0 @@
import { Command, CommandRunner, Option } from 'nest-commander';
import { TenantMigrationService } from 'src/metadata/tenant-migration/tenant-migration.service';
import { TenantMigrationRunnerService } from 'src/tenant-migration-runner/tenant-migration-runner.service';
// TODO: implement dry-run
interface RunTenantMigrationsOptions {
workspaceId: string;
}
@Command({
name: 'tenant:migrate',
description: 'Run tenant migrations',
})
export class RunTenantMigrationsCommand extends CommandRunner {
constructor(
private readonly tenantMigrationService: TenantMigrationService,
private readonly tenantMigrationRunnerService: TenantMigrationRunnerService,
) {
super();
}
async run(
_passedParam: string[],
options: RunTenantMigrationsOptions,
): Promise<void> {
// TODO: run in a dedicated job + run queries in a transaction.
await this.tenantMigrationService.insertStandardMigrations(
options.workspaceId,
);
await this.tenantMigrationRunnerService.executeMigrationFromPendingMigrations(
options.workspaceId,
);
}
// TODO: workspaceId should be optional and we should run migrations for all workspaces
@Option({
flags: '-w, --workspace-id [workspace_id]',
description: 'workspace id',
required: true,
})
parseWorkspaceId(value: string): string {
return value;
}
}

View File

@ -1,12 +0,0 @@
import { Module } from '@nestjs/common';
import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module';
import { TenantMigrationRunnerModule } from 'src/tenant-migration-runner/tenant-migration-runner.module';
import { RunTenantMigrationsCommand } from './run-tenant-migrations.command';
@Module({
imports: [TenantMigrationModule, TenantMigrationRunnerModule],
providers: [RunTenantMigrationsCommand],
})
export class TenantMigrationRunnerCommandsModule {}

View File

@ -1,13 +0,0 @@
import { Module } from '@nestjs/common';
import { TenantMigrationModule } from 'src/metadata/tenant-migration/tenant-migration.module';
import { TenantDataSourceModule } from 'src/tenant-datasource/tenant-datasource.module';
import { TenantMigrationRunnerService } from './tenant-migration-runner.service';
@Module({
imports: [TenantDataSourceModule, TenantMigrationModule],
exports: [TenantMigrationRunnerService],
providers: [TenantMigrationRunnerService],
})
export class TenantMigrationRunnerModule {}

View File

@ -1,9 +0,0 @@
import { GraphQLResolveInfo } from 'graphql';
import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface';
export interface QueryBuilderOptions {
targetTableName: string;
info: GraphQLResolveInfo;
fieldMetadataCollection: FieldMetadataInterface[];
}

View File

@ -1,55 +0,0 @@
import { GraphQLFieldResolver } from 'graphql';
import { resolverBuilderMethodNames } from 'src/tenant/resolver-builder/factories/factories';
import { Record, RecordFilter, RecordOrderBy } from './record.interface';
export type Resolver<Args = any> = GraphQLFieldResolver<any, any, Args>;
export interface FindManyResolverArgs<
Filter extends RecordFilter = RecordFilter,
OrderBy extends RecordOrderBy = RecordOrderBy,
> {
first?: number;
last?: number;
before?: string;
after?: string;
filter?: Filter;
orderBy?: OrderBy;
}
export interface FindOneResolverArgs<Filter = any> {
filter?: Filter;
}
export interface CreateOneResolverArgs<Data extends Record = Record> {
data: Data;
}
export interface CreateManyResolverArgs<Data extends Record = Record> {
data: Data[];
}
export interface UpdateOneResolverArgs<Data extends Record = Record> {
id: string;
data: Data;
}
export interface DeleteOneResolverArgs {
id: string;
}
export type ResolverBuilderQueryMethodNames =
(typeof resolverBuilderMethodNames.queries)[number];
export type ResolverBuilderMutationMethodNames =
(typeof resolverBuilderMethodNames.mutations)[number];
export type ResolverBuilderMethodNames =
| ResolverBuilderQueryMethodNames
| ResolverBuilderMutationMethodNames;
export interface ResolverBuilderMethods {
readonly queries: readonly ResolverBuilderQueryMethodNames[];
readonly mutations: readonly ResolverBuilderMutationMethodNames[];
}

View File

@ -1,12 +0,0 @@
import { Module } from '@nestjs/common';
import { QueryBuilderFactory } from './query-builder.factory';
import { queryBuilderFactories } from './factories/factories';
@Module({
imports: [],
providers: [...queryBuilderFactories, QueryBuilderFactory],
exports: [QueryBuilderFactory],
})
export class QueryBuilderModule {}

View File

@ -1,13 +0,0 @@
import { Module } from '@nestjs/common';
import { QueryBuilderModule } from 'src/tenant/query-builder/query-builder.module';
import { TenantDataSourceModule } from 'src/tenant-datasource/tenant-datasource.module';
import { QueryRunnerService } from './query-runner.service';
@Module({
imports: [QueryBuilderModule, TenantDataSourceModule],
providers: [QueryRunnerService],
exports: [QueryRunnerService],
})
export class QueryRunnerModule {}

View File

@ -1,32 +0,0 @@
import { Injectable } from '@nestjs/common';
import {
CreateManyResolverArgs,
Resolver,
} from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface';
import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface';
import { ResolverBuilderFactoryInterface } from 'src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface';
import { QueryRunnerService } from 'src/tenant/query-runner/query-runner.service';
@Injectable()
export class CreateManyResolverFactory
implements ResolverBuilderFactoryInterface
{
public static methodName = 'createMany' as const;
constructor(private readonly queryRunnerService: QueryRunnerService) {}
create(context: SchemaBuilderContext): Resolver<CreateManyResolverArgs> {
const internalContext = context;
return (_source, args, context, info) => {
return this.queryRunnerService.createMany(args, {
targetTableName: internalContext.targetTableName,
workspaceId: internalContext.workspaceId,
info,
fieldMetadataCollection: internalContext.fieldMetadataCollection,
});
};
}
}

View File

@ -1,32 +0,0 @@
import { Injectable } from '@nestjs/common';
import {
CreateOneResolverArgs,
Resolver,
} from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface';
import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface';
import { ResolverBuilderFactoryInterface } from 'src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface';
import { QueryRunnerService } from 'src/tenant/query-runner/query-runner.service';
@Injectable()
export class CreateOneResolverFactory
implements ResolverBuilderFactoryInterface
{
public static methodName = 'createOne' as const;
constructor(private readonly queryRunnerService: QueryRunnerService) {}
create(context: SchemaBuilderContext): Resolver<CreateOneResolverArgs> {
const internalContext = context;
return (_source, args, context, info) => {
return this.queryRunnerService.createOne(args, {
targetTableName: internalContext.targetTableName,
workspaceId: internalContext.workspaceId,
info,
fieldMetadataCollection: internalContext.fieldMetadataCollection,
});
};
}
}

View File

@ -1,32 +0,0 @@
import { Injectable } from '@nestjs/common';
import {
DeleteOneResolverArgs,
Resolver,
} from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface';
import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface';
import { ResolverBuilderFactoryInterface } from 'src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface';
import { QueryRunnerService } from 'src/tenant/query-runner/query-runner.service';
@Injectable()
export class DeleteOneResolverFactory
implements ResolverBuilderFactoryInterface
{
public static methodName = 'deleteOne' as const;
constructor(private readonly queryRunnerService: QueryRunnerService) {}
create(context: SchemaBuilderContext): Resolver<DeleteOneResolverArgs> {
const internalContext = context;
return (_source, args, context, info) => {
return this.queryRunnerService.deleteOne(args, {
targetTableName: internalContext.targetTableName,
workspaceId: internalContext.workspaceId,
info,
fieldMetadataCollection: internalContext.fieldMetadataCollection,
});
};
}
}

View File

@ -1,32 +0,0 @@
import { Injectable } from '@nestjs/common';
import {
FindManyResolverArgs,
Resolver,
} from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface';
import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface';
import { ResolverBuilderFactoryInterface } from 'src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface';
import { QueryRunnerService } from 'src/tenant/query-runner/query-runner.service';
@Injectable()
export class FindManyResolverFactory
implements ResolverBuilderFactoryInterface
{
public static methodName = 'findMany' as const;
constructor(private readonly queryRunnerService: QueryRunnerService) {}
create(context: SchemaBuilderContext): Resolver<FindManyResolverArgs> {
const internalContext = context;
return (_source, args, context, info) => {
return this.queryRunnerService.findMany(args, {
targetTableName: internalContext.targetTableName,
workspaceId: internalContext.workspaceId,
info,
fieldMetadataCollection: internalContext.fieldMetadataCollection,
});
};
}
}

View File

@ -1,30 +0,0 @@
import { Injectable } from '@nestjs/common';
import {
FindOneResolverArgs,
Resolver,
} from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface';
import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface';
import { ResolverBuilderFactoryInterface } from 'src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface';
import { QueryRunnerService } from 'src/tenant/query-runner/query-runner.service';
@Injectable()
export class FindOneResolverFactory implements ResolverBuilderFactoryInterface {
public static methodName = 'findOne' as const;
constructor(private readonly queryRunnerService: QueryRunnerService) {}
create(context: SchemaBuilderContext): Resolver<FindOneResolverArgs> {
const internalContext = context;
return (_source, args, context, info) => {
return this.queryRunnerService.findOne(args, {
targetTableName: internalContext.targetTableName,
workspaceId: internalContext.workspaceId,
info,
fieldMetadataCollection: internalContext.fieldMetadataCollection,
});
};
}
}

View File

@ -1,32 +0,0 @@
import { Injectable } from '@nestjs/common';
import {
Resolver,
UpdateOneResolverArgs,
} from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface';
import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface';
import { ResolverBuilderFactoryInterface } from 'src/tenant/resolver-builder/interfaces/resolver-builder-factory.interface';
import { QueryRunnerService } from 'src/tenant/query-runner/query-runner.service';
@Injectable()
export class UpdateOneResolverFactory
implements ResolverBuilderFactoryInterface
{
public static methodName = 'updateOne' as const;
constructor(private readonly queryRunnerService: QueryRunnerService) {}
create(context: SchemaBuilderContext): Resolver<UpdateOneResolverArgs> {
const internalContext = context;
return (_source, args, context, info) => {
return this.queryRunnerService.updateOne(args, {
targetTableName: internalContext.targetTableName,
workspaceId: internalContext.workspaceId,
info,
fieldMetadataCollection: internalContext.fieldMetadataCollection,
});
};
}
}

View File

@ -1,18 +0,0 @@
export interface Record {
[key: string]: any;
}
export type RecordFilter = {
[Property in keyof Record]: any;
};
export enum OrderByDirection {
AscNullsFirst = 'AscNullsFirst',
AscNullsLast = 'AscNullsLast',
DescNullsFirst = 'DescNullsFirst',
DescNullsLast = 'DescNullsLast',
}
export type RecordOrderBy = {
[Property in keyof Record]: OrderByDirection;
};

View File

@ -1,7 +0,0 @@
import { SchemaBuilderContext } from 'src/tenant/schema-builder/interfaces/schema-builder-context.interface';
import { Resolver } from './resolvers-builder.interface';
export interface ResolverBuilderFactoryInterface {
create(context: SchemaBuilderContext): Resolver;
}

View File

@ -1,55 +0,0 @@
import { GraphQLFieldResolver } from 'graphql';
import { resolverBuilderMethodNames } from 'src/tenant/resolver-builder/factories/factories';
import { Record, RecordFilter, RecordOrderBy } from './record.interface';
export type Resolver<Args = any> = GraphQLFieldResolver<any, any, Args>;
export interface FindManyResolverArgs<
Filter extends RecordFilter = RecordFilter,
OrderBy extends RecordOrderBy = RecordOrderBy,
> {
first?: number;
last?: number;
before?: string;
after?: string;
filter?: Filter;
orderBy?: OrderBy;
}
export interface FindOneResolverArgs<Filter = any> {
filter?: Filter;
}
export interface CreateOneResolverArgs<Data extends Record = Record> {
data: Data;
}
export interface CreateManyResolverArgs<Data extends Record = Record> {
data: Data[];
}
export interface UpdateOneResolverArgs<Data extends Record = Record> {
id: string;
data: Data;
}
export interface DeleteOneResolverArgs {
id: string;
}
export type ResolverBuilderQueryMethodNames =
(typeof resolverBuilderMethodNames.queries)[number];
export type ResolverBuilderMutationMethodNames =
(typeof resolverBuilderMethodNames.mutations)[number];
export type ResolverBuilderMethodNames =
| ResolverBuilderQueryMethodNames
| ResolverBuilderMutationMethodNames;
export interface ResolverBuilderMethods {
readonly queries: readonly ResolverBuilderQueryMethodNames[];
readonly mutations: readonly ResolverBuilderMutationMethodNames[];
}

View File

@ -1,14 +0,0 @@
import { Module } from '@nestjs/common';
import { QueryRunnerModule } from 'src/tenant/query-runner/query-runner.module';
import { ResolverFactory } from './resolver.factory';
import { resolverBuilderFactories } from './factories/factories';
@Module({
imports: [QueryRunnerModule],
providers: [...resolverBuilderFactories, ResolverFactory],
exports: [ResolverFactory],
})
export class ResolverBuilderModule {}

View File

@ -1,26 +0,0 @@
import { Injectable } from '@nestjs/common';
import { GraphQLObjectType } from 'graphql';
import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface';
import { ResolverBuilderMutationMethodNames } from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface';
import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface';
import { ObjectTypeName, RootTypeFactory } from './root-type.factory';
@Injectable()
export class MutationTypeFactory {
constructor(private readonly rootTypeFactory: RootTypeFactory) {}
create(
objectMetadataCollection: ObjectMetadataInterface[],
resolverMethodNames: ResolverBuilderMutationMethodNames[],
options: BuildSchemaOptions,
): GraphQLObjectType {
return this.rootTypeFactory.create(
objectMetadataCollection,
resolverMethodNames,
ObjectTypeName.Mutation,
options,
);
}
}

View File

@ -1,26 +0,0 @@
import { Injectable } from '@nestjs/common';
import { GraphQLObjectType } from 'graphql';
import { BuildSchemaOptions } from 'src/tenant/schema-builder/interfaces/build-schema-optionts.interface';
import { ResolverBuilderQueryMethodNames } from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface';
import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface';
import { ObjectTypeName, RootTypeFactory } from './root-type.factory';
@Injectable()
export class QueryTypeFactory {
constructor(private readonly rootTypeFactory: RootTypeFactory) {}
create(
objectMetadataCollection: ObjectMetadataInterface[],
resolverMethodNames: ResolverBuilderQueryMethodNames[],
options: BuildSchemaOptions,
): GraphQLObjectType {
return this.rootTypeFactory.create(
objectMetadataCollection,
resolverMethodNames,
ObjectTypeName.Query,
options,
);
}
}

View File

@ -1,11 +0,0 @@
import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface';
import { isCompositeFieldMetadataType } from 'src/tenant/utils/is-composite-field-metadata-type.util';
export const objectContainsCompositeField = (
objectMetadata: ObjectMetadataInterface,
): boolean => {
return objectMetadata.fields.some((field) =>
isCompositeFieldMetadataType(field.type),
);
};

View File

@ -1,23 +0,0 @@
import { Module } from '@nestjs/common';
import { MetadataModule } from 'src/metadata/metadata.module';
import { DataSourceModule } from 'src/metadata/data-source/data-source.module';
import { ObjectMetadataModule } from 'src/metadata/object-metadata/object-metadata.module';
import { TenantService } from './tenant.service';
import { SchemaBuilderModule } from './schema-builder/schema-builder.module';
import { ResolverBuilderModule } from './resolver-builder/resolver-builder.module';
@Module({
imports: [
MetadataModule,
DataSourceModule,
ObjectMetadataModule,
SchemaBuilderModule,
ResolverBuilderModule,
],
providers: [TenantService],
exports: [TenantService],
})
export class TenantModule {}

View File

@ -1,10 +1,10 @@
import { RelationMetadataInterface } from 'src/tenant/schema-builder/interfaces/relation-metadata.interface';
import { RelationMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/relation-metadata.interface';
import { RelationMetadataType } from 'src/metadata/relation-metadata/relation-metadata.entity';
import {
deduceRelationDirection,
RelationDirection,
} from 'src/tenant/utils/deduce-relation-direction.util';
} from 'src/workspace/utils/deduce-relation-direction.util';
describe('deduceRelationDirection', () => {
it('should return FROM when the current object Metadata ID matches fromObjectMetadataId', () => {

View File

@ -1,6 +1,6 @@
import { ResolverBuilderMethodNames } from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface';
import { WorkspaceResolverBuilderMethodNames } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
import { getResolverName } from 'src/tenant/utils/get-resolver-name.util';
import { getResolverName } from 'src/workspace/utils/get-resolver-name.util';
describe('getResolverName', () => {
const metadata = {
@ -16,15 +16,18 @@ describe('getResolverName', () => {
['updateOne', 'updateEntity'],
['deleteOne', 'deleteEntity'],
])('should return correct name for %s resolver', (type, expectedResult) => {
expect(getResolverName(metadata, type as ResolverBuilderMethodNames)).toBe(
expectedResult,
);
expect(
getResolverName(metadata, type as WorkspaceResolverBuilderMethodNames),
).toBe(expectedResult);
});
it('should throw an error for an unknown resolver type', () => {
const unknownType = 'unknownType';
expect(() =>
getResolverName(metadata, unknownType as ResolverBuilderMethodNames),
getResolverName(
metadata,
unknownType as WorkspaceResolverBuilderMethodNames,
),
).toThrow(`Unknown resolver type: ${unknownType}`);
});
});

View File

@ -1,4 +1,4 @@
import { RelationMetadataInterface } from 'src/tenant/schema-builder/interfaces/relation-metadata.interface';
import { RelationMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/relation-metadata.interface';
export enum RelationDirection {
FROM = 'from',

View File

@ -1,12 +1,12 @@
import { ResolverBuilderMethodNames } from 'src/tenant/resolver-builder/interfaces/resolvers-builder.interface';
import { ObjectMetadataInterface } from 'src/tenant/schema-builder/interfaces/object-metadata.interface';
import { WorkspaceResolverBuilderMethodNames } from 'src/workspace/workspace-resolver-builder/interfaces/workspace-resolvers-builder.interface';
import { ObjectMetadataInterface } from 'src/workspace/workspace-schema-builder/interfaces/object-metadata.interface';
import { camelCase } from 'src/utils/camel-case';
import { pascalCase } from 'src/utils/pascal-case';
export const getResolverName = (
objectMetadata: Pick<ObjectMetadataInterface, 'namePlural' | 'nameSingular'>,
type: ResolverBuilderMethodNames,
type: WorkspaceResolverBuilderMethodNames,
) => {
switch (type) {
case 'findMany':

View File

@ -3,11 +3,11 @@ import { Module } from '@nestjs/common';
import { TypeORMModule } from 'src/database/typeorm/typeorm.module';
import { DataSourceModule } from 'src/metadata/data-source/data-source.module';
import { TenantDataSourceService } from './tenant-datasource.service';
import { WorkspaceDataSourceService } from './workspace-datasource.service';
@Module({
imports: [DataSourceModule, TypeORMModule],
exports: [TenantDataSourceService],
providers: [TenantDataSourceService],
exports: [WorkspaceDataSourceService],
providers: [WorkspaceDataSourceService],
})
export class TenantDataSourceModule {}
export class WorkspaceDataSourceModule {}

View File

@ -6,7 +6,7 @@ import { DataSourceService } from 'src/metadata/data-source/data-source.service'
import { TypeORMService } from 'src/database/typeorm/typeorm.service';
@Injectable()
export class TenantDataSourceService {
export class WorkspaceDataSourceService {
constructor(
private readonly dataSourceService: DataSourceService,
private readonly typeormService: TypeORMService,

View File

@ -1,20 +1,20 @@
import { Command, CommandRunner, Option } from 'nest-commander';
import { DataSourceService } from 'src/metadata/data-source/data-source.service';
import { TenantManagerService } from 'src/tenant-manager/tenant-manager.service';
import { WorkspaceManagerService } from 'src/workspace/workspace-manager/workspace-manager.service';
// TODO: implement dry-run
interface RunTenantMigrationsOptions {
interface RunWorkspaceMigrationsOptions {
workspaceId: string;
}
@Command({
name: 'tenant:sync-metadata',
name: 'workspace:sync-metadata',
description: 'Sync metadata',
})
export class SyncTenantMetadataCommand extends CommandRunner {
export class SyncWorkspaceMetadataCommand extends CommandRunner {
constructor(
private readonly tenantManagerService: TenantManagerService,
private readonly workspaceManagerService: WorkspaceManagerService,
private readonly dataSourceService: DataSourceService,
) {
super();
@ -22,7 +22,7 @@ export class SyncTenantMetadataCommand extends CommandRunner {
async run(
_passedParam: string[],
options: RunTenantMigrationsOptions,
options: RunWorkspaceMigrationsOptions,
): Promise<void> {
// TODO: run in a dedicated job + run queries in a transaction.
const dataSourceMetadata =
@ -31,7 +31,7 @@ export class SyncTenantMetadataCommand extends CommandRunner {
);
// TODO: This solution could be improved, using a diff for example, we should not have to delete all metadata and recreate them.
await this.tenantManagerService.resetStandardObjectsAndFieldsMetadata(
await this.workspaceManagerService.resetStandardObjectsAndFieldsMetadata(
dataSourceMetadata.id,
options.workspaceId,
);

View File

@ -0,0 +1,12 @@
import { Module } from '@nestjs/common';
import { WorkspaceManagerModule } from 'src/workspace/workspace-manager/workspace-manager.module';
import { DataSourceModule } from 'src/metadata/data-source/data-source.module';
import { SyncWorkspaceMetadataCommand } from './sync-workspace-metadata.command';
@Module({
imports: [WorkspaceManagerModule, DataSourceModule],
providers: [SyncWorkspaceMetadataCommand],
})
export class WorkspaceManagerCommandsModule {}

Some files were not shown because too many files have changed in this diff Show More