1 import type { UseCaseInterface } from '../Domain/UseCase/UseCaseInterface'
2 import { Result } from '../Domain/Result/Result'
3 import type { DocumentMetaInterface } from '@proton/docs-shared'
4 import type { DriveCompat, NodeMeta } from '@proton/drive-store'
5 import type { GetDocumentMeta } from './GetDocumentMeta'
6 import { getErrorString } from '../Util/GetErrorString'
7 import type { DocumentEntitlements } from '../Types/DocumentEntitlements'
8 import { rawPermissionToRole } from '../Types/DocumentEntitlements'
10 type LoadDocumentResult = {
11 entitlements: DocumentEntitlements
12 meta: DocumentMetaInterface
17 * Performs initial loading procedure for document, including fetching keys and latest commit binary from DX.
19 export class LoadDocument implements UseCaseInterface<LoadDocumentResult> {
21 private driveCompat: DriveCompat,
22 private getDocumentMeta: GetDocumentMeta,
25 async execute(lookup: NodeMeta): Promise<Result<LoadDocumentResult>> {
27 const [keysResult, fetchResult, permissionsResult] = await Promise.all([
28 this.driveCompat.getDocumentKeys(lookup).catch((error) => {
29 throw new Error(`Failed to load keys: ${error}`)
31 this.getDocumentMeta.execute(lookup).catch((error) => {
32 throw new Error(`Failed to fetch document metadata: ${error}`)
34 this.driveCompat.getNodePermissions(lookup).catch((error) => {
35 throw new Error(`Failed to load permissions: ${error}`)
39 if (fetchResult.isFailed()) {
40 return Result.fail(fetchResult.getError())
43 const meta: DocumentMetaInterface = fetchResult.getValue()
45 return Result.fail('Document meta not found')
48 if (!keysResult || !permissionsResult) {
49 return Result.fail('Unable to load all necessary data')
52 const entitlements: DocumentEntitlements = {
54 role: rawPermissionToRole(permissionsResult),
57 return Result.ok({ entitlements, meta, lastCommitId: meta.latestCommitId() })
59 return Result.fail(getErrorString(error) ?? 'Failed to load document')