Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / docs-core / lib / UseCase / GetNode.ts
blob58943e3d70848fb201f705ad058b44a10e1a5c95
1 import type { UseCaseInterface } from '../Domain/UseCase/UseCaseInterface'
2 import { Result } from '@proton/docs-shared'
3 import type { NodeMeta, PublicNodeMeta, DecryptedNode } from '@proton/drive-store'
4 import { getErrorString } from '../Util/GetErrorString'
5 import { isPublicNodeMeta } from '@proton/drive-store/lib/interface'
6 import type { DocumentMetaInterface } from '@proton/docs-shared'
7 import type { DriveCompatWrapper } from '@proton/drive-store/lib/DriveCompatWrapper'
9 type GetNodeResult = {
10   node: DecryptedNode
11   refreshedDocMeta?: DocumentMetaInterface
14 export class GetNode implements UseCaseInterface<GetNodeResult> {
15   constructor(private compatWrapper: DriveCompatWrapper) {}
17   async execute(
18     nodeMeta: NodeMeta | PublicNodeMeta,
19     docMetaToRefresh?: DocumentMetaInterface,
20   ): Promise<Result<GetNodeResult>> {
21     try {
22       const node = isPublicNodeMeta(nodeMeta)
23         ? await this.compatWrapper.publicCompat?.getNode(nodeMeta)
24         : await this.compatWrapper.userCompat?.getNode(nodeMeta)
26       if (!node) {
27         return Result.fail('Incorrect compat used; node not found')
28       }
30       if (docMetaToRefresh) {
31         const newDocMeta = docMetaToRefresh.copyWithNewValues({ name: node.name })
32         return Result.ok({ node, refreshedDocMeta: newDocMeta })
33       }
35       return Result.ok({ node })
36     } catch (error) {
37       return Result.fail(getErrorString(error) ?? 'Failed to get node')
38     }
39   }