|
1 | | -import { Request } from 'express'; |
2 | 1 | import path from 'node:path'; |
3 | 2 | import { WebDavRequestedResource } from '../types/webdav.types'; |
4 | 3 | import { DriveFolderService } from '../services/drive/drive-folder.service'; |
5 | 4 | import { DriveFileService } from '../services/drive/drive-file.service'; |
6 | 5 | import { DriveFileItem, DriveFolderItem, DriveItem } from '../types/drive.types'; |
| 6 | +import { webdavLogger } from './logger.utils'; |
7 | 7 |
|
8 | 8 | export class WebDavUtils { |
9 | 9 | static joinURL(...pathComponents: string[]): string { |
@@ -39,74 +39,85 @@ export class WebDavUtils { |
39 | 39 | return normalizedPath; |
40 | 40 | } |
41 | 41 |
|
42 | | - static async getRequestedResource(urlObject: string | Request, decodeUri = true): Promise<WebDavRequestedResource> { |
43 | | - let requestUrl: string; |
44 | | - if (typeof urlObject === 'string') { |
45 | | - requestUrl = urlObject; |
46 | | - } else { |
47 | | - requestUrl = urlObject.url; |
48 | | - } |
49 | | - |
| 42 | + static async getRequestedResource(requestUrl: string, decodeUri = true): Promise<WebDavRequestedResource> { |
50 | 43 | const decodedUrl = this.decodeUrl(requestUrl, decodeUri); |
51 | 44 | const parsedPath = path.parse(decodedUrl); |
52 | 45 | const parentPath = this.normalizeFolderPath(path.dirname(decodedUrl)); |
53 | 46 |
|
54 | | - const isFolder = requestUrl.endsWith('/'); |
55 | | - |
56 | | - if (isFolder) { |
57 | | - return { |
58 | | - type: 'folder', |
59 | | - url: decodedUrl, |
60 | | - name: parsedPath.base, |
61 | | - path: parsedPath, |
62 | | - parentPath, |
63 | | - }; |
64 | | - } else { |
65 | | - return { |
66 | | - type: 'file', |
67 | | - url: decodedUrl, |
68 | | - name: parsedPath.name, |
69 | | - path: parsedPath, |
70 | | - parentPath, |
71 | | - }; |
72 | | - } |
| 47 | + return { |
| 48 | + url: decodedUrl, |
| 49 | + name: parsedPath.base, |
| 50 | + path: parsedPath, |
| 51 | + parentPath, |
| 52 | + }; |
73 | 53 | } |
74 | 54 |
|
75 | | - static async getDriveItemFromResource(params: { |
76 | | - resource: WebDavRequestedResource; |
| 55 | + static async tryGetFileOrFolderMetadata({ |
| 56 | + url, |
| 57 | + driveFileService, |
| 58 | + driveFolderService, |
| 59 | + }: { |
| 60 | + url: string; |
77 | 61 | driveFolderService: DriveFolderService; |
78 | | - driveFileService?: never; |
79 | | - }): Promise<DriveFolderItem | undefined>; |
| 62 | + driveFileService: DriveFileService; |
| 63 | + }): Promise<DriveItem | undefined> { |
| 64 | + try { |
| 65 | + return await driveFileService.getFileMetadataByPath(url); |
| 66 | + } catch { |
| 67 | + return await driveFolderService.getFolderMetadataByPath(url); |
| 68 | + } |
| 69 | + } |
80 | 70 |
|
81 | | - static async getDriveItemFromResource(params: { |
82 | | - resource: WebDavRequestedResource; |
83 | | - driveFolderService?: never; |
| 71 | + static async getDriveFileFromResource({ |
| 72 | + url, |
| 73 | + driveFileService, |
| 74 | + }: { |
| 75 | + url: string; |
84 | 76 | driveFileService: DriveFileService; |
85 | | - }): Promise<DriveFileItem | undefined>; |
| 77 | + }): Promise<DriveFileItem | undefined> { |
| 78 | + try { |
| 79 | + return await driveFileService.getFileMetadataByPath(url); |
| 80 | + } catch (err) { |
| 81 | + webdavLogger.error('Exception while getting the file metadata by path', err); |
| 82 | + } |
| 83 | + } |
86 | 84 |
|
87 | | - static async getDriveItemFromResource(params: { |
88 | | - resource: WebDavRequestedResource; |
| 85 | + static async getDriveFolderFromResource({ |
| 86 | + url, |
| 87 | + driveFolderService, |
| 88 | + }: { |
| 89 | + url: string; |
89 | 90 | driveFolderService: DriveFolderService; |
90 | | - driveFileService: DriveFileService; |
91 | | - }): Promise<DriveItem | undefined>; |
| 91 | + }): Promise<DriveFolderItem | undefined> { |
| 92 | + try { |
| 93 | + return await driveFolderService.getFolderMetadataByPath(url); |
| 94 | + } catch (err) { |
| 95 | + webdavLogger.error('Exception while getting the folder metadata by path', err); |
| 96 | + } |
| 97 | + } |
92 | 98 |
|
93 | 99 | static async getDriveItemFromResource({ |
94 | 100 | resource, |
95 | 101 | driveFolderService, |
96 | 102 | driveFileService, |
97 | 103 | }: { |
98 | 104 | resource: WebDavRequestedResource; |
99 | | - driveFolderService?: DriveFolderService; |
100 | | - driveFileService?: DriveFileService; |
| 105 | + driveFolderService: DriveFolderService; |
| 106 | + driveFileService: DriveFileService; |
101 | 107 | }): Promise<DriveItem | undefined> { |
102 | 108 | let item: DriveItem | undefined = undefined; |
103 | 109 |
|
| 110 | + const isFolder = resource.url.endsWith('/'); |
| 111 | + |
104 | 112 | try { |
105 | | - if (resource.type === 'folder') { |
106 | | - item = await driveFolderService?.getFolderMetadataByPath(resource.url); |
107 | | - } |
108 | | - if (resource.type === 'file') { |
109 | | - item = await driveFileService?.getFileMetadataByPath(resource.url); |
| 113 | + if (isFolder) { |
| 114 | + item = await driveFolderService.getFolderMetadataByPath(resource.url); |
| 115 | + } else { |
| 116 | + item = await this.tryGetFileOrFolderMetadata({ |
| 117 | + url: resource.url, |
| 118 | + driveFileService, |
| 119 | + driveFolderService, |
| 120 | + }); |
110 | 121 | } |
111 | 122 | } catch { |
112 | 123 | //no op |
|
0 commit comments