diff --git a/packages/syncing-server/migrations/mysql/1685276859271-allow_item_user_uuid_to_be_null.ts b/packages/syncing-server/migrations/mysql/1685276859271-allow_item_user_uuid_to_be_null.ts deleted file mode 100644 index 4f3042b48..000000000 --- a/packages/syncing-server/migrations/mysql/1685276859271-allow_item_user_uuid_to_be_null.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm' - -export class AllowItemUserUuidToBeNull1685276859271 implements MigrationInterface { - name = 'allowItemUserUuidToBeNull1685276859271' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.changeColumn( - 'items', - 'user_uuid', - new TableColumn({ - name: 'user_uuid', - type: 'varchar', - length: '36', - isNullable: true, - }), - ) - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.changeColumn( - 'items', - 'user_uuid', - new TableColumn({ - name: 'user_uuid', - type: 'varchar', - length: '36', - isNullable: false, - }), - ) - } -} diff --git a/packages/syncing-server/src/Domain/Item/Item.ts b/packages/syncing-server/src/Domain/Item/Item.ts index 10849415b..aa0073e4e 100644 --- a/packages/syncing-server/src/Domain/Item/Item.ts +++ b/packages/syncing-server/src/Domain/Item/Item.ts @@ -78,10 +78,9 @@ export class Item { name: 'user_uuid', length: 36, type: 'varchar', - nullable: true, }) @Index('index_items_on_user_uuid') - declare userUuid: string | null + declare userUuid: string @Column({ name: 'last_edited_by_uuid', diff --git a/packages/syncing-server/src/Domain/Item/ItemService.ts b/packages/syncing-server/src/Domain/Item/ItemService.ts index 282023876..5c00b5893 100644 --- a/packages/syncing-server/src/Domain/Item/ItemService.ts +++ b/packages/syncing-server/src/Domain/Item/ItemService.ts @@ -213,10 +213,8 @@ export class ItemService implements ItemServiceInterface { if (dto.itemHash.vault_uuid) { dto.existingItem.vaultUuid = dto.itemHash.vault_uuid - dto.existingItem.userUuid = null } else { dto.existingItem.vaultUuid = null - dto.existingItem.userUuid = dto.userUuid } if (dto.itemHash.content) { diff --git a/packages/syncing-server/src/Domain/Item/SaveRule/VaultFilter.ts b/packages/syncing-server/src/Domain/Item/SaveRule/VaultFilter.ts index 86ca6a133..383e20701 100644 --- a/packages/syncing-server/src/Domain/Item/SaveRule/VaultFilter.ts +++ b/packages/syncing-server/src/Domain/Item/SaveRule/VaultFilter.ts @@ -15,6 +15,7 @@ import { SaveToVaultSaveOperation, CreateToVaultSaveOperation, } from './VaultSaveOperation' +import { Item } from '../Item' export class VaultFilter implements ItemSaveRuleInterface { constructor(private vaultService: VaultServiceInterface, private vaultUserService: VaultUserServiceInterface) {} @@ -116,11 +117,12 @@ export class VaultFilter implements ItemSaveRuleInterface { return true } - private buildFailResult(operation: VaultSaveOperation, type: ConflictType) { + private buildFailResult(operation: VaultSaveOperation, type: ConflictType, serverItem?: Item) { return { passed: false, conflict: { unsavedItem: operation.incomingItem, + serverItem, type, }, } @@ -156,7 +158,7 @@ export class VaultFilter implements ItemSaveRuleInterface { const usesValidKey = await this.incomingItemUsesValidItemsKey(operation.incomingItem) if (!usesValidKey) { - return this.buildFailResult(operation, ConflictType.VaultInvalidItemsKey) + return this.buildFailResult(operation, ConflictType.VaultInvalidItemsKey, operation.existingItem) } return this.buildSuccessValue() @@ -172,6 +174,10 @@ export class VaultFilter implements ItemSaveRuleInterface { return this.buildFailResult(operation, ConflictType.VaultInvalidState) } + if (operation.existingItem.userUuid === operation.userUuid) { + return this.buildSuccessValue() + } + if (!this.isAuthorizedToSaveContentType(operation.incomingItem.content_type, vaultPermissions)) { return this.buildFailResult(operation, ConflictType.VaultInsufficientPermissionsError) } @@ -182,7 +188,7 @@ export class VaultFilter implements ItemSaveRuleInterface { const usesValidKey = await this.incomingItemUsesValidItemsKey(operation.incomingItem) if (!usesValidKey) { - return this.buildFailResult(operation, ConflictType.VaultInvalidItemsKey) + return this.buildFailResult(operation, ConflictType.VaultInvalidItemsKey, operation.existingItem) } return this.buildSuccessValue() @@ -213,7 +219,7 @@ export class VaultFilter implements ItemSaveRuleInterface { const usesValidKey = await this.incomingItemUsesValidItemsKey(operation.incomingItem) if (!usesValidKey) { - return this.buildFailResult(operation, ConflictType.VaultInvalidItemsKey) + return this.buildFailResult(operation, ConflictType.VaultInvalidItemsKey, operation.existingItem) } return this.buildSuccessValue() @@ -236,7 +242,7 @@ export class VaultFilter implements ItemSaveRuleInterface { const usesValidKey = await this.incomingItemUsesValidItemsKey(operation.incomingItem) if (!usesValidKey) { - return this.buildFailResult(operation, ConflictType.VaultInvalidItemsKey) + return this.buildFailResult(operation, ConflictType.VaultInvalidItemsKey, operation.existingItem) } return this.buildSuccessValue()