Add KanbanFieldMetadataId on View standard object (#4604)

* Add KanbanFieldMetadataId on View standard object

* Deprecate Pipeline step

* Fix

* Use Constants instead of raw ids

* Fix

* Fix query runner

* Fix according to review

* Fix tests

* Fix tests

* Fix tests
This commit is contained in:
Charles Bochet
2024-03-21 18:08:27 +01:00
committed by GitHub
parent cc0e3c8a9a
commit 3fa8c4bace
36 changed files with 424 additions and 1486 deletions

View File

@ -1,12 +1,10 @@
import { Command, CommandRunner } from 'nest-commander';
import { DataSource } from 'typeorm';
import { DataSource, EntityManager } from 'typeorm';
import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service';
import { seedCompanies } from 'src/database/typeorm-seeds/workspace/companies';
import { seedViews } from 'src/database/typeorm-seeds/workspace/views';
import { TypeORMService } from 'src/database/typeorm/typeorm.service';
import { seedOpportunity } from 'src/database/typeorm-seeds/workspace/opportunity';
import { seedPipelineStep } from 'src/database/typeorm-seeds/workspace/pipeline-step';
import { seedWorkspaceMember } from 'src/database/typeorm-seeds/workspace/workspaceMember';
import { seedPeople } from 'src/database/typeorm-seeds/workspace/people';
import { seedCoreSchema } from 'src/database/typeorm-seeds/core';
@ -19,6 +17,7 @@ import {
SeedAppleWorkspaceId,
SeedTwentyWorkspaceId,
} from 'src/database/typeorm-seeds/core/workspaces';
import { viewPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/view';
// TODO: implement dry-run
@Command({
@ -95,10 +94,10 @@ export class DataSeedWorkspaceCommand extends CommandRunner {
const objectMetadata =
await this.objectMetadataService.findManyWithinWorkspace(workspaceId);
const objectMetadataMap = objectMetadata.reduce((acc, object) => {
acc[object.nameSingular] = {
acc[object.standardId ?? ''] = {
id: object.id,
fields: object.fields.reduce((acc, field) => {
acc[field.name] = field.id;
acc[field.standardId ?? ''] = field.id;
return acc;
}, {}),
@ -107,24 +106,24 @@ export class DataSeedWorkspaceCommand extends CommandRunner {
return acc;
}, {});
await seedCompanies(workspaceDataSource, dataSourceMetadata.schema);
await seedPeople(workspaceDataSource, dataSourceMetadata.schema);
await seedPipelineStep(workspaceDataSource, dataSourceMetadata.schema);
await seedOpportunity(workspaceDataSource, dataSourceMetadata.schema);
await seedCalendarEvents(
workspaceDataSource,
dataSourceMetadata.schema,
);
await workspaceDataSource.transaction(
async (entityManager: EntityManager) => {
await seedCompanies(entityManager, dataSourceMetadata.schema);
await seedPeople(entityManager, dataSourceMetadata.schema);
await seedOpportunity(entityManager, dataSourceMetadata.schema);
await seedCalendarEvents(entityManager, dataSourceMetadata.schema);
await seedWorkspaceMember(
entityManager,
dataSourceMetadata.schema,
workspaceId,
);
await seedViews(
workspaceDataSource,
dataSourceMetadata.schema,
objectMetadataMap,
);
await seedWorkspaceMember(
workspaceDataSource,
dataSourceMetadata.schema,
workspaceId,
await viewPrefillData(
entityManager,
dataSourceMetadata.schema,
objectMetadataMap,
);
},
);
} catch (error) {
console.error(error);

View File

@ -1,12 +1,12 @@
import { DataSource } from 'typeorm';
import { EntityManager } from 'typeorm';
const tableName = 'calendarEvent';
export const seedCalendarEvents = async (
workspaceDataSource: DataSource,
entityManager: EntityManager,
schemaName: string,
) => {
await workspaceDataSource
await entityManager
.createQueryBuilder()
.insert()
.into(`${schemaName}.${tableName}`, [

View File

@ -1,12 +1,12 @@
import { DataSource } from 'typeorm';
import { EntityManager } from 'typeorm';
const tableName = 'company';
export const seedCompanies = async (
workspaceDataSource: DataSource,
entityManager: EntityManager,
schemaName: string,
) => {
await workspaceDataSource
await entityManager
.createQueryBuilder()
.insert()
.into(`${schemaName}.${tableName}`, [

View File

@ -1,12 +1,12 @@
import { DataSource } from 'typeorm';
import { EntityManager } from 'typeorm';
const tableName = 'opportunity';
export const seedOpportunity = async (
workspaceDataSource: DataSource,
entityManager: EntityManager,
schemaName: string,
) => {
await workspaceDataSource
await entityManager
.createQueryBuilder()
.insert()
.into(`${schemaName}.${tableName}`, [
@ -18,7 +18,6 @@ export const seedOpportunity = async (
'probability',
'stage',
'position',
'pipelineStepId',
'pointOfContactId',
'companyId',
])
@ -33,7 +32,6 @@ export const seedOpportunity = async (
probability: 0.5,
stage: 'NEW',
position: 1,
pipelineStepId: '6edf4ead-006a-46e1-9c6d-228f1d0143c9',
pointOfContactId: '86083141-1c0e-494c-a1b6-85b1c6fefaa5',
companyId: 'fe256b39-3ec3-4fe3-8997-b76aa0bfa408',
},
@ -46,7 +44,6 @@ export const seedOpportunity = async (
probability: 0.5,
stage: 'MEETING',
position: 2,
pipelineStepId: 'd8361722-03fb-4e65-bd4f-ec9e52e5ec0a',
pointOfContactId: '93c72d2e-f517-42fd-80ae-14173b3b70ae',
companyId: '118995f3-5d81-46d6-bf83-f7fd33ea6102',
},
@ -59,7 +56,6 @@ export const seedOpportunity = async (
probability: 0.5,
stage: 'PROPOSAL',
position: 3,
pipelineStepId: '30b14887-d592-427d-bd97-6e670158db02',
pointOfContactId: '9b324a88-6784-4449-afdf-dc62cb8702f2',
companyId: '460b6fb1-ed89-413a-b31a-962986e67bb4',
},
@ -72,7 +68,6 @@ export const seedOpportunity = async (
probability: 0.5,
stage: 'PROPOSAL',
position: 4,
pipelineStepId: '30b14887-d592-427d-bd97-6e670158db02',
pointOfContactId: '98406e26-80f1-4dff-b570-a74942528de3',
companyId: '460b6fb1-ed89-413a-b31a-962986e67bb4',
},

View File

@ -1,12 +1,12 @@
import { DataSource } from 'typeorm';
import { EntityManager } from 'typeorm';
const tableName = 'person';
export const seedPeople = async (
workspaceDataSource: DataSource,
entityManager: EntityManager,
schemaName: string,
) => {
await workspaceDataSource
await entityManager
.createQueryBuilder()
.insert()
.into(`${schemaName}.${tableName}`, [

View File

@ -1,47 +0,0 @@
import { DataSource } from 'typeorm';
const tableName = 'pipelineStep';
export const seedPipelineStep = async (
workspaceDataSource: DataSource,
schemaName: string,
) => {
await workspaceDataSource
.createQueryBuilder()
.insert()
.into(`${schemaName}.${tableName}`, ['id', 'name', 'color', 'position'])
.orIgnore()
.values([
{
id: '6edf4ead-006a-46e1-9c6d-228f1d0143c9',
name: 'NEW',
color: 'red',
position: 0,
},
{
id: 'd8361722-03fb-4e65-bd4f-ec9e52e5ec0a',
name: 'SCREENING',
color: 'purple',
position: 1,
},
{
id: '30b14887-d592-427d-bd97-6e670158db02',
name: 'MEETING',
color: 'sky',
position: 2,
},
{
id: 'db5a6648-d80d-4020-af64-4817ab4a12e8',
name: 'PROPOSAL',
color: 'turquoise',
position: 3,
},
{
id: 'bea8bb7b-5467-48a6-9a8a-a8fa500123fe',
name: 'CUSTOMER',
color: 'yellow',
position: 4,
},
])
.execute();
};

View File

@ -1,263 +0,0 @@
import { DataSource } from 'typeorm';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
export const seedViews = async (
workspaceDataSource: DataSource,
schemaName: string,
objectMetadataMap: Record<string, ObjectMetadataEntity>,
) => {
const createdViews = await workspaceDataSource
.createQueryBuilder()
.insert()
.into(`${schemaName}.view`, [
'name',
'objectMetadataId',
'type',
'key',
'position',
'icon',
])
.values([
{
name: 'All Companies',
objectMetadataId: objectMetadataMap['company'].id,
type: 'table',
key: 'INDEX',
position: 0,
icon: 'IconBuildingSkyscraper',
},
{
name: 'All People',
objectMetadataId: objectMetadataMap['person'].id,
type: 'table',
key: 'INDEX',
position: 0,
icon: 'IconUser',
},
{
name: 'By Stage',
objectMetadataId: objectMetadataMap['opportunity'].id,
type: 'kanban',
key: null,
position: 0,
icon: 'IconLayoutKanban',
},
{
name: 'All Opportunities',
objectMetadataId: objectMetadataMap['opportunity'].id,
type: 'table',
key: 'INDEX',
position: 1,
icon: 'IconTargetArrow',
},
])
.returning('*')
.execute();
const viewIdMap = createdViews.raw.reduce((acc, view) => {
acc[`${view.name}`] = view.id;
return acc;
}, {});
await workspaceDataSource
.createQueryBuilder()
.insert()
.into(`${schemaName}.viewField`, [
'fieldMetadataId',
'viewId',
'position',
'isVisible',
'size',
])
.values([
{
fieldMetadataId: objectMetadataMap['company'].fields['name'],
viewId: viewIdMap['All Companies'],
position: 0,
isVisible: true,
size: 180,
},
{
fieldMetadataId: objectMetadataMap['company'].fields['domainName'],
viewId: viewIdMap['All Companies'],
position: 1,
isVisible: true,
size: 100,
},
{
fieldMetadataId: objectMetadataMap['company'].fields['accountOwner'],
viewId: viewIdMap['All Companies'],
position: 2,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['company'].fields['createdAt'],
viewId: viewIdMap['All Companies'],
position: 3,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['company'].fields['employees'],
viewId: viewIdMap['All Companies'],
position: 4,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['company'].fields['linkedinLink'],
viewId: viewIdMap['All Companies'],
position: 5,
isVisible: true,
size: 170,
},
{
fieldMetadataId: objectMetadataMap['company'].fields['address'],
viewId: viewIdMap['All Companies'],
position: 6,
isVisible: true,
size: 170,
},
{
fieldMetadataId: objectMetadataMap['person'].fields['name'],
viewId: viewIdMap['All People'],
position: 0,
isVisible: true,
size: 210,
},
{
fieldMetadataId: objectMetadataMap['person'].fields['email'],
viewId: viewIdMap['All People'],
position: 1,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['person'].fields['company'],
viewId: viewIdMap['All People'],
position: 2,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['person'].fields['phone'],
viewId: viewIdMap['All People'],
position: 3,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['person'].fields['createdAt'],
viewId: viewIdMap['All People'],
position: 4,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['person'].fields['city'],
viewId: viewIdMap['All People'],
position: 5,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['person'].fields['jobTitle'],
viewId: viewIdMap['All People'],
position: 6,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['person'].fields['linkedinLink'],
viewId: viewIdMap['All People'],
position: 7,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['person'].fields['xLink'],
viewId: viewIdMap['All People'],
position: 8,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['opportunity'].fields['name'],
viewId: viewIdMap['All Opportunities'],
position: 0,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'],
viewId: viewIdMap['All Opportunities'],
position: 1,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'],
viewId: viewIdMap['All Opportunities'],
position: 2,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'],
viewId: viewIdMap['All Opportunities'],
position: 3,
isVisible: true,
size: 150,
},
{
fieldMetadataId:
objectMetadataMap['opportunity'].fields['pointOfContact'],
viewId: viewIdMap['All Opportunities'],
position: 4,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['opportunity'].fields['name'],
viewId: viewIdMap['By Stage'],
position: 0,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'],
viewId: viewIdMap['By Stage'],
position: 1,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'],
viewId: viewIdMap['By Stage'],
position: 2,
isVisible: true,
size: 150,
},
{
fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'],
viewId: viewIdMap['By Stage'],
position: 3,
isVisible: true,
size: 150,
},
{
fieldMetadataId:
objectMetadataMap['opportunity'].fields['pointOfContact'],
viewId: viewIdMap['By Stage'],
position: 4,
isVisible: true,
size: 150,
},
])
.execute();
};

View File

@ -1,4 +1,4 @@
import { DataSource } from 'typeorm';
import { EntityManager } from 'typeorm';
import { SeedUserIds } from 'src/database/typeorm-seeds/core/users';
import {
@ -26,7 +26,7 @@ type WorkspaceMembers = Pick<
};
export const seedWorkspaceMember = async (
workspaceDataSource: DataSource,
entityManager: EntityManager,
schemaName: string,
workspaceId: string,
) => {
@ -77,7 +77,7 @@ export const seedWorkspaceMember = async (
},
];
}
await workspaceDataSource
await entityManager
.createQueryBuilder()
.insert()
.into(`${schemaName}.${tableName}`, [