@protontech/drive-sdk 0.7.1 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/internal/photos/nodes.js +1 -0
- package/dist/internal/photos/nodes.js.map +1 -1
- package/dist/internal/photos/nodes.test.d.ts +1 -0
- package/dist/internal/photos/nodes.test.js +233 -0
- package/dist/internal/photos/nodes.test.js.map +1 -0
- package/dist/internal/photos/timeline.d.ts +1 -1
- package/dist/internal/photos/timeline.js +4 -4
- package/dist/internal/photos/timeline.js.map +1 -1
- package/dist/internal/photos/timeline.test.js +34 -7
- package/dist/internal/photos/timeline.test.js.map +1 -1
- package/dist/protonDrivePhotosClient.d.ts +24 -0
- package/dist/protonDrivePhotosClient.js +31 -1
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/package.json +1 -1
- package/src/internal/photos/nodes.test.ts +258 -0
- package/src/internal/photos/nodes.ts +1 -0
- package/src/internal/photos/timeline.test.ts +39 -7
- package/src/internal/photos/timeline.ts +4 -4
- package/src/protonDrivePhotosClient.ts +33 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../../src/internal/photos/nodes.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../../src/internal/photos/nodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const cache_1 = require("../../cache");
|
|
4
|
+
const interface_1 = require("../../interface");
|
|
5
|
+
const logger_1 = require("../../tests/logger");
|
|
6
|
+
const telemetry_1 = require("../../tests/telemetry");
|
|
7
|
+
const nodes_1 = require("./nodes");
|
|
8
|
+
function generateAPINode() {
|
|
9
|
+
return {
|
|
10
|
+
Link: {
|
|
11
|
+
LinkID: 'linkId',
|
|
12
|
+
ParentLinkID: 'parentLinkId',
|
|
13
|
+
NameHash: 'nameHash',
|
|
14
|
+
CreateTime: 123456789,
|
|
15
|
+
ModifyTime: 1234567890,
|
|
16
|
+
TrashTime: 0,
|
|
17
|
+
Name: 'encName',
|
|
18
|
+
SignatureEmail: 'sigEmail',
|
|
19
|
+
NameSignatureEmail: 'nameSigEmail',
|
|
20
|
+
NodeKey: 'nodeKey',
|
|
21
|
+
NodePassphrase: 'nodePass',
|
|
22
|
+
NodePassphraseSignature: 'nodePassSig',
|
|
23
|
+
},
|
|
24
|
+
SharingSummary: null,
|
|
25
|
+
Sharing: null,
|
|
26
|
+
Membership: null,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function generateAPIFolderNode(linkOverrides = {}, overrides = {}) {
|
|
30
|
+
const node = generateAPINode();
|
|
31
|
+
return {
|
|
32
|
+
...node,
|
|
33
|
+
Link: { ...node.Link, Type: 1, ...linkOverrides },
|
|
34
|
+
Folder: { XAttr: '{folder}', NodeHashKey: 'nodeHashKey' },
|
|
35
|
+
Photo: null,
|
|
36
|
+
...overrides,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function generateAPIAlbumNode(linkOverrides = {}, overrides = {}) {
|
|
40
|
+
const node = generateAPINode();
|
|
41
|
+
return {
|
|
42
|
+
...node,
|
|
43
|
+
Link: { ...node.Link, Type: 3, ...linkOverrides },
|
|
44
|
+
Photo: null,
|
|
45
|
+
Folder: null,
|
|
46
|
+
...overrides,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function generateAPIPhotoNode(linkOverrides = {}, overrides = {}) {
|
|
50
|
+
const node = generateAPINode();
|
|
51
|
+
return {
|
|
52
|
+
...node,
|
|
53
|
+
Link: { ...node.Link, Type: 2, ...linkOverrides },
|
|
54
|
+
Photo: {
|
|
55
|
+
CaptureTime: 1700000000,
|
|
56
|
+
MainPhotoLinkID: null,
|
|
57
|
+
RelatedPhotosLinkIDs: [],
|
|
58
|
+
ContentHash: 'contentHash123',
|
|
59
|
+
Tags: [1, 2],
|
|
60
|
+
Albums: [
|
|
61
|
+
{
|
|
62
|
+
AlbumLinkID: 'albumLinkId1',
|
|
63
|
+
AddedTime: 1700001000,
|
|
64
|
+
Hash: 'albumHash',
|
|
65
|
+
ContentHash: 'albumContentHash',
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
ActiveRevision: {
|
|
69
|
+
RevisionID: 'revisionId',
|
|
70
|
+
CreateTime: 1234567890,
|
|
71
|
+
SignatureEmail: 'revSigEmail',
|
|
72
|
+
XAttr: '{photo}',
|
|
73
|
+
EncryptedSize: 12,
|
|
74
|
+
},
|
|
75
|
+
MediaType: 'image/jpeg',
|
|
76
|
+
ContentKeyPacket: 'contentKeyPacket',
|
|
77
|
+
ContentKeyPacketSignature: 'contentKeyPacketSig',
|
|
78
|
+
},
|
|
79
|
+
Folder: null,
|
|
80
|
+
...overrides,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
describe('PhotosNodesAPIService', () => {
|
|
84
|
+
let apiMock;
|
|
85
|
+
let api;
|
|
86
|
+
beforeEach(() => {
|
|
87
|
+
// @ts-expect-error Mocking for testing purposes
|
|
88
|
+
apiMock = {
|
|
89
|
+
post: jest.fn(),
|
|
90
|
+
};
|
|
91
|
+
api = new nodes_1.PhotosNodesAPIService((0, logger_1.getMockLogger)(), apiMock, 'clientUid');
|
|
92
|
+
});
|
|
93
|
+
describe('linkToEncryptedNode', () => {
|
|
94
|
+
async function testIterateNodes(mockedLink, expectedType) {
|
|
95
|
+
apiMock.post = jest.fn().mockResolvedValue({ Links: [mockedLink] });
|
|
96
|
+
const nodes = await Array.fromAsync(api.iterateNodes(['volumeId~nodeId'], 'volumeId'));
|
|
97
|
+
expect(nodes).toHaveLength(1);
|
|
98
|
+
expect(nodes[0].type).toBe(expectedType);
|
|
99
|
+
}
|
|
100
|
+
it('should convert folder (type 1) to folder node', async () => {
|
|
101
|
+
await testIterateNodes(generateAPIFolderNode(), interface_1.NodeType.Folder);
|
|
102
|
+
});
|
|
103
|
+
it('should convert album (type 3) to album node', async () => {
|
|
104
|
+
await testIterateNodes(generateAPIAlbumNode(), interface_1.NodeType.Album);
|
|
105
|
+
});
|
|
106
|
+
it('should convert photo (type 2) to photo node with photo attributes', async () => {
|
|
107
|
+
apiMock.post = jest.fn().mockResolvedValue({ Links: [generateAPIPhotoNode()] });
|
|
108
|
+
const nodes = await Array.fromAsync(api.iterateNodes(['volumeId~nodeId'], 'volumeId'));
|
|
109
|
+
expect(nodes).toHaveLength(1);
|
|
110
|
+
expect(nodes[0].type).toBe(interface_1.NodeType.Photo);
|
|
111
|
+
expect(nodes[0].photo).toBeDefined();
|
|
112
|
+
expect(nodes[0].photo?.captureTime).toEqual(new Date(1700000000 * 1000));
|
|
113
|
+
expect(nodes[0].photo?.tags).toEqual([1, 2]);
|
|
114
|
+
expect(nodes[0].photo?.albums).toHaveLength(1);
|
|
115
|
+
expect(nodes[0].photo?.albums[0].nodeUid).toBe('volumeId~albumLinkId1');
|
|
116
|
+
expect(nodes[0].photo?.albums[0].additionTime).toEqual(new Date(1700001000 * 1000));
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('PhotosNodesCache', () => {
|
|
121
|
+
let cache;
|
|
122
|
+
beforeEach(() => {
|
|
123
|
+
const memoryCache = new cache_1.MemoryCache();
|
|
124
|
+
cache = new nodes_1.PhotosNodesCache((0, logger_1.getMockLogger)(), memoryCache);
|
|
125
|
+
});
|
|
126
|
+
describe('deserialiseNode', () => {
|
|
127
|
+
it('should convert photo attributes dates from strings to Date objects', () => {
|
|
128
|
+
const serialisedNode = JSON.stringify({
|
|
129
|
+
uid: 'volumeId~linkId',
|
|
130
|
+
parentUid: 'volumeId~parentLinkId',
|
|
131
|
+
type: interface_1.NodeType.Photo,
|
|
132
|
+
directRole: interface_1.MemberRole.Admin,
|
|
133
|
+
isShared: false,
|
|
134
|
+
isSharedPublicly: false,
|
|
135
|
+
creationTime: '2023-11-14T22:13:20.000Z',
|
|
136
|
+
modificationTime: '2023-11-14T22:13:20.000Z',
|
|
137
|
+
photo: {
|
|
138
|
+
captureTime: '2023-11-14T22:13:20.000Z',
|
|
139
|
+
mainPhotoNodeUid: undefined,
|
|
140
|
+
relatedPhotoNodeUids: [],
|
|
141
|
+
tags: [1],
|
|
142
|
+
albums: [
|
|
143
|
+
{
|
|
144
|
+
nodeUid: 'volumeId~albumId',
|
|
145
|
+
additionTime: '2023-11-15T10:00:00.000Z',
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
const node = cache.deserialiseNode(serialisedNode);
|
|
151
|
+
expect(node.photo).toBeDefined();
|
|
152
|
+
expect(node.photo?.captureTime).toBeInstanceOf(Date);
|
|
153
|
+
expect(node.photo?.captureTime).toEqual(new Date('2023-11-14T22:13:20.000Z'));
|
|
154
|
+
expect(node.photo?.albums[0].additionTime).toBeInstanceOf(Date);
|
|
155
|
+
expect(node.photo?.albums[0].additionTime).toEqual(new Date('2023-11-15T10:00:00.000Z'));
|
|
156
|
+
});
|
|
157
|
+
it('should handle node without photo attributes', () => {
|
|
158
|
+
const serialisedNode = JSON.stringify({
|
|
159
|
+
uid: 'volumeId~linkId',
|
|
160
|
+
parentUid: 'volumeId~parentLinkId',
|
|
161
|
+
type: interface_1.NodeType.Folder,
|
|
162
|
+
directRole: interface_1.MemberRole.Admin,
|
|
163
|
+
isShared: false,
|
|
164
|
+
isSharedPublicly: false,
|
|
165
|
+
creationTime: '2023-11-14T22:13:20.000Z',
|
|
166
|
+
modificationTime: '2023-11-14T22:13:20.000Z',
|
|
167
|
+
});
|
|
168
|
+
const node = cache.deserialiseNode(serialisedNode);
|
|
169
|
+
expect(node.photo).toBeUndefined();
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe('PhotosNodesAccess', () => {
|
|
174
|
+
describe('parseNode', () => {
|
|
175
|
+
it('should keep photo type and add photo object', async () => {
|
|
176
|
+
const telemetry = (0, telemetry_1.getMockTelemetry)();
|
|
177
|
+
// @ts-expect-error Mocking for testing purposes
|
|
178
|
+
const cryptoService = {};
|
|
179
|
+
// @ts-expect-error Mocking for testing purposes
|
|
180
|
+
const apiService = {};
|
|
181
|
+
// @ts-expect-error Mocking for testing purposes
|
|
182
|
+
const cacheService = {};
|
|
183
|
+
// @ts-expect-error Mocking for testing purposes
|
|
184
|
+
const cryptoCache = {};
|
|
185
|
+
// @ts-expect-error Mocking for testing purposes
|
|
186
|
+
const sharesService = {};
|
|
187
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
188
|
+
const nodesAccess = new nodes_1.PhotosNodesAccess(telemetry, apiService, cacheService, cryptoCache, cryptoService, sharesService);
|
|
189
|
+
const unparsedNode = {
|
|
190
|
+
uid: 'volumeId~linkId',
|
|
191
|
+
parentUid: 'volumeId~parentLinkId',
|
|
192
|
+
type: interface_1.NodeType.Photo,
|
|
193
|
+
name: 'photo.jpg',
|
|
194
|
+
hash: 'hash123',
|
|
195
|
+
directRole: interface_1.MemberRole.Admin,
|
|
196
|
+
isShared: false,
|
|
197
|
+
isSharedPublicly: false,
|
|
198
|
+
creationTime: new Date(),
|
|
199
|
+
modificationTime: new Date(),
|
|
200
|
+
trashTime: undefined,
|
|
201
|
+
mediaType: 'image/jpeg',
|
|
202
|
+
folder: undefined,
|
|
203
|
+
file: {
|
|
204
|
+
activeRevision: {
|
|
205
|
+
uid: 'revisionId',
|
|
206
|
+
state: 'active',
|
|
207
|
+
creationTime: new Date(),
|
|
208
|
+
storageSize: 100,
|
|
209
|
+
signatureEmail: 'test@example.com',
|
|
210
|
+
claimedModificationTime: new Date(),
|
|
211
|
+
claimedSize: 100,
|
|
212
|
+
claimedDigests: { sha1: 'sha1hash' },
|
|
213
|
+
claimedBlockSizes: [100],
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
photo: {
|
|
217
|
+
captureTime: new Date('2023-11-14T22:13:20.000Z'),
|
|
218
|
+
mainPhotoNodeUid: undefined,
|
|
219
|
+
relatedPhotoNodeUids: [],
|
|
220
|
+
tags: [1, 2],
|
|
221
|
+
albums: [],
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
// @ts-expect-error Accessing protected method for testing
|
|
225
|
+
const parsedNode = nodesAccess.parseNode(unparsedNode);
|
|
226
|
+
expect(parsedNode.type).toBe(interface_1.NodeType.Photo);
|
|
227
|
+
expect(parsedNode.photo).toBeDefined();
|
|
228
|
+
expect(parsedNode.photo?.captureTime).toEqual(new Date('2023-11-14T22:13:20.000Z'));
|
|
229
|
+
expect(parsedNode.photo?.tags).toEqual([1, 2]);
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
//# sourceMappingURL=nodes.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.test.js","sourceRoot":"","sources":["../../../src/internal/photos/nodes.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,5 +18,5 @@ export declare class PhotosTimeline {
|
|
|
18
18
|
captureTime: Date;
|
|
19
19
|
tags: number[];
|
|
20
20
|
}>;
|
|
21
|
-
|
|
21
|
+
findPhotoDuplicates(name: string, generateSha1: () => Promise<string>, signal?: AbortSignal): Promise<string[]>;
|
|
22
22
|
}
|
|
@@ -27,7 +27,7 @@ class PhotosTimeline {
|
|
|
27
27
|
const { volumeId } = await this.photoShares.getRootIDs();
|
|
28
28
|
yield* this.apiService.iterateTimeline(volumeId, signal);
|
|
29
29
|
}
|
|
30
|
-
async
|
|
30
|
+
async findPhotoDuplicates(name, generateSha1, signal) {
|
|
31
31
|
const { volumeId, rootNodeId } = await this.photoShares.getRootIDs();
|
|
32
32
|
const rootNodeUid = (0, uids_1.makeNodeUid)(volumeId, rootNodeId);
|
|
33
33
|
const { hashKey } = await this.nodesService.getNodeKeys(rootNodeUid);
|
|
@@ -37,7 +37,7 @@ class PhotosTimeline {
|
|
|
37
37
|
const nameHash = await this.driveCrypto.generateLookupHash(name, hashKey);
|
|
38
38
|
const duplicates = await this.apiService.checkPhotoDuplicates(volumeId, [nameHash], signal);
|
|
39
39
|
if (duplicates.length === 0) {
|
|
40
|
-
return
|
|
40
|
+
return [];
|
|
41
41
|
}
|
|
42
42
|
// Generate the SHA1 only when there is any matching node hash to avoid
|
|
43
43
|
// computing it for every node as in most cases there is no match.
|
|
@@ -45,11 +45,11 @@ class PhotosTimeline {
|
|
|
45
45
|
const contentHash = await this.driveCrypto.generateLookupHash(sha1, hashKey);
|
|
46
46
|
const matchingDuplicates = duplicates.filter((duplicate) => duplicate.nameHash === nameHash && duplicate.contentHash === contentHash);
|
|
47
47
|
if (matchingDuplicates.length === 0) {
|
|
48
|
-
return
|
|
48
|
+
return [];
|
|
49
49
|
}
|
|
50
50
|
const nodeUids = matchingDuplicates.map((duplicate) => duplicate.nodeUid);
|
|
51
51
|
this.logger.debug(`Duplicate photo found: name hash: ${nameHash}, content hash: ${contentHash}, node uids: ${nodeUids}`);
|
|
52
|
-
return
|
|
52
|
+
return nodeUids;
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
exports.PhotosTimeline = PhotosTimeline;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../../src/internal/photos/timeline.ts"],"names":[],"mappings":";;;AAEA,kCAAsC;AAKtC;;GAEG;AACH,MAAa,cAAc;IAEX;IACA;IACA;IACA;IACA;IALZ,YACY,MAAc,EACd,UAA4B,EAC5B,WAAwB,EACxB,WAA+B,EAC/B,YAA+B;QAJ/B,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAkB;QAC5B,gBAAW,GAAX,WAAW,CAAa;QACxB,gBAAW,GAAX,WAAW,CAAoB;QAC/B,iBAAY,GAAZ,YAAY,CAAmB;QAEvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,CAAC,eAAe,CAAC,MAAoB;QAKvC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QACzD,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../../src/internal/photos/timeline.ts"],"names":[],"mappings":";;;AAEA,kCAAsC;AAKtC;;GAEG;AACH,MAAa,cAAc;IAEX;IACA;IACA;IACA;IACA;IALZ,YACY,MAAc,EACd,UAA4B,EAC5B,WAAwB,EACxB,WAA+B,EAC/B,YAA+B;QAJ/B,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAkB;QAC5B,gBAAW,GAAX,WAAW,CAAa;QACxB,gBAAW,GAAX,WAAW,CAAoB;QAC/B,iBAAY,GAAZ,YAAY,CAAmB;QAEvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,CAAC,eAAe,CAAC,MAAoB;QAKvC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QACzD,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAY,EAAE,YAAmC,EAAE,MAAoB;QAC7F,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QACrE,MAAM,WAAW,GAAG,IAAA,kBAAW,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACtD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAE5F,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACd,CAAC;QAED,uEAAuE;QACvE,kEAAkE;QAClE,MAAM,IAAI,GAAG,MAAM,YAAY,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAE7E,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CACxC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,IAAI,SAAS,CAAC,WAAW,KAAK,WAAW,CAC1F,CAAC;QAEF,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,qCAAqC,QAAQ,mBAAmB,WAAW,gBAAgB,QAAQ,EAAE,CACxG,CAAC;QACF,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AA1DD,wCA0DC"}
|
|
@@ -38,13 +38,13 @@ describe('PhotosTimeline', () => {
|
|
|
38
38
|
};
|
|
39
39
|
timeline = new timeline_1.PhotosTimeline(logger, apiService, driveCrypto, photoShares, nodesService);
|
|
40
40
|
});
|
|
41
|
-
describe('
|
|
41
|
+
describe('findPhotoDuplicates', () => {
|
|
42
42
|
it('should not call sha1 callback when there is no name hash match', async () => {
|
|
43
43
|
const generateSha1 = jest.fn();
|
|
44
44
|
apiService.checkPhotoDuplicates = jest.fn().mockResolvedValue([]);
|
|
45
45
|
driveCrypto.generateLookupHash = jest.fn().mockResolvedValue(nameHash);
|
|
46
|
-
const result = await timeline.
|
|
47
|
-
expect(result).
|
|
46
|
+
const result = await timeline.findPhotoDuplicates(name, generateSha1);
|
|
47
|
+
expect(result).toEqual([]);
|
|
48
48
|
expect(generateSha1).not.toHaveBeenCalled();
|
|
49
49
|
expect(photoShares.getRootIDs).toHaveBeenCalled();
|
|
50
50
|
expect(nodesService.getNodeKeys).toHaveBeenCalledWith(rootNodeUid);
|
|
@@ -65,8 +65,8 @@ describe('PhotosTimeline', () => {
|
|
|
65
65
|
.fn()
|
|
66
66
|
.mockResolvedValueOnce(nameHash)
|
|
67
67
|
.mockResolvedValueOnce(contentHash);
|
|
68
|
-
const result = await timeline.
|
|
69
|
-
expect(result).
|
|
68
|
+
const result = await timeline.findPhotoDuplicates(name, generateSha1);
|
|
69
|
+
expect(result).toEqual([]);
|
|
70
70
|
expect(generateSha1).toHaveBeenCalledTimes(1);
|
|
71
71
|
expect(driveCrypto.generateLookupHash).toHaveBeenCalledTimes(2);
|
|
72
72
|
expect(driveCrypto.generateLookupHash).toHaveBeenNthCalledWith(1, name, hashKey);
|
|
@@ -88,12 +88,39 @@ describe('PhotosTimeline', () => {
|
|
|
88
88
|
.fn()
|
|
89
89
|
.mockResolvedValueOnce(nameHash)
|
|
90
90
|
.mockResolvedValueOnce(contentHash);
|
|
91
|
-
const result = await timeline.
|
|
92
|
-
expect(result).
|
|
91
|
+
const result = await timeline.findPhotoDuplicates(name, generateSha1);
|
|
92
|
+
expect(result).toEqual([nodeUid1]);
|
|
93
93
|
expect(generateSha1).toHaveBeenCalledTimes(1);
|
|
94
94
|
expect(logger.debug).toHaveBeenCalledTimes(1);
|
|
95
95
|
expect(logger.debug).toHaveBeenCalledWith(`Duplicate photo found: name hash: ${nameHash}, content hash: ${contentHash}, node uids: ${nodeUid1}`);
|
|
96
96
|
});
|
|
97
|
+
it('should return multiple node UIDs when multiple duplicates match', async () => {
|
|
98
|
+
const generateSha1 = jest.fn().mockResolvedValue(sha1);
|
|
99
|
+
const nodeUid1 = 'volumeId~node1';
|
|
100
|
+
const nodeUid2 = 'volumeId~node2';
|
|
101
|
+
const duplicates = [
|
|
102
|
+
{
|
|
103
|
+
nameHash: nameHash,
|
|
104
|
+
contentHash: contentHash,
|
|
105
|
+
nodeUid: nodeUid1,
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
nameHash: nameHash,
|
|
109
|
+
contentHash: contentHash,
|
|
110
|
+
nodeUid: nodeUid2,
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
apiService.checkPhotoDuplicates = jest.fn().mockResolvedValue(duplicates);
|
|
114
|
+
driveCrypto.generateLookupHash = jest
|
|
115
|
+
.fn()
|
|
116
|
+
.mockResolvedValueOnce(nameHash)
|
|
117
|
+
.mockResolvedValueOnce(contentHash);
|
|
118
|
+
const result = await timeline.findPhotoDuplicates(name, generateSha1);
|
|
119
|
+
expect(result).toEqual([nodeUid1, nodeUid2]);
|
|
120
|
+
expect(generateSha1).toHaveBeenCalledTimes(1);
|
|
121
|
+
expect(logger.debug).toHaveBeenCalledTimes(1);
|
|
122
|
+
expect(logger.debug).toHaveBeenCalledWith(`Duplicate photo found: name hash: ${nameHash}, content hash: ${contentHash}, node uids: ${nodeUid1},${nodeUid2}`);
|
|
123
|
+
});
|
|
97
124
|
});
|
|
98
125
|
});
|
|
99
126
|
//# sourceMappingURL=timeline.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.test.js","sourceRoot":"","sources":["../../../src/internal/photos/timeline.test.ts"],"names":[],"mappings":";;AAAA,+CAAmD;AAEnD,kCAAsC;AAItC,yCAA4C;AAE5C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,IAAI,MAAwC,CAAC;IAC7C,IAAI,UAA4B,CAAC;IACjC,IAAI,WAAwB,CAAC;IAC7B,IAAI,WAA+B,CAAC;IACpC,IAAI,YAA+B,CAAC;IACpC,IAAI,QAAwB,CAAC;IAE7B,MAAM,QAAQ,GAAG,UAAU,CAAC;IAC5B,MAAM,UAAU,GAAG,YAAY,CAAC;IAChC,MAAM,WAAW,GAAG,IAAA,kBAAW,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,WAAW,CAAC;IACzB,MAAM,QAAQ,GAAG,aAAa,CAAC;IAC/B,MAAM,IAAI,GAAG,aAAa,CAAC;IAC3B,MAAM,WAAW,GAAG,gBAAgB,CAAC;IAErC,UAAU,CAAC,GAAG,EAAE;QACZ,MAAM,GAAG,IAAA,sBAAa,GAAE,CAAC;QACzB,gEAAgE;QAChE,UAAU,GAAG;YACT,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE;SAClC,CAAC;QACF,gEAAgE;QAChE,WAAW,GAAG;YACV,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE;SAChC,CAAC;QACF,gEAAgE;QAChE,WAAW,GAAG;YACV,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;SACpE,CAAC;QACF,gEAAgE;QAChE,YAAY,GAAG;YACX,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC;SACxD,CAAC;QAEF,QAAQ,GAAG,IAAI,yBAAc,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"timeline.test.js","sourceRoot":"","sources":["../../../src/internal/photos/timeline.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,6 +45,10 @@ export declare class ProtonDrivePhotosClient {
|
|
|
45
45
|
* See `ProtonDriveClient.subscribeToDriveEvents` for more information.
|
|
46
46
|
*/
|
|
47
47
|
subscribeToDriveEvents(callback: DriveListener): Promise<EventSubscription>;
|
|
48
|
+
/**
|
|
49
|
+
* @returns The root folder to Photos section of the user.
|
|
50
|
+
*/
|
|
51
|
+
getMyPhotosRootFolder(): Promise<MaybePhotoNode>;
|
|
48
52
|
/**
|
|
49
53
|
* Iterates all the photos for the timeline view.
|
|
50
54
|
*
|
|
@@ -210,8 +214,28 @@ export declare class ProtonDrivePhotosClient {
|
|
|
210
214
|
* @param generateSha1 - A callback to generate the hex string representation of the SHA1 of the photo content.
|
|
211
215
|
* @param signal - An optional abort signal to cancel the operation.
|
|
212
216
|
* @returns True if the photo already exists in the timeline, false otherwise.
|
|
217
|
+
* @deprecated Use `findPhotoDuplicates` instead to get the node UIDs of duplicate photos.
|
|
213
218
|
*/
|
|
214
219
|
isDuplicatePhoto(name: string, generateSha1: () => Promise<string>, signal?: AbortSignal): Promise<boolean>;
|
|
220
|
+
/**
|
|
221
|
+
* Find duplicate photos by name and content.
|
|
222
|
+
*
|
|
223
|
+
* For given photo name, find existing photos with the same name
|
|
224
|
+
* in the timeline and check if the photo content is also the same.
|
|
225
|
+
* Only the same name is not considered as duplicate photo because
|
|
226
|
+
* it is expected that there are photos with the same name (e.g.,
|
|
227
|
+
* date as a name from multiple cameras, or rolling number).
|
|
228
|
+
*
|
|
229
|
+
* The function accepts a callback to generate the SHA1 and it is
|
|
230
|
+
* called only when there is any matching node name hash to avoid
|
|
231
|
+
* computation for every node if its not necessary.
|
|
232
|
+
*
|
|
233
|
+
* @param name - The name of the photo to check for duplicates.
|
|
234
|
+
* @param generateSha1 - A callback to generate the hex string representation of the SHA1 of the photo content.
|
|
235
|
+
* @param signal - An optional abort signal to cancel the operation.
|
|
236
|
+
* @returns An array of node UIDs of duplicate photos. Empty array if no duplicates found.
|
|
237
|
+
*/
|
|
238
|
+
findPhotoDuplicates(name: string, generateSha1: () => Promise<string>, signal?: AbortSignal): Promise<string[]>;
|
|
215
239
|
/**
|
|
216
240
|
* Iterates the albums.
|
|
217
241
|
*
|
|
@@ -87,6 +87,13 @@ class ProtonDrivePhotosClient {
|
|
|
87
87
|
this.logger.debug('Subscribing to core updates');
|
|
88
88
|
return this.events.subscribeToCoreEvents(callback);
|
|
89
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* @returns The root folder to Photos section of the user.
|
|
92
|
+
*/
|
|
93
|
+
async getMyPhotosRootFolder() {
|
|
94
|
+
this.logger.info('Getting my photos root folder');
|
|
95
|
+
return (0, transformers_1.convertInternalPhotoNodePromise)(this.nodes.access.getVolumeRootFolder());
|
|
96
|
+
}
|
|
90
97
|
/**
|
|
91
98
|
* Iterates all the photos for the timeline view.
|
|
92
99
|
*
|
|
@@ -319,10 +326,33 @@ class ProtonDrivePhotosClient {
|
|
|
319
326
|
* @param generateSha1 - A callback to generate the hex string representation of the SHA1 of the photo content.
|
|
320
327
|
* @param signal - An optional abort signal to cancel the operation.
|
|
321
328
|
* @returns True if the photo already exists in the timeline, false otherwise.
|
|
329
|
+
* @deprecated Use `findPhotoDuplicates` instead to get the node UIDs of duplicate photos.
|
|
322
330
|
*/
|
|
323
331
|
async isDuplicatePhoto(name, generateSha1, signal) {
|
|
324
332
|
this.logger.info(`Checking if photo is a duplicate`);
|
|
325
|
-
return this.photos.timeline.
|
|
333
|
+
return this.photos.timeline.findPhotoDuplicates(name, generateSha1, signal).then(nodeUids => nodeUids.length !== 0);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Find duplicate photos by name and content.
|
|
337
|
+
*
|
|
338
|
+
* For given photo name, find existing photos with the same name
|
|
339
|
+
* in the timeline and check if the photo content is also the same.
|
|
340
|
+
* Only the same name is not considered as duplicate photo because
|
|
341
|
+
* it is expected that there are photos with the same name (e.g.,
|
|
342
|
+
* date as a name from multiple cameras, or rolling number).
|
|
343
|
+
*
|
|
344
|
+
* The function accepts a callback to generate the SHA1 and it is
|
|
345
|
+
* called only when there is any matching node name hash to avoid
|
|
346
|
+
* computation for every node if its not necessary.
|
|
347
|
+
*
|
|
348
|
+
* @param name - The name of the photo to check for duplicates.
|
|
349
|
+
* @param generateSha1 - A callback to generate the hex string representation of the SHA1 of the photo content.
|
|
350
|
+
* @param signal - An optional abort signal to cancel the operation.
|
|
351
|
+
* @returns An array of node UIDs of duplicate photos. Empty array if no duplicates found.
|
|
352
|
+
*/
|
|
353
|
+
async findPhotoDuplicates(name, generateSha1, signal) {
|
|
354
|
+
this.logger.info(`Checking if photo have duplicates`);
|
|
355
|
+
return this.photos.timeline.findPhotoDuplicates(name, generateSha1, signal);
|
|
326
356
|
}
|
|
327
357
|
/**
|
|
328
358
|
* Iterates the albums.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protonDrivePhotosClient.js","sourceRoot":"","sources":["../src/protonDrivePhotosClient.ts"],"names":[],"mappings":";;;AAoBA,qCAAqC;AACrC,qCAAuC;AACvC,2CAAwC;AACxC,iDAOwB;AACxB,sDAAwD;AACxD,kDAAyD;AACzD,8CAAyF;AACzF,8CAM2B;AAC3B,oDAAiD;AACjD,8CAAqD;AACrD,gDAAuD;AAEvD;;;;;;;GAOG;AACH,MAAa,uBAAuB;IACxB,MAAM,CAAS;IACf,SAAS,CAAY;IACrB,MAAM,CAAqB;IAC3B,WAAW,CAA2C;IACtD,KAAK,CAA2C;IAChD,OAAO,CAAuC;IAC9C,QAAQ,CAAwC;IAChD,MAAM,CAA2C;IACjD,MAAM,CAAsC;IAE7C,YAAY,CAOjB;IAEF,YAAY,EACR,UAAU,EACV,aAAa,EACb,WAAW,EACX,OAAO,EACP,mBAAmB,EACnB,SAAS,EACT,MAAM,EACN,SAAS,EACT,qBAAqB,GACe;QACpC,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,SAAS,GAAG,IAAI,qBAAS,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAEtD,MAAM,UAAU,GAAG,IAAA,kBAAS,EAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,IAAI,oBAAW,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,IAAI,4BAAe,CAClC,SAAS,EACT,IAAI,CAAC,SAAS,EACd,UAAU,EACV,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,QAAQ,CACtB,CAAC;QACF,MAAM,UAAU,GAAG,IAAA,yBAAgB,EAAC,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAC9G,IAAI,CAAC,WAAW,GAAG,IAAA,8BAAqB,EACpC,SAAS,EACT,UAAU,EACV,aAAa,EACb,WAAW,EACX,OAAO,EACP,YAAY,EACZ,UAAU,CACb,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,IAAA,8BAAqB,EAC9B,SAAS,EACT,UAAU,EACV,aAAa,EACb,WAAW,EACX,OAAO,EACP,YAAY,EACZ,IAAI,CAAC,WAAW,EAChB,UAAU,CAAC,SAAS,CACvB,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,IAAA,yBAAgB,EAAC,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzG,IAAI,CAAC,OAAO,GAAG,IAAA,2BAAiB,EAC5B,SAAS,EACT,UAAU,EACV,aAAa,EACb,OAAO,EACP,YAAY,EACZ,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,KAAK,CAAC,MAAM,EACjB,kCAAyB,CAC5B,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,IAAA,6BAAkB,EAC9B,SAAS,EACT,UAAU,EACV,YAAY,EACZ,OAAO,EACP,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,KAAK,CAAC,MAAM,EACjB,IAAI,CAAC,KAAK,CAAC,SAAS,CACvB,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,IAAA,8BAAqB,EAC/B,SAAS,EACT,UAAU,EACV,YAAY,EACZ,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,KAAK,CAAC,MAAM,EACjB,UAAU,CAAC,SAAS,CACvB,CAAC;QAEF,uDAAuD;QACvD,MAAM,mBAAmB,GAAoB;YACzC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;YAC7E,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;SAC7E,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,2BAAkB,CAChC,SAAS,EACT,UAAU,EACV,IAAI,CAAC,WAAW,EAChB,mBAAmB,EACnB,qBAAqB,CACxB,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG;YAChB,UAAU,EAAE,KAAK,EAAE,OAAkB,EAAE,EAAE;gBACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAA,qBAAM,EAAC,OAAO,CAAC,CAAC,CAAC;YACzD,CAAC;SACJ,CAAC;IACN,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,SAAmB,EAAE,QAAoB;QAC/C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,qBAAqB,CAAC,gBAAwB,EAAE,QAAuB;QACzE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,sBAAsB,CAAC,QAAuB;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,CAAC,eAAe,CAAC,MAAoB;QAKvC,2BAA2B;QAC3B,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,mBAAmB,CAAC,MAAoB;QAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC5C,KAAM,CAAC,CAAC,IAAA,+CAAgC,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,YAAY,CAAC,QAAqB,EAAE,MAAoB;QAC3D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC;QACvD,0BAA0B;QAC1B,KAAM,CAAC,CAAC,IAAA,sDAAuC,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,IAAA,sBAAO,EAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/G,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,OAAkB;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO,IAAA,8CAA+B,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAA,qBAAM,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,OAAkB,EAAE,OAAe;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrD,OAAO,IAAA,8CAA+B,EAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACvG,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,UAAU,CAAC,QAAqB,EAAE,MAAoB;QACzD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC;QACtD,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,IAAA,sBAAO,EAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IACvE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,YAAY,CAAC,QAAqB,EAAE,MAAoB;QAC3D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC;QACvD,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,IAAA,sBAAO,EAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,WAAW,CAAC,QAAqB,EAAE,MAAoB;QAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC;QACtD,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,IAAA,sBAAO,EAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IACxE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,kBAAkB,CAAC,MAAoB;QAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACjD,KAAM,CAAC,CAAC,IAAA,+CAAgC,EAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,wBAAwB,CAAC,MAAoB;QAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAEnD,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAA,uCAAwB,EAAC,IAAI,CAAC,CAAC;QACzC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,OAAkB;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAA,qBAAM,EAAC,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,kBAAkB,CAAC,MAAoB;QAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC1C,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAAC,aAAoC;QACvD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,IAAA,qBAAM,EAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAA,qBAAM,EAAC,aAAa,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAAC,aAAoC;QACvD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,IAAA,qBAAM,EAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAA,qBAAM,EAAC,aAAa,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,OAAkB;QACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,IAAA,qBAAM,EAAC,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,OAAkB,EAAE,QAA2B;QAC3D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,OAAkB,EAAE,QAA8B;QAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAClB,OAAkB,EAClB,aAA+D;QAE/D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,IAAA,qBAAM,EAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,IAAA,qBAAM,EAAC,aAAa,CAAC,CAAC,CAAC;IACjG,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iBAAiB,CAAC,OAAkB,EAAE,MAAoB;QAC5D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAA,qBAAM,EAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,iBAAiB,CACpB,QAAqB,EACrB,aAA6B,EAC7B,MAAoB;QAEpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC;QAC5D,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAA,sBAAO,EAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACrF,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CACjB,IAAY,EACZ,QAKC,EACD,MAAoB;QAEpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC1C,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAA,qBAAM,EAAC,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxF,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"protonDrivePhotosClient.js","sourceRoot":"","sources":["../src/protonDrivePhotosClient.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { MemoryCache } from '../../cache';
|
|
2
|
+
import { NodeType, MemberRole } from '../../interface';
|
|
3
|
+
import { getMockLogger } from '../../tests/logger';
|
|
4
|
+
import { getMockTelemetry } from '../../tests/telemetry';
|
|
5
|
+
import { DriveAPIService } from '../apiService';
|
|
6
|
+
import { PhotosNodesAPIService, PhotosNodesCache, PhotosNodesAccess, PhotosNodesCryptoService } from './nodes';
|
|
7
|
+
|
|
8
|
+
function generateAPINode() {
|
|
9
|
+
return {
|
|
10
|
+
Link: {
|
|
11
|
+
LinkID: 'linkId',
|
|
12
|
+
ParentLinkID: 'parentLinkId',
|
|
13
|
+
NameHash: 'nameHash',
|
|
14
|
+
CreateTime: 123456789,
|
|
15
|
+
ModifyTime: 1234567890,
|
|
16
|
+
TrashTime: 0,
|
|
17
|
+
Name: 'encName',
|
|
18
|
+
SignatureEmail: 'sigEmail',
|
|
19
|
+
NameSignatureEmail: 'nameSigEmail',
|
|
20
|
+
NodeKey: 'nodeKey',
|
|
21
|
+
NodePassphrase: 'nodePass',
|
|
22
|
+
NodePassphraseSignature: 'nodePassSig',
|
|
23
|
+
},
|
|
24
|
+
SharingSummary: null,
|
|
25
|
+
Sharing: null,
|
|
26
|
+
Membership: null,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function generateAPIFolderNode(linkOverrides = {}, overrides = {}) {
|
|
31
|
+
const node = generateAPINode();
|
|
32
|
+
return {
|
|
33
|
+
...node,
|
|
34
|
+
Link: { ...node.Link, Type: 1, ...linkOverrides },
|
|
35
|
+
Folder: { XAttr: '{folder}', NodeHashKey: 'nodeHashKey' },
|
|
36
|
+
Photo: null,
|
|
37
|
+
...overrides,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function generateAPIAlbumNode(linkOverrides = {}, overrides = {}) {
|
|
42
|
+
const node = generateAPINode();
|
|
43
|
+
return {
|
|
44
|
+
...node,
|
|
45
|
+
Link: { ...node.Link, Type: 3, ...linkOverrides },
|
|
46
|
+
Photo: null,
|
|
47
|
+
Folder: null,
|
|
48
|
+
...overrides,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function generateAPIPhotoNode(linkOverrides = {}, overrides = {}) {
|
|
53
|
+
const node = generateAPINode();
|
|
54
|
+
return {
|
|
55
|
+
...node,
|
|
56
|
+
Link: { ...node.Link, Type: 2, ...linkOverrides },
|
|
57
|
+
Photo: {
|
|
58
|
+
CaptureTime: 1700000000,
|
|
59
|
+
MainPhotoLinkID: null,
|
|
60
|
+
RelatedPhotosLinkIDs: [],
|
|
61
|
+
ContentHash: 'contentHash123',
|
|
62
|
+
Tags: [1, 2],
|
|
63
|
+
Albums: [
|
|
64
|
+
{
|
|
65
|
+
AlbumLinkID: 'albumLinkId1',
|
|
66
|
+
AddedTime: 1700001000,
|
|
67
|
+
Hash: 'albumHash',
|
|
68
|
+
ContentHash: 'albumContentHash',
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
ActiveRevision: {
|
|
72
|
+
RevisionID: 'revisionId',
|
|
73
|
+
CreateTime: 1234567890,
|
|
74
|
+
SignatureEmail: 'revSigEmail',
|
|
75
|
+
XAttr: '{photo}',
|
|
76
|
+
EncryptedSize: 12,
|
|
77
|
+
},
|
|
78
|
+
MediaType: 'image/jpeg',
|
|
79
|
+
ContentKeyPacket: 'contentKeyPacket',
|
|
80
|
+
ContentKeyPacketSignature: 'contentKeyPacketSig',
|
|
81
|
+
},
|
|
82
|
+
Folder: null,
|
|
83
|
+
...overrides,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
describe('PhotosNodesAPIService', () => {
|
|
88
|
+
let apiMock: DriveAPIService;
|
|
89
|
+
let api: PhotosNodesAPIService;
|
|
90
|
+
|
|
91
|
+
beforeEach(() => {
|
|
92
|
+
// @ts-expect-error Mocking for testing purposes
|
|
93
|
+
apiMock = {
|
|
94
|
+
post: jest.fn(),
|
|
95
|
+
};
|
|
96
|
+
api = new PhotosNodesAPIService(getMockLogger(), apiMock, 'clientUid');
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
describe('linkToEncryptedNode', () => {
|
|
100
|
+
async function testIterateNodes(mockedLink: object, expectedType: NodeType) {
|
|
101
|
+
apiMock.post = jest.fn().mockResolvedValue({ Links: [mockedLink] });
|
|
102
|
+
|
|
103
|
+
const nodes = await Array.fromAsync(api.iterateNodes(['volumeId~nodeId'], 'volumeId'));
|
|
104
|
+
expect(nodes).toHaveLength(1);
|
|
105
|
+
expect(nodes[0].type).toBe(expectedType);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
it('should convert folder (type 1) to folder node', async () => {
|
|
109
|
+
await testIterateNodes(generateAPIFolderNode(), NodeType.Folder);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('should convert album (type 3) to album node', async () => {
|
|
113
|
+
await testIterateNodes(generateAPIAlbumNode(), NodeType.Album);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('should convert photo (type 2) to photo node with photo attributes', async () => {
|
|
117
|
+
apiMock.post = jest.fn().mockResolvedValue({ Links: [generateAPIPhotoNode()] });
|
|
118
|
+
|
|
119
|
+
const nodes = await Array.fromAsync(api.iterateNodes(['volumeId~nodeId'], 'volumeId'));
|
|
120
|
+
|
|
121
|
+
expect(nodes).toHaveLength(1);
|
|
122
|
+
expect(nodes[0].type).toBe(NodeType.Photo);
|
|
123
|
+
expect(nodes[0].photo).toBeDefined();
|
|
124
|
+
expect(nodes[0].photo?.captureTime).toEqual(new Date(1700000000 * 1000));
|
|
125
|
+
expect(nodes[0].photo?.tags).toEqual([1, 2]);
|
|
126
|
+
expect(nodes[0].photo?.albums).toHaveLength(1);
|
|
127
|
+
expect(nodes[0].photo?.albums[0].nodeUid).toBe('volumeId~albumLinkId1');
|
|
128
|
+
expect(nodes[0].photo?.albums[0].additionTime).toEqual(new Date(1700001000 * 1000));
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
describe('PhotosNodesCache', () => {
|
|
134
|
+
let cache: PhotosNodesCache;
|
|
135
|
+
|
|
136
|
+
beforeEach(() => {
|
|
137
|
+
const memoryCache = new MemoryCache<string>();
|
|
138
|
+
cache = new PhotosNodesCache(getMockLogger(), memoryCache);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
describe('deserialiseNode', () => {
|
|
142
|
+
it('should convert photo attributes dates from strings to Date objects', () => {
|
|
143
|
+
const serialisedNode = JSON.stringify({
|
|
144
|
+
uid: 'volumeId~linkId',
|
|
145
|
+
parentUid: 'volumeId~parentLinkId',
|
|
146
|
+
type: NodeType.Photo,
|
|
147
|
+
directRole: MemberRole.Admin,
|
|
148
|
+
isShared: false,
|
|
149
|
+
isSharedPublicly: false,
|
|
150
|
+
creationTime: '2023-11-14T22:13:20.000Z',
|
|
151
|
+
modificationTime: '2023-11-14T22:13:20.000Z',
|
|
152
|
+
photo: {
|
|
153
|
+
captureTime: '2023-11-14T22:13:20.000Z',
|
|
154
|
+
mainPhotoNodeUid: undefined,
|
|
155
|
+
relatedPhotoNodeUids: [],
|
|
156
|
+
tags: [1],
|
|
157
|
+
albums: [
|
|
158
|
+
{
|
|
159
|
+
nodeUid: 'volumeId~albumId',
|
|
160
|
+
additionTime: '2023-11-15T10:00:00.000Z',
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
const node = cache.deserialiseNode(serialisedNode);
|
|
167
|
+
|
|
168
|
+
expect(node.photo).toBeDefined();
|
|
169
|
+
expect(node.photo?.captureTime).toBeInstanceOf(Date);
|
|
170
|
+
expect(node.photo?.captureTime).toEqual(new Date('2023-11-14T22:13:20.000Z'));
|
|
171
|
+
expect(node.photo?.albums[0].additionTime).toBeInstanceOf(Date);
|
|
172
|
+
expect(node.photo?.albums[0].additionTime).toEqual(new Date('2023-11-15T10:00:00.000Z'));
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('should handle node without photo attributes', () => {
|
|
176
|
+
const serialisedNode = JSON.stringify({
|
|
177
|
+
uid: 'volumeId~linkId',
|
|
178
|
+
parentUid: 'volumeId~parentLinkId',
|
|
179
|
+
type: NodeType.Folder,
|
|
180
|
+
directRole: MemberRole.Admin,
|
|
181
|
+
isShared: false,
|
|
182
|
+
isSharedPublicly: false,
|
|
183
|
+
creationTime: '2023-11-14T22:13:20.000Z',
|
|
184
|
+
modificationTime: '2023-11-14T22:13:20.000Z',
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const node = cache.deserialiseNode(serialisedNode);
|
|
188
|
+
|
|
189
|
+
expect(node.photo).toBeUndefined();
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
describe('PhotosNodesAccess', () => {
|
|
195
|
+
describe('parseNode', () => {
|
|
196
|
+
it('should keep photo type and add photo object', async () => {
|
|
197
|
+
const telemetry = getMockTelemetry();
|
|
198
|
+
|
|
199
|
+
// @ts-expect-error Mocking for testing purposes
|
|
200
|
+
const cryptoService: PhotosNodesCryptoService = {};
|
|
201
|
+
// @ts-expect-error Mocking for testing purposes
|
|
202
|
+
const apiService: PhotosNodesAPIService = {};
|
|
203
|
+
// @ts-expect-error Mocking for testing purposes
|
|
204
|
+
const cacheService: PhotosNodesCache = {};
|
|
205
|
+
// @ts-expect-error Mocking for testing purposes
|
|
206
|
+
const cryptoCache: NodesCryptoCache = {};
|
|
207
|
+
// @ts-expect-error Mocking for testing purposes
|
|
208
|
+
const sharesService: SharesService = {};
|
|
209
|
+
|
|
210
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
211
|
+
const nodesAccess = new PhotosNodesAccess(telemetry, apiService, cacheService, cryptoCache, cryptoService, sharesService);
|
|
212
|
+
|
|
213
|
+
const unparsedNode = {
|
|
214
|
+
uid: 'volumeId~linkId',
|
|
215
|
+
parentUid: 'volumeId~parentLinkId',
|
|
216
|
+
type: NodeType.Photo,
|
|
217
|
+
name: 'photo.jpg',
|
|
218
|
+
hash: 'hash123',
|
|
219
|
+
directRole: MemberRole.Admin,
|
|
220
|
+
isShared: false,
|
|
221
|
+
isSharedPublicly: false,
|
|
222
|
+
creationTime: new Date(),
|
|
223
|
+
modificationTime: new Date(),
|
|
224
|
+
trashTime: undefined,
|
|
225
|
+
mediaType: 'image/jpeg',
|
|
226
|
+
folder: undefined,
|
|
227
|
+
file: {
|
|
228
|
+
activeRevision: {
|
|
229
|
+
uid: 'revisionId',
|
|
230
|
+
state: 'active' as const,
|
|
231
|
+
creationTime: new Date(),
|
|
232
|
+
storageSize: 100,
|
|
233
|
+
signatureEmail: 'test@example.com',
|
|
234
|
+
claimedModificationTime: new Date(),
|
|
235
|
+
claimedSize: 100,
|
|
236
|
+
claimedDigests: { sha1: 'sha1hash' },
|
|
237
|
+
claimedBlockSizes: [100],
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
photo: {
|
|
241
|
+
captureTime: new Date('2023-11-14T22:13:20.000Z'),
|
|
242
|
+
mainPhotoNodeUid: undefined,
|
|
243
|
+
relatedPhotoNodeUids: [],
|
|
244
|
+
tags: [1, 2],
|
|
245
|
+
albums: [],
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
// @ts-expect-error Accessing protected method for testing
|
|
250
|
+
const parsedNode = nodesAccess.parseNode(unparsedNode);
|
|
251
|
+
|
|
252
|
+
expect(parsedNode.type).toBe(NodeType.Photo);
|
|
253
|
+
expect(parsedNode.photo).toBeDefined();
|
|
254
|
+
expect(parsedNode.photo?.captureTime).toEqual(new Date('2023-11-14T22:13:20.000Z'));
|
|
255
|
+
expect(parsedNode.photo?.tags).toEqual([1, 2]);
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
});
|
|
@@ -45,15 +45,15 @@ describe('PhotosTimeline', () => {
|
|
|
45
45
|
timeline = new PhotosTimeline(logger, apiService, driveCrypto, photoShares, nodesService);
|
|
46
46
|
});
|
|
47
47
|
|
|
48
|
-
describe('
|
|
48
|
+
describe('findPhotoDuplicates', () => {
|
|
49
49
|
it('should not call sha1 callback when there is no name hash match', async () => {
|
|
50
50
|
const generateSha1 = jest.fn();
|
|
51
51
|
apiService.checkPhotoDuplicates = jest.fn().mockResolvedValue([]);
|
|
52
52
|
driveCrypto.generateLookupHash = jest.fn().mockResolvedValue(nameHash);
|
|
53
53
|
|
|
54
|
-
const result = await timeline.
|
|
54
|
+
const result = await timeline.findPhotoDuplicates(name, generateSha1);
|
|
55
55
|
|
|
56
|
-
expect(result).
|
|
56
|
+
expect(result).toEqual([]);
|
|
57
57
|
expect(generateSha1).not.toHaveBeenCalled();
|
|
58
58
|
expect(photoShares.getRootIDs).toHaveBeenCalled();
|
|
59
59
|
expect(nodesService.getNodeKeys).toHaveBeenCalledWith(rootNodeUid);
|
|
@@ -76,9 +76,9 @@ describe('PhotosTimeline', () => {
|
|
|
76
76
|
.mockResolvedValueOnce(nameHash)
|
|
77
77
|
.mockResolvedValueOnce(contentHash);
|
|
78
78
|
|
|
79
|
-
const result = await timeline.
|
|
79
|
+
const result = await timeline.findPhotoDuplicates(name, generateSha1);
|
|
80
80
|
|
|
81
|
-
expect(result).
|
|
81
|
+
expect(result).toEqual([]);
|
|
82
82
|
expect(generateSha1).toHaveBeenCalledTimes(1);
|
|
83
83
|
expect(driveCrypto.generateLookupHash).toHaveBeenCalledTimes(2);
|
|
84
84
|
expect(driveCrypto.generateLookupHash).toHaveBeenNthCalledWith(1, name, hashKey);
|
|
@@ -102,15 +102,47 @@ describe('PhotosTimeline', () => {
|
|
|
102
102
|
.mockResolvedValueOnce(nameHash)
|
|
103
103
|
.mockResolvedValueOnce(contentHash);
|
|
104
104
|
|
|
105
|
-
const result = await timeline.
|
|
105
|
+
const result = await timeline.findPhotoDuplicates(name, generateSha1);
|
|
106
106
|
|
|
107
|
-
expect(result).
|
|
107
|
+
expect(result).toEqual([nodeUid1]);
|
|
108
108
|
expect(generateSha1).toHaveBeenCalledTimes(1);
|
|
109
109
|
expect(logger.debug).toHaveBeenCalledTimes(1);
|
|
110
110
|
expect(logger.debug).toHaveBeenCalledWith(
|
|
111
111
|
`Duplicate photo found: name hash: ${nameHash}, content hash: ${contentHash}, node uids: ${nodeUid1}`,
|
|
112
112
|
);
|
|
113
113
|
});
|
|
114
|
+
|
|
115
|
+
it('should return multiple node UIDs when multiple duplicates match', async () => {
|
|
116
|
+
const generateSha1 = jest.fn().mockResolvedValue(sha1);
|
|
117
|
+
const nodeUid1 = 'volumeId~node1';
|
|
118
|
+
const nodeUid2 = 'volumeId~node2';
|
|
119
|
+
const duplicates = [
|
|
120
|
+
{
|
|
121
|
+
nameHash: nameHash,
|
|
122
|
+
contentHash: contentHash,
|
|
123
|
+
nodeUid: nodeUid1,
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
nameHash: nameHash,
|
|
127
|
+
contentHash: contentHash,
|
|
128
|
+
nodeUid: nodeUid2,
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
apiService.checkPhotoDuplicates = jest.fn().mockResolvedValue(duplicates);
|
|
132
|
+
driveCrypto.generateLookupHash = jest
|
|
133
|
+
.fn()
|
|
134
|
+
.mockResolvedValueOnce(nameHash)
|
|
135
|
+
.mockResolvedValueOnce(contentHash);
|
|
136
|
+
|
|
137
|
+
const result = await timeline.findPhotoDuplicates(name, generateSha1);
|
|
138
|
+
|
|
139
|
+
expect(result).toEqual([nodeUid1, nodeUid2]);
|
|
140
|
+
expect(generateSha1).toHaveBeenCalledTimes(1);
|
|
141
|
+
expect(logger.debug).toHaveBeenCalledTimes(1);
|
|
142
|
+
expect(logger.debug).toHaveBeenCalledWith(
|
|
143
|
+
`Duplicate photo found: name hash: ${nameHash}, content hash: ${contentHash}, node uids: ${nodeUid1},${nodeUid2}`,
|
|
144
|
+
);
|
|
145
|
+
});
|
|
114
146
|
});
|
|
115
147
|
});
|
|
116
148
|
|
|
@@ -32,7 +32,7 @@ export class PhotosTimeline {
|
|
|
32
32
|
yield* this.apiService.iterateTimeline(volumeId, signal);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
async
|
|
35
|
+
async findPhotoDuplicates(name: string, generateSha1: () => Promise<string>, signal?: AbortSignal): Promise<string[]> {
|
|
36
36
|
const { volumeId, rootNodeId } = await this.photoShares.getRootIDs();
|
|
37
37
|
const rootNodeUid = makeNodeUid(volumeId, rootNodeId);
|
|
38
38
|
const { hashKey } = await this.nodesService.getNodeKeys(rootNodeUid);
|
|
@@ -44,7 +44,7 @@ export class PhotosTimeline {
|
|
|
44
44
|
const duplicates = await this.apiService.checkPhotoDuplicates(volumeId, [nameHash], signal);
|
|
45
45
|
|
|
46
46
|
if (duplicates.length === 0) {
|
|
47
|
-
return
|
|
47
|
+
return [];
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
// Generate the SHA1 only when there is any matching node hash to avoid
|
|
@@ -57,13 +57,13 @@ export class PhotosTimeline {
|
|
|
57
57
|
);
|
|
58
58
|
|
|
59
59
|
if (matchingDuplicates.length === 0) {
|
|
60
|
-
return
|
|
60
|
+
return [];
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
const nodeUids = matchingDuplicates.map((duplicate) => duplicate.nodeUid);
|
|
64
64
|
this.logger.debug(
|
|
65
65
|
`Duplicate photo found: name hash: ${nameHash}, content hash: ${contentHash}, node uids: ${nodeUids}`,
|
|
66
66
|
);
|
|
67
|
-
return
|
|
67
|
+
return nodeUids;
|
|
68
68
|
}
|
|
69
69
|
}
|
|
@@ -197,6 +197,14 @@ export class ProtonDrivePhotosClient {
|
|
|
197
197
|
return this.events.subscribeToCoreEvents(callback);
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
+
/**
|
|
201
|
+
* @returns The root folder to Photos section of the user.
|
|
202
|
+
*/
|
|
203
|
+
async getMyPhotosRootFolder(): Promise<MaybePhotoNode> {
|
|
204
|
+
this.logger.info('Getting my photos root folder');
|
|
205
|
+
return convertInternalPhotoNodePromise(this.nodes.access.getVolumeRootFolder());
|
|
206
|
+
}
|
|
207
|
+
|
|
200
208
|
/**
|
|
201
209
|
* Iterates all the photos for the timeline view.
|
|
202
210
|
*
|
|
@@ -471,10 +479,34 @@ export class ProtonDrivePhotosClient {
|
|
|
471
479
|
* @param generateSha1 - A callback to generate the hex string representation of the SHA1 of the photo content.
|
|
472
480
|
* @param signal - An optional abort signal to cancel the operation.
|
|
473
481
|
* @returns True if the photo already exists in the timeline, false otherwise.
|
|
482
|
+
* @deprecated Use `findPhotoDuplicates` instead to get the node UIDs of duplicate photos.
|
|
474
483
|
*/
|
|
475
484
|
async isDuplicatePhoto(name: string, generateSha1: () => Promise<string>, signal?: AbortSignal): Promise<boolean> {
|
|
476
485
|
this.logger.info(`Checking if photo is a duplicate`);
|
|
477
|
-
return this.photos.timeline.
|
|
486
|
+
return this.photos.timeline.findPhotoDuplicates(name, generateSha1, signal).then(nodeUids => nodeUids.length !== 0);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/**
|
|
490
|
+
* Find duplicate photos by name and content.
|
|
491
|
+
*
|
|
492
|
+
* For given photo name, find existing photos with the same name
|
|
493
|
+
* in the timeline and check if the photo content is also the same.
|
|
494
|
+
* Only the same name is not considered as duplicate photo because
|
|
495
|
+
* it is expected that there are photos with the same name (e.g.,
|
|
496
|
+
* date as a name from multiple cameras, or rolling number).
|
|
497
|
+
*
|
|
498
|
+
* The function accepts a callback to generate the SHA1 and it is
|
|
499
|
+
* called only when there is any matching node name hash to avoid
|
|
500
|
+
* computation for every node if its not necessary.
|
|
501
|
+
*
|
|
502
|
+
* @param name - The name of the photo to check for duplicates.
|
|
503
|
+
* @param generateSha1 - A callback to generate the hex string representation of the SHA1 of the photo content.
|
|
504
|
+
* @param signal - An optional abort signal to cancel the operation.
|
|
505
|
+
* @returns An array of node UIDs of duplicate photos. Empty array if no duplicates found.
|
|
506
|
+
*/
|
|
507
|
+
async findPhotoDuplicates(name: string, generateSha1: () => Promise<string>, signal?: AbortSignal): Promise<string[]> {
|
|
508
|
+
this.logger.info(`Checking if photo have duplicates`);
|
|
509
|
+
return this.photos.timeline.findPhotoDuplicates(name, generateSha1, signal);
|
|
478
510
|
}
|
|
479
511
|
|
|
480
512
|
/**
|