-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathwebdav.utils.ts
More file actions
127 lines (112 loc) · 3.6 KB
/
webdav.utils.ts
File metadata and controls
127 lines (112 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import path from 'node:path';
import { WebDavRequestedResource } from '../types/webdav.types';
import { DriveFolderService } from '../services/drive/drive-folder.service';
import { DriveFileService } from '../services/drive/drive-file.service';
import { DriveFileItem, DriveFolderItem, DriveItem } from '../types/drive.types';
import { webdavLogger } from './logger.utils';
export class WebDavUtils {
static joinURL(...pathComponents: string[]): string {
return path.posix.join(...pathComponents);
}
static removeHostFromURL(completeURL: string) {
// add a temp http schema if its not present
if (!completeURL.startsWith('/') && !/^https?:\/\//i.test(completeURL)) {
completeURL = 'https://' + completeURL;
}
const parsedUrl = new URL(completeURL);
let url = parsedUrl.href.replace(parsedUrl.origin + '/', '');
if (!url.startsWith('/')) url = '/'.concat(url);
return url;
}
static decodeUrl(requestUrl: string, decodeUri = true): string {
return (decodeUri ? decodeURIComponent(requestUrl) : requestUrl).replaceAll('/./', '/');
}
static normalizeFolderPath(path: string): string {
let normalizedPath = path;
if (!normalizedPath.startsWith('/')) {
normalizedPath = `/${normalizedPath}`;
}
if (!normalizedPath.endsWith('/')) {
normalizedPath = `${normalizedPath}/`;
}
return normalizedPath;
}
static async getRequestedResource(requestUrl: string, decodeUri = true): Promise<WebDavRequestedResource> {
const decodedUrl = this.decodeUrl(requestUrl, decodeUri);
const parsedPath = path.parse(decodedUrl);
const parentPath = this.normalizeFolderPath(path.dirname(decodedUrl));
return {
url: decodedUrl,
name: parsedPath.base,
path: parsedPath,
parentPath,
};
}
static async tryGetFileOrFolderMetadata({
url,
driveFileService,
driveFolderService,
}: {
url: string;
driveFolderService: DriveFolderService;
driveFileService: DriveFileService;
}): Promise<DriveItem | undefined> {
try {
return await driveFileService.getFileMetadataByPath(url);
} catch {
return await driveFolderService.getFolderMetadataByPath(url);
}
}
static async getDriveFileFromResource({
url,
driveFileService,
}: {
url: string;
driveFileService: DriveFileService;
}): Promise<DriveFileItem | undefined> {
try {
return await driveFileService.getFileMetadataByPath(url);
} catch (err) {
webdavLogger.error('Exception while getting the file metadata by path', err);
}
}
static async getDriveFolderFromResource({
url,
driveFolderService,
}: {
url: string;
driveFolderService: DriveFolderService;
}): Promise<DriveFolderItem | undefined> {
try {
return await driveFolderService.getFolderMetadataByPath(url);
} catch (err) {
webdavLogger.error('Exception while getting the folder metadata by path', err);
}
}
static async getDriveItemFromResource({
resource,
driveFolderService,
driveFileService,
}: {
resource: WebDavRequestedResource;
driveFolderService: DriveFolderService;
driveFileService: DriveFileService;
}): Promise<DriveItem | undefined> {
let item: DriveItem | undefined = undefined;
const isFolder = resource.url.endsWith('/');
try {
if (isFolder) {
item = await driveFolderService.getFolderMetadataByPath(resource.url);
} else {
item = await this.tryGetFileOrFolderMetadata({
url: resource.url,
driveFileService,
driveFolderService,
});
}
} catch {
//no op
}
return item;
}
}