Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / docs-core / lib / UseCase / DecryptCommit.ts
blob009f88bd78eca80aa3380cfaabf059fa40e39aae
1 import type { DecryptMessage } from './DecryptMessage'
2 import type { Commit } from '@proton/docs-proto'
3 import type { UseCaseInterface } from '../Domain/UseCase/UseCaseInterface'
4 import { Result } from '@proton/docs-shared'
5 import type { DecryptedMessage } from '@proton/docs-shared'
6 import { DecryptedCommit } from '../Models/DecryptedCommit'
7 import metrics from '@proton/metrics'
8 import type { SessionKey } from '@proton/crypto/lib'
10 type DecryptCommitDTO = {
11   commit: Commit
12   commitId: string
13   documentContentKey: SessionKey
16 const VERIFY_VALUE_FALSE_DUE_TO_COMMIT_HAVING_SEPARATE_VERIFICATION = false
18 export class DecryptCommit implements UseCaseInterface<DecryptedCommit> {
19   constructor(private decryptMessage: DecryptMessage) {}
21   async execute(dto: DecryptCommitDTO): Promise<Result<DecryptedCommit>> {
22     const updates = dto.commit.updates.documentUpdates
24     const decryptedResults: Result<DecryptedMessage>[] = await Promise.all(
25       updates.map((update) =>
26         this.decryptMessage.execute({
27           message: update,
28           documentContentKey: dto.documentContentKey,
29           verify: VERIFY_VALUE_FALSE_DUE_TO_COMMIT_HAVING_SEPARATE_VERIFICATION,
30         }),
31       ),
32     )
34     const failedResults = decryptedResults.filter((result) => result.isFailed())
35     if (failedResults.length > 0) {
36       for (const _ of failedResults) {
37         metrics.docs_document_updates_decryption_error_total.increment({
38           source: 'persistent',
39         })
40       }
42       return Result.fail(failedResults[0].getError())
43     }
45     const commit = new DecryptedCommit(
46       dto.commitId,
47       decryptedResults.map((result) => result.getValue()),
48     )
50     return Result.ok(commit)
51   }