fix: create deterministic uuids for standards relation on custom object (#4642)
* fix: create deterministic uuids for standards relation on custom object * fix: remove check if standardId already exist to override old ones
This commit is contained in:
@ -43,7 +43,10 @@ import {
|
|||||||
eventStandardFieldIds,
|
eventStandardFieldIds,
|
||||||
favoriteStandardFieldIds,
|
favoriteStandardFieldIds,
|
||||||
} from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids';
|
} from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids';
|
||||||
import { createDeterministicUuid } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/create-deterministic-uuid.util';
|
import {
|
||||||
|
createForeignKeyDeterministicUuid,
|
||||||
|
createRelationDeterministicUuid,
|
||||||
|
} from 'src/engine/workspace-manager/workspace-sync-metadata/utils/create-deterministic-uuid.util';
|
||||||
|
|
||||||
import { ObjectMetadataEntity } from './object-metadata.entity';
|
import { ObjectMetadataEntity } from './object-metadata.entity';
|
||||||
|
|
||||||
@ -662,7 +665,10 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
|
|||||||
},
|
},
|
||||||
// TO
|
// TO
|
||||||
{
|
{
|
||||||
standardId: activityTargetStandardFieldIds.custom,
|
standardId: createRelationDeterministicUuid({
|
||||||
|
objectId: createdObjectMetadata.id,
|
||||||
|
standardId: activityTargetStandardFieldIds.custom,
|
||||||
|
}),
|
||||||
objectMetadataId: activityTargetObjectMetadata.id,
|
objectMetadataId: activityTargetObjectMetadata.id,
|
||||||
workspaceId: workspaceId,
|
workspaceId: workspaceId,
|
||||||
isCustom: false,
|
isCustom: false,
|
||||||
@ -677,9 +683,10 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
|
|||||||
},
|
},
|
||||||
// Foreign key
|
// Foreign key
|
||||||
{
|
{
|
||||||
standardId: createDeterministicUuid(
|
standardId: createForeignKeyDeterministicUuid({
|
||||||
activityTargetStandardFieldIds.custom,
|
objectId: createdObjectMetadata.id,
|
||||||
),
|
standardId: activityTargetStandardFieldIds.custom,
|
||||||
|
}),
|
||||||
objectMetadataId: activityTargetObjectMetadata.id,
|
objectMetadataId: activityTargetObjectMetadata.id,
|
||||||
workspaceId: workspaceId,
|
workspaceId: workspaceId,
|
||||||
isCustom: false,
|
isCustom: false,
|
||||||
@ -761,7 +768,10 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
|
|||||||
},
|
},
|
||||||
// TO
|
// TO
|
||||||
{
|
{
|
||||||
standardId: attachmentStandardFieldIds.custom,
|
standardId: createRelationDeterministicUuid({
|
||||||
|
objectId: createdObjectMetadata.id,
|
||||||
|
standardId: attachmentStandardFieldIds.custom,
|
||||||
|
}),
|
||||||
objectMetadataId: attachmentObjectMetadata.id,
|
objectMetadataId: attachmentObjectMetadata.id,
|
||||||
workspaceId: workspaceId,
|
workspaceId: workspaceId,
|
||||||
isCustom: false,
|
isCustom: false,
|
||||||
@ -776,9 +786,10 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
|
|||||||
},
|
},
|
||||||
// Foreign key
|
// Foreign key
|
||||||
{
|
{
|
||||||
standardId: createDeterministicUuid(
|
standardId: createForeignKeyDeterministicUuid({
|
||||||
attachmentStandardFieldIds.custom,
|
objectId: createdObjectMetadata.id,
|
||||||
),
|
standardId: attachmentStandardFieldIds.custom,
|
||||||
|
}),
|
||||||
objectMetadataId: attachmentObjectMetadata.id,
|
objectMetadataId: attachmentObjectMetadata.id,
|
||||||
workspaceId: workspaceId,
|
workspaceId: workspaceId,
|
||||||
isCustom: false,
|
isCustom: false,
|
||||||
@ -857,7 +868,10 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
|
|||||||
},
|
},
|
||||||
// TO
|
// TO
|
||||||
{
|
{
|
||||||
standardId: eventStandardFieldIds.custom,
|
standardId: createRelationDeterministicUuid({
|
||||||
|
objectId: createdObjectMetadata.id,
|
||||||
|
standardId: eventStandardFieldIds.custom,
|
||||||
|
}),
|
||||||
objectMetadataId: eventObjectMetadata.id,
|
objectMetadataId: eventObjectMetadata.id,
|
||||||
workspaceId: workspaceId,
|
workspaceId: workspaceId,
|
||||||
isCustom: false,
|
isCustom: false,
|
||||||
@ -872,7 +886,10 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
|
|||||||
},
|
},
|
||||||
// Foreign key
|
// Foreign key
|
||||||
{
|
{
|
||||||
standardId: createDeterministicUuid(eventStandardFieldIds.custom),
|
standardId: createForeignKeyDeterministicUuid({
|
||||||
|
objectId: createdObjectMetadata.id,
|
||||||
|
standardId: eventStandardFieldIds.custom,
|
||||||
|
}),
|
||||||
objectMetadataId: eventObjectMetadata.id,
|
objectMetadataId: eventObjectMetadata.id,
|
||||||
workspaceId: workspaceId,
|
workspaceId: workspaceId,
|
||||||
isCustom: false,
|
isCustom: false,
|
||||||
@ -952,7 +969,10 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
|
|||||||
},
|
},
|
||||||
// TO
|
// TO
|
||||||
{
|
{
|
||||||
standardId: favoriteStandardFieldIds.custom,
|
standardId: createRelationDeterministicUuid({
|
||||||
|
objectId: createdObjectMetadata.id,
|
||||||
|
standardId: favoriteStandardFieldIds.custom,
|
||||||
|
}),
|
||||||
objectMetadataId: favoriteObjectMetadata.id,
|
objectMetadataId: favoriteObjectMetadata.id,
|
||||||
workspaceId: workspaceId,
|
workspaceId: workspaceId,
|
||||||
isCustom: false,
|
isCustom: false,
|
||||||
@ -967,7 +987,10 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
|
|||||||
},
|
},
|
||||||
// Foreign key
|
// Foreign key
|
||||||
{
|
{
|
||||||
standardId: createDeterministicUuid(favoriteStandardFieldIds.custom),
|
standardId: createForeignKeyDeterministicUuid({
|
||||||
|
objectId: createdObjectMetadata.id,
|
||||||
|
standardId: favoriteStandardFieldIds.custom,
|
||||||
|
}),
|
||||||
objectMetadataId: favoriteObjectMetadata.id,
|
objectMetadataId: favoriteObjectMetadata.id,
|
||||||
workspaceId: workspaceId,
|
workspaceId: workspaceId,
|
||||||
isCustom: false,
|
isCustom: false,
|
||||||
|
|||||||
@ -120,10 +120,7 @@ export class AddStandardIdCommand extends CommandRunner {
|
|||||||
customObjectMetadataCollection,
|
customObjectMetadataCollection,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (
|
if (!originalObjectMetadata.isCustom) {
|
||||||
!originalObjectMetadata.isCustom &&
|
|
||||||
!originalObjectMetadata.standardId
|
|
||||||
) {
|
|
||||||
updateObjectMetadataCollection.push({
|
updateObjectMetadataCollection.push({
|
||||||
id: originalObjectMetadata.id,
|
id: originalObjectMetadata.id,
|
||||||
standardId: computedStandardObjectMetadata.standardId,
|
standardId: computedStandardObjectMetadata.standardId,
|
||||||
@ -136,7 +133,7 @@ export class AddStandardIdCommand extends CommandRunner {
|
|||||||
(field) => field.name === fieldMetadata.name && !field.isCustom,
|
(field) => field.name === fieldMetadata.name && !field.isCustom,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!standardFieldMetadata || fieldMetadata.standardId) {
|
if (!standardFieldMetadata) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,10 @@ import { ComputedPartialFieldMetadata } from 'src/engine/workspace-manager/works
|
|||||||
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
||||||
import { generateTargetColumnMap } from 'src/engine/metadata-modules/field-metadata/utils/generate-target-column-map.util';
|
import { generateTargetColumnMap } from 'src/engine/metadata-modules/field-metadata/utils/generate-target-column-map.util';
|
||||||
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||||
import { createDeterministicUuid } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/create-deterministic-uuid.util';
|
import {
|
||||||
|
createForeignKeyDeterministicUuid,
|
||||||
|
createRelationDeterministicUuid,
|
||||||
|
} from 'src/engine/workspace-manager/workspace-sync-metadata/utils/create-deterministic-uuid.util';
|
||||||
|
|
||||||
export const computeStandardObject = (
|
export const computeStandardObject = (
|
||||||
standardObjectMetadata: Omit<PartialObjectMetadata, 'standardId'> & {
|
standardObjectMetadata: Omit<PartialObjectMetadata, 'standardId'> & {
|
||||||
@ -24,11 +27,20 @@ export const computeStandardObject = (
|
|||||||
for (const customObjectMetadata of customObjectMetadataCollection) {
|
for (const customObjectMetadata of customObjectMetadataCollection) {
|
||||||
const { paramsFactory, ...rest } = partialFieldMetadata;
|
const { paramsFactory, ...rest } = partialFieldMetadata;
|
||||||
const { joinColumn, ...data } = paramsFactory(customObjectMetadata);
|
const { joinColumn, ...data } = paramsFactory(customObjectMetadata);
|
||||||
|
const relationStandardId = createRelationDeterministicUuid({
|
||||||
|
objectId: customObjectMetadata.id,
|
||||||
|
standardId: data.standardId,
|
||||||
|
});
|
||||||
|
const foreignKeyStandardId = createForeignKeyDeterministicUuid({
|
||||||
|
objectId: customObjectMetadata.id,
|
||||||
|
standardId: data.standardId,
|
||||||
|
});
|
||||||
|
|
||||||
// Relation
|
// Relation
|
||||||
fields.push({
|
fields.push({
|
||||||
...data,
|
...data,
|
||||||
...rest,
|
...rest,
|
||||||
|
standardId: relationStandardId,
|
||||||
defaultValue: null,
|
defaultValue: null,
|
||||||
targetColumnMap: {},
|
targetColumnMap: {},
|
||||||
});
|
});
|
||||||
@ -36,7 +48,7 @@ export const computeStandardObject = (
|
|||||||
// Foreign key
|
// Foreign key
|
||||||
fields.push({
|
fields.push({
|
||||||
...rest,
|
...rest,
|
||||||
standardId: createDeterministicUuid(data.standardId),
|
standardId: foreignKeyStandardId,
|
||||||
name: joinColumn,
|
name: joinColumn,
|
||||||
type: FieldMetadataType.UUID,
|
type: FieldMetadataType.UUID,
|
||||||
label: `${data.label} ID (foreign key)`,
|
label: `${data.label} ID (foreign key)`,
|
||||||
|
|||||||
@ -1,10 +1,35 @@
|
|||||||
import { createHash } from 'crypto';
|
import { createHash } from 'crypto';
|
||||||
|
|
||||||
export const createDeterministicUuid = (inputUuid: string): string => {
|
export function createDeterministicUuid(uuid: string): string;
|
||||||
const hash = createHash('sha256').update(inputUuid).digest('hex');
|
export function createDeterministicUuid(uuids: string[]): string;
|
||||||
|
|
||||||
|
export function createDeterministicUuid(
|
||||||
|
uuidOrUuids: string[] | string,
|
||||||
|
): string {
|
||||||
|
const inputForHash = Array.isArray(uuidOrUuids)
|
||||||
|
? uuidOrUuids.join('-')
|
||||||
|
: uuidOrUuids;
|
||||||
|
const hash = createHash('sha256').update(inputForHash).digest('hex');
|
||||||
|
|
||||||
return `20202020-${hash.substring(0, 4)}-4${hash.substring(
|
return `20202020-${hash.substring(0, 4)}-4${hash.substring(
|
||||||
4,
|
4,
|
||||||
7,
|
7,
|
||||||
)}-8${hash.substring(7, 10)}-${hash.substring(10, 22)}`;
|
)}-8${hash.substring(7, 10)}-${hash.substring(10, 22)}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
type UuidPair = {
|
||||||
|
objectId: string;
|
||||||
|
standardId: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const createRelationDeterministicUuid = (uuidPair: UuidPair): string => {
|
||||||
|
// Chaging the order in the array will result in different UUIDs
|
||||||
|
return createDeterministicUuid([uuidPair.objectId, uuidPair.standardId]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const createForeignKeyDeterministicUuid = (
|
||||||
|
uuidPair: UuidPair,
|
||||||
|
): string => {
|
||||||
|
// Chaging the order in the array will result in different UUIDs
|
||||||
|
return createDeterministicUuid([uuidPair.standardId, uuidPair.objectId]);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user