import { inject, injectable } from 'inversify' import { IntegrityPayload } from '@standardnotes/responses' import { ContentType } from '@standardnotes/common' import TYPES from '../../../Bootstrap/Types' import { ItemRepositoryInterface } from '../../Item/ItemRepositoryInterface' import { UseCaseInterface } from '../UseCaseInterface' import { CheckIntegrityDTO } from './CheckIntegrityDTO' import { CheckIntegrityResponse } from './CheckIntegrityResponse' import { ExtendedIntegrityPayload } from '../../Item/ExtendedIntegrityPayload' @injectable() export class CheckIntegrity implements UseCaseInterface { constructor(@inject(TYPES.ItemRepository) private itemRepository: ItemRepositoryInterface) {} async execute(dto: CheckIntegrityDTO): Promise { const serverItemIntegrityPayloads = await this.itemRepository.findItemsForComputingIntegrityPayloads(dto.userUuid) const serverItemIntegrityPayloadsMap = new Map() for (const serverItemIntegrityPayload of serverItemIntegrityPayloads) { serverItemIntegrityPayloadsMap.set(serverItemIntegrityPayload.uuid, serverItemIntegrityPayload) } const clientItemIntegrityPayloadsMap = new Map() for (const clientItemIntegrityPayload of dto.integrityPayloads) { clientItemIntegrityPayloadsMap.set( clientItemIntegrityPayload.uuid, clientItemIntegrityPayload.updated_at_timestamp, ) } const mismatches: IntegrityPayload[] = [] for (const serverItemIntegrityPayloadUuid of serverItemIntegrityPayloadsMap.keys()) { const serverItemIntegrityPayload = serverItemIntegrityPayloadsMap.get( serverItemIntegrityPayloadUuid, ) as ExtendedIntegrityPayload if (!clientItemIntegrityPayloadsMap.has(serverItemIntegrityPayloadUuid)) { if (serverItemIntegrityPayload.content_type !== ContentType.ItemsKey) { mismatches.unshift({ uuid: serverItemIntegrityPayloadUuid, updated_at_timestamp: serverItemIntegrityPayload.updated_at_timestamp, }) } continue } const serverItemIntegrityPayloadUpdatedAtTimestamp = serverItemIntegrityPayload.updated_at_timestamp const clientItemIntegrityPayloadUpdatedAtTimestamp = clientItemIntegrityPayloadsMap.get( serverItemIntegrityPayloadUuid, ) as number if ( serverItemIntegrityPayloadUpdatedAtTimestamp !== clientItemIntegrityPayloadUpdatedAtTimestamp && serverItemIntegrityPayload.content_type !== ContentType.ItemsKey ) { mismatches.unshift({ uuid: serverItemIntegrityPayloadUuid, updated_at_timestamp: serverItemIntegrityPayloadUpdatedAtTimestamp, }) } } return { mismatches, } } }