Improve Metadata sync setup (#2874)

* Improve Metadata sync setup

* add missing IsNullable()

* add composite fields types
This commit is contained in:
Weiko
2023-12-08 12:27:47 +01:00
committed by GitHub
parent 63196f866f
commit 53b6005d73
21 changed files with 164 additions and 78 deletions

View File

@ -47,3 +47,8 @@ export const currencyObjectDefinition = {
fromRelations: [],
toRelations: [],
} satisfies ObjectMetadataInterface;
export type CurrencyMetadata = {
amountMicros: number;
currencyCode: string;
}

View File

@ -43,3 +43,8 @@ export const fullNameObjectDefinition = {
fromRelations: [],
toRelations: [],
} satisfies ObjectMetadataInterface;
export type FullNameMetadata = {
firstName: string;
lastName: string;
}

View File

@ -43,3 +43,8 @@ export const linkObjectDefinition = {
fromRelations: [],
toRelations: [],
} satisfies ObjectMetadataInterface;
export type LinkMetadata = {
label: string;
url: string;
}

View File

@ -16,7 +16,7 @@ import { fullNameFields } from 'src/metadata/field-metadata/composite-types/full
import { currencyFields } from 'src/metadata/field-metadata/composite-types/currency.composite-type';
import { linkFields } from 'src/metadata/field-metadata/composite-types/link.composite-type';
type CompositeFieldSplitterFunction = (
type CompositeFieldsDefinitionFunction = (
fieldMetadata: FieldMetadataInterface,
) => FieldMetadataInterface[];
@ -32,7 +32,7 @@ export class WorkspaceMigrationFactory {
>;
private compositeDefinitions = new Map<
string,
CompositeFieldSplitterFunction
CompositeFieldsDefinitionFunction
>();
constructor(
@ -90,7 +90,7 @@ export class WorkspaceMigrationFactory {
],
]);
this.compositeDefinitions = new Map<string, CompositeFieldSplitterFunction>(
this.compositeDefinitions = new Map<string, CompositeFieldsDefinitionFunction>(
[
[FieldMetadataType.LINK, linkFields],
[FieldMetadataType.CURRENCY, currencyFields],

View File

@ -8,14 +8,14 @@ import { generateTargetColumnMap } from 'src/metadata/field-metadata/utils/gener
import { RelationMetadataType } from 'src/metadata/relation-metadata/relation-metadata.entity';
import { generateDefaultValue } from 'src/metadata/field-metadata/utils/generate-default-value';
export type FieldMetadataDecorator = {
type: FieldMetadataType;
export interface FieldMetadataDecorator<T extends FieldMetadataType> {
type: T;
label: string;
description?: string | null;
icon?: string | null;
defaultValue?: FieldMetadataDefaultValue | null;
defaultValue?: FieldMetadataDefaultValue<T> | null;
joinColumn?: string;
};
}
export type ObjectMetadataDecorator = {
namePlural: string;
@ -82,8 +82,8 @@ export function IsSystem() {
};
}
export function FieldMetadata(
metadata: FieldMetadataDecorator,
export function FieldMetadata<T extends FieldMetadataType>(
metadata: FieldMetadataDecorator<T>,
): PropertyDecorator {
return (target: object, fieldKey: string) => {
const existingFieldMetadata =
@ -100,7 +100,7 @@ export function FieldMetadata(
'fieldMetadata',
{
...existingFieldMetadata,
[fieldKey]: generateFieldMetadata(
[fieldKey]: generateFieldMetadata<T>(
fieldMetadata,
fieldKey,
isNullable,
@ -108,7 +108,7 @@ export function FieldMetadata(
),
...(joinColumn && fieldMetadata.type === FieldMetadataType.RELATION
? {
[joinColumn]: generateFieldMetadata(
[joinColumn]: generateFieldMetadata<FieldMetadataType.UUID>(
{
...fieldMetadata,
type: FieldMetadataType.UUID,
@ -128,8 +128,8 @@ export function FieldMetadata(
};
}
function generateFieldMetadata(
metadata: FieldMetadataDecorator,
function generateFieldMetadata<T extends FieldMetadataType>(
metadata: FieldMetadataDecorator<T>,
fieldKey: string,
isNullable: boolean,
isSystem: boolean,

View File

@ -5,7 +5,10 @@ import {
IsSystem,
IsNullable,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { ActivityObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/activity.object-metadata';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { CompanyObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/company.object-metadata';
import { PersonObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/person.object-metadata';
@ObjectMetadata({
namePlural: 'activityTargets',
@ -23,7 +26,7 @@ export class ActivityTargetObjectMetadata extends BaseObjectMetadata {
icon: 'IconNotes',
joinColumn: 'activityId',
})
activity: object;
activity: ActivityObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -33,7 +36,7 @@ export class ActivityTargetObjectMetadata extends BaseObjectMetadata {
joinColumn: 'personId',
})
@IsNullable()
person: object;
person: PersonObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -43,5 +46,5 @@ export class ActivityTargetObjectMetadata extends BaseObjectMetadata {
joinColumn: 'companyId',
})
@IsNullable()
company: object;
company: CompanyObjectMetadata;
}

View File

@ -7,7 +7,11 @@ import {
FieldMetadata,
RelationMetadata,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { ActivityTargetObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/activity-target.object-metadata';
import { AttachmentObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/attachment.object-metadata';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { CommentObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/comment.object-metadata';
import { WorkspaceMemberObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/workspace-member.object-metadata';
@ObjectMetadata({
namePlural: 'activities',
@ -82,7 +86,8 @@ export class ActivityObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'activityTarget',
})
activityTargets: object[];
@IsNullable()
activityTargets: ActivityTargetObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -94,7 +99,8 @@ export class ActivityObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'attachment',
})
attachments: object[];
@IsNullable()
attachments: AttachmentObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -106,7 +112,8 @@ export class ActivityObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'comment',
})
comments: object[];
@IsNullable()
comments: CommentObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -115,7 +122,7 @@ export class ActivityObjectMetadata extends BaseObjectMetadata {
icon: 'IconUserCircle',
joinColumn: 'authorId',
})
author: object;
author: WorkspaceMemberObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -124,5 +131,5 @@ export class ActivityObjectMetadata extends BaseObjectMetadata {
icon: 'IconUserCircle',
joinColumn: 'assigneeId',
})
assignee: object;
assignee: WorkspaceMemberObjectMetadata;
}

View File

@ -5,7 +5,11 @@ import {
FieldMetadata,
IsNullable,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { ActivityObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/activity.object-metadata';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { CompanyObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/company.object-metadata';
import { PersonObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/person.object-metadata';
import { WorkspaceMemberObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/workspace-member.object-metadata';
@ObjectMetadata({
namePlural: 'attachments',
@ -47,7 +51,7 @@ export class AttachmentObjectMetadata extends BaseObjectMetadata {
icon: 'IconCircleUser',
joinColumn: 'authorId',
})
author: string;
author: WorkspaceMemberObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -56,7 +60,7 @@ export class AttachmentObjectMetadata extends BaseObjectMetadata {
icon: 'IconNotes',
joinColumn: 'activityId',
})
activity: string;
activity: ActivityObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -66,7 +70,7 @@ export class AttachmentObjectMetadata extends BaseObjectMetadata {
joinColumn: 'personId',
})
@IsNullable()
person: string;
person: PersonObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -76,5 +80,5 @@ export class AttachmentObjectMetadata extends BaseObjectMetadata {
joinColumn: 'companyId',
})
@IsNullable()
company: string;
company: CompanyObjectMetadata;
}

View File

@ -4,7 +4,9 @@ import {
IsSystem,
FieldMetadata,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { ActivityObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/activity.object-metadata';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { WorkspaceMemberObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/workspace-member.object-metadata';
@ObjectMetadata({
namePlural: 'comments',
@ -31,7 +33,7 @@ export class CommentObjectMetadata extends BaseObjectMetadata {
icon: 'IconCircleUser',
joinColumn: 'authorId',
})
author: string;
author: WorkspaceMemberObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -40,5 +42,5 @@ export class CommentObjectMetadata extends BaseObjectMetadata {
icon: 'IconNotes',
joinColumn: 'activityId',
})
activity: string;
activity: ActivityObjectMetadata;
}

View File

@ -1,3 +1,5 @@
import { CurrencyMetadata } from 'src/metadata/field-metadata/composite-types/currency.composite-type';
import { LinkMetadata } from 'src/metadata/field-metadata/composite-types/link.composite-type';
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
import { RelationMetadataType } from 'src/metadata/relation-metadata/relation-metadata.entity';
import {
@ -6,7 +8,13 @@ import {
IsNullable,
RelationMetadata,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { ActivityTargetObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/activity-target.object-metadata';
import { AttachmentObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/attachment.object-metadata';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { FavoriteObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/favorite.object-metadata';
import { OpportunityObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/opportunity.object-metadata';
import { PersonObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/person.object-metadata';
import { WorkspaceMemberObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/workspace-member.object-metadata';
@ObjectMetadata({
namePlural: 'companies',
@ -59,7 +67,7 @@ export class CompanyObjectMetadata extends BaseObjectMetadata {
icon: 'IconBrandLinkedin',
})
@IsNullable()
linkedinLink: string;
linkedinLink: LinkMetadata;
@FieldMetadata({
type: FieldMetadataType.LINK,
@ -68,7 +76,7 @@ export class CompanyObjectMetadata extends BaseObjectMetadata {
icon: 'IconBrandX',
})
@IsNullable()
xLink: string;
xLink: LinkMetadata;
@FieldMetadata({
type: FieldMetadataType.CURRENCY,
@ -78,7 +86,7 @@ export class CompanyObjectMetadata extends BaseObjectMetadata {
icon: 'IconMoneybag',
})
@IsNullable()
annualRecurringRevenue: number;
annualRecurringRevenue: CurrencyMetadata;
@FieldMetadata({
type: FieldMetadataType.BOOLEAN,
@ -101,7 +109,8 @@ export class CompanyObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'person',
})
people: object[];
@IsNullable()
people: PersonObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -112,7 +121,7 @@ export class CompanyObjectMetadata extends BaseObjectMetadata {
joinColumn: 'accountOwnerId',
})
@IsNullable()
accountOwner: string;
accountOwner: WorkspaceMemberObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -124,7 +133,8 @@ export class CompanyObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'activityTarget',
})
activityTargets: object[];
@IsNullable()
activityTargets: ActivityTargetObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -136,7 +146,8 @@ export class CompanyObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'opportunity',
})
opportunities: object[];
@IsNullable()
opportunities: OpportunityObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -148,7 +159,8 @@ export class CompanyObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'favorite',
})
favorites: object[];
@IsNullable()
favorites: FavoriteObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -160,5 +172,6 @@ export class CompanyObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'attachment',
})
attachments: object[];
@IsNullable()
attachments: AttachmentObjectMetadata[];
}

View File

@ -5,6 +5,9 @@ import {
FieldMetadata,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { CompanyObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/company.object-metadata';
import { PersonObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/person.object-metadata';
import { WorkspaceMemberObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/workspace-member.object-metadata';
@ObjectMetadata({
namePlural: 'favorites',
@ -32,7 +35,7 @@ export class FavoriteObjectMetadata extends BaseObjectMetadata {
icon: 'IconCircleUser',
joinColumn: 'workspaceMemberId',
})
workspaceMember: object;
workspaceMember: WorkspaceMemberObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -41,7 +44,7 @@ export class FavoriteObjectMetadata extends BaseObjectMetadata {
icon: 'IconUser',
joinColumn: 'personId',
})
person: object;
person: PersonObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -50,5 +53,5 @@ export class FavoriteObjectMetadata extends BaseObjectMetadata {
icon: 'IconBuildingSkyscraper',
joinColumn: 'companyId',
})
company: object;
company: CompanyObjectMetadata;
}

View File

@ -1,3 +1,4 @@
import { CurrencyMetadata } from 'src/metadata/field-metadata/composite-types/currency.composite-type';
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
import {
ObjectMetadata,
@ -6,6 +7,9 @@ import {
IsNullable,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { CompanyObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/company.object-metadata';
import { PersonObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/person.object-metadata';
import { PipelineStepObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/pipeline-step.object-metadata';
@ObjectMetadata({
namePlural: 'opportunities',
@ -22,7 +26,7 @@ export class OpportunityObjectMetadata extends BaseObjectMetadata {
icon: 'IconCurrencyDollar',
})
@IsNullable()
amount: string;
amount: CurrencyMetadata;
@FieldMetadata({
type: FieldMetadataType.DATE_TIME,
@ -31,7 +35,7 @@ export class OpportunityObjectMetadata extends BaseObjectMetadata {
icon: 'IconCalendarEvent',
})
@IsNullable()
closeDate: string;
closeDate: Date;
@FieldMetadata({
type: FieldMetadataType.TEXT,
@ -52,7 +56,7 @@ export class OpportunityObjectMetadata extends BaseObjectMetadata {
joinColumn: 'pipelineStepId',
})
@IsNullable()
pipelineStep: string;
pipelineStep: PipelineStepObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -62,7 +66,7 @@ export class OpportunityObjectMetadata extends BaseObjectMetadata {
joinColumn: 'pointOfContactId',
})
@IsNullable()
pointOfContact: string;
pointOfContact: PersonObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -71,7 +75,7 @@ export class OpportunityObjectMetadata extends BaseObjectMetadata {
icon: 'IconUser',
joinColumn: 'personId',
})
person: string;
person: PersonObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -81,5 +85,5 @@ export class OpportunityObjectMetadata extends BaseObjectMetadata {
joinColumn: 'companyId',
})
@IsNullable()
company: string;
company: CompanyObjectMetadata;
}

View File

@ -1,3 +1,5 @@
import { FullNameMetadata } from 'src/metadata/field-metadata/composite-types/full-name.composite-type';
import { LinkMetadata } from 'src/metadata/field-metadata/composite-types/link.composite-type';
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
import { RelationMetadataType } from 'src/metadata/relation-metadata/relation-metadata.entity';
import {
@ -7,7 +9,12 @@ import {
RelationMetadata,
IsSystem,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { ActivityTargetObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/activity-target.object-metadata';
import { AttachmentObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/attachment.object-metadata';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { CompanyObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/company.object-metadata';
import { FavoriteObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/favorite.object-metadata';
import { OpportunityObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/opportunity.object-metadata';
@ObjectMetadata({
namePlural: 'people',
@ -24,7 +31,7 @@ export class PersonObjectMetadata extends BaseObjectMetadata {
icon: 'IconUser',
})
@IsNullable()
name: string;
name: FullNameMetadata;
@FieldMetadata({
type: FieldMetadataType.EMAIL,
@ -42,7 +49,7 @@ export class PersonObjectMetadata extends BaseObjectMetadata {
icon: 'IconBrandLinkedin',
})
@IsNullable()
linkedinLink: string;
linkedinLink: LinkMetadata;
@FieldMetadata({
type: FieldMetadataType.LINK,
@ -51,7 +58,7 @@ export class PersonObjectMetadata extends BaseObjectMetadata {
icon: 'IconBrandX',
})
@IsNullable()
xLink: string;
xLink: LinkMetadata;
@FieldMetadata({
type: FieldMetadataType.TEXT,
@ -99,7 +106,7 @@ export class PersonObjectMetadata extends BaseObjectMetadata {
joinColumn: 'companyId',
})
@IsNullable()
company: string;
company: CompanyObjectMetadata;
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -112,7 +119,8 @@ export class PersonObjectMetadata extends BaseObjectMetadata {
objectName: 'opportunity',
inverseSideFieldName: 'pointOfContact',
})
pointOfContactForOpportunities: object[];
@IsNullable()
pointOfContactForOpportunities: OpportunityObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -124,7 +132,8 @@ export class PersonObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'activityTarget',
})
activityTargets: object[];
@IsNullable()
activityTargets: ActivityTargetObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -136,7 +145,8 @@ export class PersonObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'opportunity',
})
opportunities: object[];
@IsNullable()
opportunities: OpportunityObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -148,7 +158,8 @@ export class PersonObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'favorite',
})
favorites: object[];
@IsNullable()
favorites: FavoriteObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -160,5 +171,6 @@ export class PersonObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'attachment',
})
attachments: object[];
@IsNullable()
attachments: AttachmentObjectMetadata[];
}

View File

@ -8,6 +8,7 @@ import {
RelationMetadata,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { OpportunityObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/opportunity.object-metadata';
@ObjectMetadata({
namePlural: 'pipelineSteps',
@ -58,5 +59,5 @@ export class PipelineStepObjectMetadata extends BaseObjectMetadata {
objectName: 'opportunity',
})
@IsNullable()
opportunities: object[];
opportunities: OpportunityObjectMetadata[];
}

View File

@ -6,6 +6,7 @@ import {
IsNullable,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { ViewObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/view.object-metadata';
@ObjectMetadata({
namePlural: 'viewFields',
@ -59,5 +60,5 @@ export class ViewFieldObjectMetadata extends BaseObjectMetadata {
joinColumn: 'viewId',
})
@IsNullable()
view?: object;
view?: ViewObjectMetadata;
}

View File

@ -6,6 +6,7 @@ import {
IsNullable,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { ViewObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/view.object-metadata';
@ObjectMetadata({
namePlural: 'viewFilters',
@ -59,5 +60,5 @@ export class ViewFilterObjectMetadata extends BaseObjectMetadata {
joinColumn: 'viewId',
})
@IsNullable()
view: string;
view: ViewObjectMetadata;
}

View File

@ -6,6 +6,7 @@ import {
IsSystem,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { ViewObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/view.object-metadata';
@ObjectMetadata({
namePlural: 'viewSorts',
@ -41,5 +42,5 @@ export class ViewSortObjectMetadata extends BaseObjectMetadata {
joinColumn: 'viewId',
})
@IsNullable()
view: string;
view: ViewObjectMetadata;
}

View File

@ -5,8 +5,12 @@ import {
IsSystem,
FieldMetadata,
RelationMetadata,
IsNullable,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { ViewFieldObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/view-field.object-metadata';
import { ViewFilterObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/view-filter.object-metadata';
import { ViewSortObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/view-sort.object-metadata';
@ObjectMetadata({
namePlural: 'views',
@ -53,7 +57,8 @@ export class ViewObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'viewField',
})
viewFields: object[];
@IsNullable()
viewFields: ViewFieldObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -65,7 +70,8 @@ export class ViewObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'viewFilter',
})
viewFilters: object[];
@IsNullable()
viewFilters: ViewFilterObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -77,5 +83,6 @@ export class ViewObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'viewSort',
})
viewSorts: object[];
@IsNullable()
viewSorts: ViewSortObjectMetadata[];
}

View File

@ -20,7 +20,6 @@ export class WebhookObjectMetadata extends BaseObjectMetadata {
label: 'Target Url',
description: 'Webhook target url',
icon: 'IconLink',
defaultValue: { value: '' },
})
targetUrl: string;
@ -29,7 +28,6 @@ export class WebhookObjectMetadata extends BaseObjectMetadata {
label: 'Operation',
description: 'Webhook operation',
icon: 'IconCheckbox',
defaultValue: { value: '' },
})
operation: string;
}

View File

@ -1,3 +1,4 @@
import { FullNameMetadata } from 'src/metadata/field-metadata/composite-types/full-name.composite-type';
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
import { RelationMetadataType } from 'src/metadata/relation-metadata/relation-metadata.entity';
import {
@ -7,7 +8,12 @@ import {
IsNullable,
RelationMetadata,
} from 'src/workspace/workspace-sync-metadata/decorators/metadata.decorator';
import { ActivityObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/activity.object-metadata';
import { AttachmentObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/attachment.object-metadata';
import { BaseObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/base.object-metadata';
import { CommentObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/comment.object-metadata';
import { CompanyObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/company.object-metadata';
import { FavoriteObjectMetadata } from 'src/workspace/workspace-sync-metadata/standard-objects/favorite.object-metadata';
@ObjectMetadata({
namePlural: 'workspaceMembers',
@ -24,7 +30,7 @@ export class WorkspaceMemberObjectMetadata extends BaseObjectMetadata {
description: 'Workspace member name',
icon: 'IconCircleUser',
})
name: string;
name: FullNameMetadata;
@FieldMetadata({
type: FieldMetadataType.TEXT,
@ -49,9 +55,7 @@ export class WorkspaceMemberObjectMetadata extends BaseObjectMetadata {
label: 'Avatar Url',
description: 'Workspace member avatar',
icon: 'IconFileUpload',
defaultValue: { value: '' },
})
@IsNullable()
avatarUrl: string;
@FieldMetadata({
@ -74,7 +78,8 @@ export class WorkspaceMemberObjectMetadata extends BaseObjectMetadata {
objectName: 'activity',
inverseSideFieldName: 'author',
})
authoredActivities: object[];
@IsNullable()
authoredActivities: ActivityObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -87,7 +92,8 @@ export class WorkspaceMemberObjectMetadata extends BaseObjectMetadata {
objectName: 'activity',
inverseSideFieldName: 'assignee',
})
assignedActivities: object[];
@IsNullable()
assignedActivities: ActivityObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -99,7 +105,8 @@ export class WorkspaceMemberObjectMetadata extends BaseObjectMetadata {
type: RelationMetadataType.ONE_TO_MANY,
objectName: 'favorite',
})
favorites: object[];
@IsNullable()
favorites: FavoriteObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -112,7 +119,8 @@ export class WorkspaceMemberObjectMetadata extends BaseObjectMetadata {
objectName: 'company',
inverseSideFieldName: 'accountOwner',
})
accountOwnerForCompanies: object[];
@IsNullable()
accountOwnerForCompanies: CompanyObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -125,7 +133,8 @@ export class WorkspaceMemberObjectMetadata extends BaseObjectMetadata {
objectName: 'attachment',
inverseSideFieldName: 'author',
})
authoredAttachments: object[];
@IsNullable()
authoredAttachments: AttachmentObjectMetadata[];
@FieldMetadata({
type: FieldMetadataType.RELATION,
@ -138,5 +147,6 @@ export class WorkspaceMemberObjectMetadata extends BaseObjectMetadata {
objectName: 'comment',
inverseSideFieldName: 'author',
})
authoredComments: object[];
@IsNullable()
authoredComments: CommentObjectMetadata[];
}

View File

@ -34,12 +34,12 @@ export class MetadataParser {
}
static parseAllMetadata(
metadata: (typeof BaseObjectMetadata)[],
metadataCollection: (typeof BaseObjectMetadata)[],
workspaceId: string,
dataSourceId: string,
) {
return metadata.map((_metadata) =>
MetadataParser.parseMetadata(_metadata, workspaceId, dataSourceId),
return metadataCollection.map((metadata) =>
MetadataParser.parseMetadata(metadata, workspaceId, dataSourceId),
);
}
@ -61,6 +61,7 @@ export class MetadataParser {
`Object ${relation.fromObjectNameSingular} not found in DB
for relation defined in class ${objectMetadata.nameSingular}`,
);
const toObjectMetadata =
objectMetadataFromDB[relation.toObjectNameSingular];
assert(
@ -68,6 +69,7 @@ export class MetadataParser {
`Object ${relation.toObjectNameSingular} not found in DB
for relation defined in class ${objectMetadata.nameSingular}`,
);
const fromFieldMetadata =
fromObjectMetadata?.fields[relation.fromFieldMetadataName];
assert(
@ -75,6 +77,7 @@ export class MetadataParser {
`Field ${relation.fromFieldMetadataName} not found in object ${relation.fromObjectNameSingular}
for relation defined in class ${objectMetadata.nameSingular}`,
);
const toFieldMetadata =
toObjectMetadata?.fields[relation.toFieldMetadataName];
assert(
@ -82,6 +85,7 @@ export class MetadataParser {
`Field ${relation.toFieldMetadataName} not found in object ${relation.toObjectNameSingular}
for relation defined in class ${objectMetadata.nameSingular}`,
);
return {
relationType: relation.type,
fromObjectMetadataId: fromObjectMetadata?.id,
@ -94,13 +98,13 @@ export class MetadataParser {
}
static parseAllRelations(
metadata: (typeof BaseObjectMetadata)[],
metadataCollection: (typeof BaseObjectMetadata)[],
workspaceId: string,
objectMetadataFromDB: Record<string, ObjectMetadataEntity>,
) {
return metadata.flatMap((_metadata) =>
return metadataCollection.flatMap((metadata) =>
MetadataParser.parseRelationMetadata(
_metadata,
metadata,
workspaceId,
objectMetadataFromDB,
),