From 6ad3d6600757b4f37ecb7524319cbfefdf2bd05d Mon Sep 17 00:00:00 2001 From: Mo Date: Wed, 17 May 2023 14:39:03 -0500 Subject: [PATCH] wip: e2e tests --- .../src/Controller/ItemsController.ts | 2 +- .../src/Domain/Item/GetItemsDTO.ts | 2 +- .../src/Domain/Item/ItemQuery.ts | 2 +- .../src/Domain/Item/ItemService.ts | 7 +++-- .../src/Domain/UseCase/SyncItems.ts | 28 +++++++++++-------- .../src/Domain/UseCase/SyncItemsDTO.ts | 2 +- .../Infra/TypeORM/TypeORMItemRepository.ts | 20 +++++++------ 7 files changed, 37 insertions(+), 26 deletions(-) diff --git a/packages/syncing-server/src/Controller/ItemsController.ts b/packages/syncing-server/src/Controller/ItemsController.ts index 565b030d3..1ea24283b 100644 --- a/packages/syncing-server/src/Controller/ItemsController.ts +++ b/packages/syncing-server/src/Controller/ItemsController.ts @@ -37,7 +37,7 @@ export class ItemsController extends BaseHttpController { computeIntegrityHash: request.body.compute_integrity === true, syncToken: request.body.sync_token, cursorToken: request.body.cursor_token, - groupUuid: request.body.group_uuid, + groupUuids: request.body.group_uuids, limit: request.body.limit, contentType: request.body.content_type, apiVersion: request.body.api ?? ApiVersion.v20161215, diff --git a/packages/syncing-server/src/Domain/Item/GetItemsDTO.ts b/packages/syncing-server/src/Domain/Item/GetItemsDTO.ts index 5fd0cde41..27516d119 100644 --- a/packages/syncing-server/src/Domain/Item/GetItemsDTO.ts +++ b/packages/syncing-server/src/Domain/Item/GetItemsDTO.ts @@ -4,5 +4,5 @@ export type GetItemsDTO = { cursorToken?: string | null limit?: number contentType?: string - groupUuid?: string | null + groupUuids?: string[] | null } diff --git a/packages/syncing-server/src/Domain/Item/ItemQuery.ts b/packages/syncing-server/src/Domain/Item/ItemQuery.ts index 4c7daafb5..ecfbf8ac8 100644 --- a/packages/syncing-server/src/Domain/Item/ItemQuery.ts +++ b/packages/syncing-server/src/Domain/Item/ItemQuery.ts @@ -7,7 +7,7 @@ export type ItemQuery = { syncTimeComparison?: '>' | '>=' contentType?: string | string[] includeGroupUuids?: string[] - exclusiveGroupUuid?: string | null + exclusiveGroupUuids?: string[] | null deleted?: boolean offset?: number limit?: number diff --git a/packages/syncing-server/src/Domain/Item/ItemService.ts b/packages/syncing-server/src/Domain/Item/ItemService.ts index e5d03f38d..975ecd488 100644 --- a/packages/syncing-server/src/Domain/Item/ItemService.ts +++ b/packages/syncing-server/src/Domain/Item/ItemService.ts @@ -50,11 +50,14 @@ export class ItemService implements ItemServiceInterface { const groupUsers = await this.groupUsersRepository.findAll({ userUuid: dto.userUuid }) const userGroupUuids = groupUsers.map((groupUser) => groupUser.groupUuid) + const exclusiveGroupUuids = dto.groupUuids + ? dto.groupUuids.filter((groupUuid) => userGroupUuids.includes(groupUuid)) + : undefined const itemQuery: ItemQuery = { userUuid: dto.userUuid, - includeGroupUuids: !dto.groupUuid ? userGroupUuids : undefined, - exclusiveGroupUuid: dto.groupUuid && userGroupUuids.includes(dto.groupUuid) ? dto.groupUuid : undefined, + includeGroupUuids: !dto.groupUuids ? userGroupUuids : undefined, + exclusiveGroupUuids: exclusiveGroupUuids, lastSyncTime, syncTimeComparison, contentType: dto.contentType, diff --git a/packages/syncing-server/src/Domain/UseCase/SyncItems.ts b/packages/syncing-server/src/Domain/UseCase/SyncItems.ts index 7bfb31e8c..f78cb689b 100644 --- a/packages/syncing-server/src/Domain/UseCase/SyncItems.ts +++ b/packages/syncing-server/src/Domain/UseCase/SyncItems.ts @@ -1,3 +1,4 @@ +import { GroupUserKey } from '../GroupUserKey/Model/GroupUserKey' import { GroupUserKeyServiceInterface } from '../GroupUserKey/Service/GroupUserKeyServiceInterface' import { Item } from '../Item/Item' import { ItemConflict } from '../Item/ItemConflict' @@ -13,7 +14,7 @@ export class SyncItems implements UseCaseInterface { const getItemsResult = await this.itemService.getItems({ userUuid: dto.userUuid, syncToken: dto.syncToken, - groupUuid: dto.groupUuid, + groupUuids: dto.groupUuids, cursorToken: dto.cursorToken, limit: dto.limit, contentType: dto.contentType, @@ -28,19 +29,24 @@ export class SyncItems implements UseCaseInterface { }) let retrievedItems = this.filterOutSyncConflictsForConsecutiveSyncs(getItemsResult.items, saveItemsResult.conflicts) - if (this.isFirstSync(dto)) { + const isGroupExclusiveSync = dto.groupUuids && dto.groupUuids.length > 0 + if (this.isFirstSync(dto) && !isGroupExclusiveSync) { retrievedItems = await this.itemService.frontLoadKeysItemsToTop(dto.userUuid, retrievedItems) } - const lastSyncTime = this.itemService.getLastSyncTime({ - syncToken: dto.syncToken, - cursorToken: dto.cursorToken, - }) + let newUserKeys: GroupUserKey[] = [] + const isNotPerformingGroupSpecificSync = dto.groupUuids == undefined || dto.groupUuids.length === 0 + if (isNotPerformingGroupSpecificSync) { + const lastSyncTime = this.itemService.getLastSyncTime({ + syncToken: dto.syncToken, + cursorToken: dto.cursorToken, + }) - const groupKeys = await this.groupUserService.getGroupUserKeysForUser({ - userUuid: dto.userUuid, - lastSyncTime, - }) + newUserKeys = await this.groupUserService.getGroupUserKeysForUser({ + userUuid: dto.userUuid, + lastSyncTime, + }) + } const syncResponse: SyncItemsResponse = { retrievedItems, @@ -48,7 +54,7 @@ export class SyncItems implements UseCaseInterface { savedItems: saveItemsResult.savedItems, conflicts: saveItemsResult.conflicts, cursorToken: getItemsResult.cursorToken, - groupKeys, + groupKeys: newUserKeys, } return syncResponse diff --git a/packages/syncing-server/src/Domain/UseCase/SyncItemsDTO.ts b/packages/syncing-server/src/Domain/UseCase/SyncItemsDTO.ts index 8257b2f18..d77e31257 100644 --- a/packages/syncing-server/src/Domain/UseCase/SyncItemsDTO.ts +++ b/packages/syncing-server/src/Domain/UseCase/SyncItemsDTO.ts @@ -5,7 +5,7 @@ export type SyncItemsDTO = { itemHashes: Array computeIntegrityHash: boolean limit: number - groupUuid?: string | null + groupUuids?: string[] | null syncToken?: string | null cursorToken?: string | null contentType?: string diff --git a/packages/syncing-server/src/Infra/TypeORM/TypeORMItemRepository.ts b/packages/syncing-server/src/Infra/TypeORM/TypeORMItemRepository.ts index cb1f03add..14604a11e 100644 --- a/packages/syncing-server/src/Infra/TypeORM/TypeORMItemRepository.ts +++ b/packages/syncing-server/src/Infra/TypeORM/TypeORMItemRepository.ts @@ -1,4 +1,4 @@ -import { Repository, SelectQueryBuilder } from 'typeorm' +import { Brackets, Repository, SelectQueryBuilder } from 'typeorm' import { Item } from '../../Domain/Item/Item' import { ItemQuery } from '../../Domain/Item/ItemQuery' import { ItemRepositoryInterface } from '../../Domain/Item/ItemRepositoryInterface' @@ -132,18 +132,20 @@ export class TypeORMItemRepository implements ItemRepositoryInterface { } if (query.includeGroupUuids != undefined && query.includeGroupUuids.length > 0) { - queryBuilder.where('item.group_uuid IN (:...groupUuids)', { groupUuids: query.includeGroupUuids }) - if (query.userUuid) { - queryBuilder.orWhere('item.user_uuid = :userUuid', { userUuid: query.userUuid }) - } + queryBuilder.where( + new Brackets((qb) => { + qb.where('item.group_uuid IN (:...groupUuids)', { groupUuids: query.includeGroupUuids }) + if (query.userUuid) { + qb.orWhere('item.user_uuid = :userUuid', { userUuid: query.userUuid }) + } + }), + ) + } else if (query.exclusiveGroupUuids != undefined && query.exclusiveGroupUuids.length > 0) { + queryBuilder.andWhere('item.group_uuid IN (:...groupUuids)', { groupUuids: query.exclusiveGroupUuids }) } else if (query.userUuid !== undefined) { queryBuilder.where('item.user_uuid = :userUuid', { userUuid: query.userUuid }) } - if (query.exclusiveGroupUuid) { - queryBuilder.andWhere('item.group_uuid = :groupUuid', { groupUuid: query.exclusiveGroupUuid }) - } - if (query.selectString !== undefined) { queryBuilder.select(query.selectString) }