@protontech/drive-sdk 0.13.1 → 0.14.0

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.
Files changed (54) hide show
  1. package/dist/interface/telemetry.d.ts +5 -4
  2. package/dist/interface/telemetry.js +1 -0
  3. package/dist/interface/telemetry.js.map +1 -1
  4. package/dist/internal/download/telemetry.js +2 -1
  5. package/dist/internal/download/telemetry.js.map +1 -1
  6. package/dist/internal/nodes/cryptoReporter.js +2 -2
  7. package/dist/internal/nodes/cryptoReporter.js.map +1 -1
  8. package/dist/internal/photos/addToAlbum.d.ts +6 -0
  9. package/dist/internal/photos/addToAlbum.js +1 -0
  10. package/dist/internal/photos/addToAlbum.js.map +1 -1
  11. package/dist/internal/photos/albumsManager.d.ts +4 -1
  12. package/dist/internal/photos/albumsManager.js +22 -2
  13. package/dist/internal/photos/albumsManager.js.map +1 -1
  14. package/dist/internal/photos/albumsManager.test.js +41 -1
  15. package/dist/internal/photos/albumsManager.test.js.map +1 -1
  16. package/dist/internal/photos/apiService.d.ts +1 -0
  17. package/dist/internal/photos/apiService.js +59 -5
  18. package/dist/internal/photos/apiService.js.map +1 -1
  19. package/dist/internal/photos/apiService.test.js +137 -0
  20. package/dist/internal/photos/apiService.test.js.map +1 -1
  21. package/dist/internal/photos/errors.d.ts +5 -0
  22. package/dist/internal/photos/errors.js +10 -1
  23. package/dist/internal/photos/errors.js.map +1 -1
  24. package/dist/internal/photos/index.js +1 -1
  25. package/dist/internal/photos/index.js.map +1 -1
  26. package/dist/internal/photos/photosManager.d.ts +1 -0
  27. package/dist/internal/photos/photosManager.js +42 -4
  28. package/dist/internal/photos/photosManager.js.map +1 -1
  29. package/dist/internal/photos/photosManager.test.js +35 -0
  30. package/dist/internal/photos/photosManager.test.js.map +1 -1
  31. package/dist/internal/photos/photosTransferPayloadBuilder.d.ts +1 -0
  32. package/dist/internal/photos/photosTransferPayloadBuilder.js +1 -0
  33. package/dist/internal/photos/photosTransferPayloadBuilder.js.map +1 -1
  34. package/dist/internal/upload/telemetry.js +2 -1
  35. package/dist/internal/upload/telemetry.js.map +1 -1
  36. package/dist/protonDrivePhotosClient.d.ts +4 -3
  37. package/dist/protonDrivePhotosClient.js +3 -3
  38. package/dist/protonDrivePhotosClient.js.map +1 -1
  39. package/package.json +1 -1
  40. package/src/interface/telemetry.ts +5 -4
  41. package/src/internal/download/telemetry.ts +2 -2
  42. package/src/internal/nodes/cryptoReporter.ts +4 -2
  43. package/src/internal/photos/addToAlbum.ts +1 -1
  44. package/src/internal/photos/albumsManager.test.ts +61 -1
  45. package/src/internal/photos/albumsManager.ts +23 -3
  46. package/src/internal/photos/apiService.test.ts +155 -0
  47. package/src/internal/photos/apiService.ts +92 -3
  48. package/src/internal/photos/errors.ts +11 -0
  49. package/src/internal/photos/index.ts +1 -1
  50. package/src/internal/photos/photosManager.test.ts +43 -1
  51. package/src/internal/photos/photosManager.ts +61 -3
  52. package/src/internal/photos/photosTransferPayloadBuilder.ts +3 -1
  53. package/src/internal/upload/telemetry.ts +2 -2
  54. package/src/protonDrivePhotosClient.ts +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"protonDrivePhotosClient.js","sourceRoot":"","sources":["../src/protonDrivePhotosClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protonDrivePhotosClient.js","sourceRoot":"","sources":["../src/protonDrivePhotosClient.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@protontech/drive-sdk",
3
- "version": "0.13.1",
3
+ "version": "0.14.0",
4
4
  "description": "Proton Drive SDK",
5
5
  "license": "GPL-3.0",
6
6
  "main": "dist/index.js",
@@ -34,7 +34,7 @@ export interface MetricDebounceLongWaitEvent {
34
34
 
35
35
  export interface MetricUploadEvent {
36
36
  eventName: 'upload';
37
- volumeType?: MetricVolumeType;
37
+ volumeType: MetricVolumeType;
38
38
  uploadedSize: number;
39
39
  approximateUploadedSize: number;
40
40
  expectedSize: number;
@@ -52,7 +52,7 @@ export type MetricsUploadErrorType =
52
52
 
53
53
  export interface MetricDownloadEvent {
54
54
  eventName: 'download';
55
- volumeType?: MetricVolumeType;
55
+ volumeType: MetricVolumeType;
56
56
  downloadedSize: number;
57
57
  approximateDownloadedSize: number;
58
58
  claimedFileSize?: number;
@@ -71,7 +71,7 @@ export type MetricsDownloadErrorType =
71
71
 
72
72
  export interface MetricDecryptionErrorEvent {
73
73
  eventName: 'decryptionError';
74
- volumeType?: MetricVolumeType;
74
+ volumeType: MetricVolumeType;
75
75
  field: MetricsDecryptionErrorField;
76
76
  fromBefore2024?: boolean;
77
77
  error?: unknown;
@@ -89,7 +89,7 @@ export type MetricsDecryptionErrorField =
89
89
 
90
90
  export interface MetricVerificationErrorEvent {
91
91
  eventName: 'verificationError';
92
- volumeType?: MetricVolumeType;
92
+ volumeType: MetricVolumeType;
93
93
  field: MetricVerificationErrorField;
94
94
  addressMatchingDefaultShare?: boolean;
95
95
  fromBefore2024?: boolean;
@@ -118,6 +118,7 @@ export interface MetricVolumeEventsSubscriptionsChangedEvent {
118
118
  }
119
119
 
120
120
  export enum MetricVolumeType {
121
+ Unknown = 'unknown',
121
122
  OwnVolume = 'own_volume',
122
123
  OwnPhotoVolume = 'own_photo_volume',
123
124
  Shared = 'shared',
@@ -1,5 +1,5 @@
1
1
  import { RateLimitedError, ValidationError, DecryptionError, IntegrityError } from '../../errors';
2
- import { ProtonDriveTelemetry, MetricsDownloadErrorType, Logger } from '../../interface';
2
+ import { ProtonDriveTelemetry, MetricsDownloadErrorType, Logger, MetricVolumeType } from '../../interface';
3
3
  import { LoggerWithPrefix, reduceSizePrecision } from '../../telemetry';
4
4
  import { APIHTTPError } from '../apiService';
5
5
  import { splitNodeRevisionUid, splitNodeUid } from '../uids';
@@ -73,7 +73,7 @@ export class DownloadTelemetry {
73
73
  originalError?: unknown;
74
74
  },
75
75
  ) {
76
- let volumeType;
76
+ let volumeType = MetricVolumeType.Unknown;
77
77
  try {
78
78
  volumeType = await this.sharesService.getVolumeMetricContext(volumeId);
79
79
  } catch (error: unknown) {
@@ -8,6 +8,7 @@ import {
8
8
  Logger,
9
9
  MetricsDecryptionErrorField,
10
10
  MetricVerificationErrorField,
11
+ MetricVolumeType,
11
12
  } from '../../interface';
12
13
  import { getVerificationMessage, isNotApplicationError } from '../errors';
13
14
  import { splitNodeUid } from '../uids';
@@ -63,7 +64,8 @@ export class NodesCryptoReporter {
63
64
 
64
65
  const fromBefore2024 = node.creationTime < new Date('2024-01-01');
65
66
 
66
- let addressMatchingDefaultShare, volumeType;
67
+ let addressMatchingDefaultShare,
68
+ volumeType = MetricVolumeType.Unknown;
67
69
  try {
68
70
  const { volumeId } = splitNodeUid(node.uid);
69
71
  const { email } = await this.shareService.getMyFilesShareMemberEmailKey();
@@ -99,7 +101,7 @@ export class NodesCryptoReporter {
99
101
 
100
102
  const fromBefore2024 = node.creationTime < new Date('2024-01-01');
101
103
 
102
- let volumeType;
104
+ let volumeType = MetricVolumeType.Unknown;
103
105
  try {
104
106
  const { volumeId } = splitNodeUid(node.uid);
105
107
  volumeType = await this.shareService.getVolumeMetricContext(volumeId);
@@ -211,7 +211,7 @@ function splitByVolume(
211
211
  * Groups payloads into batches respecting the API limit.
212
212
  * Each payload's size counts itself plus its related photos.
213
213
  */
214
- function* createBatches(payloads: TransferEncryptedPhotoPayload[]): Generator<TransferEncryptedPhotoPayload[]> {
214
+ export function* createBatches(payloads: TransferEncryptedPhotoPayload[]): Generator<TransferEncryptedPhotoPayload[]> {
215
215
  let batch: TransferEncryptedPhotoPayload[] = [];
216
216
  let batchSize = 0;
217
217
 
@@ -4,8 +4,10 @@ import { getMockTelemetry } from '../../tests/telemetry';
4
4
  import { AlbumsManager } from './albumsManager';
5
5
  import { AlbumsCryptoService } from './albumsCrypto';
6
6
  import { PhotosAPIService } from './apiService';
7
+ import { AlbumContainsPhotosNotInTimelineError } from './errors';
7
8
  import { DecryptedPhotoNode } from './interface';
8
9
  import { PhotosNodesAccess } from './nodes';
10
+ import { PhotosManager } from './photosManager';
9
11
  import { PhotoSharesManager } from './shares';
10
12
 
11
13
  describe('Albums', () => {
@@ -13,6 +15,7 @@ describe('Albums', () => {
13
15
  let cryptoService: AlbumsCryptoService;
14
16
  let photoShares: PhotoSharesManager;
15
17
  let nodesService: PhotosNodesAccess;
18
+ let photosService: PhotosManager;
16
19
  let albums: AlbumsManager;
17
20
 
18
21
  let nodes: { [uid: string]: DecryptedPhotoNode };
@@ -97,7 +100,19 @@ describe('Albums', () => {
97
100
  notifyChildCreated: jest.fn(),
98
101
  };
99
102
 
100
- albums = new AlbumsManager(getMockTelemetry(), apiService, cryptoService, photoShares, nodesService);
103
+ // @ts-expect-error No need to implement all methods for mocking
104
+ photosService = {
105
+ saveToTimeline: jest.fn(),
106
+ };
107
+
108
+ albums = new AlbumsManager(
109
+ getMockTelemetry(),
110
+ apiService,
111
+ cryptoService,
112
+ photoShares,
113
+ nodesService,
114
+ photosService,
115
+ );
101
116
  });
102
117
 
103
118
  describe('createAlbum', () => {
@@ -231,6 +246,51 @@ describe('Albums', () => {
231
246
  expect(apiService.deleteAlbum).toHaveBeenCalledWith('albumNodeUid', { force: true });
232
247
  expect(nodesService.notifyNodeDeleted).toHaveBeenCalledWith('albumNodeUid');
233
248
  });
249
+
250
+ it('when saveToTimeline is true, saves photos then retries delete', async () => {
251
+ const notInTimelineError = new AlbumContainsPhotosNotInTimelineError('msg', 1, ['p1', 'p2']);
252
+ (apiService.deleteAlbum as jest.Mock)
253
+ .mockRejectedValueOnce(notInTimelineError)
254
+ .mockResolvedValueOnce(undefined);
255
+
256
+ photosService.saveToTimeline = jest.fn().mockImplementation(async function* () {
257
+ yield { uid: 'p1', ok: true };
258
+ yield { uid: 'p2', ok: true };
259
+ });
260
+
261
+ await albums.deleteAlbum('albumNodeUid', { saveToTimeline: true });
262
+
263
+ expect(apiService.deleteAlbum).toHaveBeenCalledTimes(2);
264
+ expect(photosService.saveToTimeline).toHaveBeenCalledWith(['p1', 'p2']);
265
+ expect(nodesService.notifyNodeDeleted).toHaveBeenCalledTimes(1);
266
+ expect(nodesService.notifyNodeDeleted).toHaveBeenCalledWith('albumNodeUid');
267
+ });
268
+
269
+ it('throws AlbumContainsPhotosNotInTimelineError when saveToTimeline is false', async () => {
270
+ const notInTimelineError = new AlbumContainsPhotosNotInTimelineError('msg', 1, ['p1']);
271
+ (apiService.deleteAlbum as jest.Mock).mockRejectedValueOnce(notInTimelineError);
272
+
273
+ await expect(albums.deleteAlbum('albumNodeUid')).rejects.toBe(notInTimelineError);
274
+
275
+ expect(apiService.deleteAlbum).toHaveBeenCalledTimes(1);
276
+ expect(photosService.saveToTimeline).not.toHaveBeenCalled();
277
+ expect(nodesService.notifyNodeDeleted).not.toHaveBeenCalled();
278
+ });
279
+
280
+ it('throws when saveToTimeline step fails with error', async () => {
281
+ const notInTimelineError = new AlbumContainsPhotosNotInTimelineError('msg', 1, ['p1']);
282
+ (apiService.deleteAlbum as jest.Mock).mockRejectedValue(notInTimelineError);
283
+
284
+ const saveError = new Error('save failed');
285
+ photosService.saveToTimeline = jest.fn().mockImplementation(async function* () {
286
+ yield { uid: 'p1', ok: false, error: saveError };
287
+ });
288
+
289
+ await expect(albums.deleteAlbum('albumNodeUid', { saveToTimeline: true })).rejects.toBe(saveError);
290
+
291
+ expect(apiService.deleteAlbum).toHaveBeenCalledTimes(1);
292
+ expect(nodesService.notifyNodeDeleted).not.toHaveBeenCalled();
293
+ });
234
294
  });
235
295
 
236
296
  describe('removePhotos', () => {
@@ -7,8 +7,10 @@ import { splitNodeUid } from '../uids';
7
7
  import { AddToAlbumProcess } from './addToAlbum';
8
8
  import { AlbumsCryptoService } from './albumsCrypto';
9
9
  import { PhotosAPIService } from './apiService';
10
+ import { AlbumContainsPhotosNotInTimelineError } from './errors';
10
11
  import { AlbumItem, DecryptedPhotoNode } from './interface';
11
12
  import { PhotosNodesAccess } from './nodes';
13
+ import { PhotosManager } from './photosManager';
12
14
  import { PhotoSharesManager } from './shares';
13
15
 
14
16
  const BATCH_LOADING_SIZE = 10;
@@ -25,6 +27,7 @@ export class AlbumsManager {
25
27
  private cryptoService: AlbumsCryptoService,
26
28
  private photoShares: PhotoSharesManager,
27
29
  private nodesService: PhotosNodesAccess,
30
+ private photos: PhotosManager,
28
31
  ) {
29
32
  this.logger = telemetry.getLogger('albums');
30
33
  this.apiService = apiService;
@@ -157,8 +160,25 @@ export class AlbumsManager {
157
160
  return newNode;
158
161
  }
159
162
 
160
- async deleteAlbum(nodeUid: string, options: { force?: boolean } = {}): Promise<void> {
161
- await this.apiService.deleteAlbum(nodeUid, options);
163
+ async deleteAlbum(nodeUid: string, options: { force?: boolean; saveToTimeline?: boolean } = {}): Promise<void> {
164
+ try {
165
+ await this.apiService.deleteAlbum(nodeUid, options);
166
+ } catch (error) {
167
+ if (
168
+ options.saveToTimeline &&
169
+ error instanceof AlbumContainsPhotosNotInTimelineError &&
170
+ error.photosOnlyInAlbumNodeUids.length > 0
171
+ ) {
172
+ for await (const result of this.photos.saveToTimeline(error.photosOnlyInAlbumNodeUids)) {
173
+ if (!result.ok) {
174
+ throw result.error;
175
+ }
176
+ }
177
+ await this.apiService.deleteAlbum(nodeUid, options);
178
+ } else {
179
+ throw error;
180
+ }
181
+ }
162
182
  await this.nodesService.notifyNodeDeleted(nodeUid);
163
183
  }
164
184
 
@@ -183,7 +203,7 @@ export class AlbumsManager {
183
203
  this.logger,
184
204
  signal,
185
205
  );
186
- yield * process.execute(photoNodeUids);
206
+ yield* process.execute(photoNodeUids);
187
207
  }
188
208
 
189
209
  async *removePhotos(
@@ -28,6 +28,7 @@ describe('photosAPIService', () => {
28
28
  nodeUid: 'volumeId1~photoNodeId1',
29
29
  contentHash: 'contentHash1',
30
30
  nameHash: 'nameHash1',
31
+ originalNameHash: 'originalNameHash1',
31
32
  encryptedName: 'encryptedName1',
32
33
  nameSignatureEmail: 'nameSignatureEmail1',
33
34
  nodePassphrase: 'nodePassphrase1',
@@ -38,6 +39,7 @@ describe('photosAPIService', () => {
38
39
  nodeUid: 'volumeId1~photoNodeId2',
39
40
  contentHash: 'contentHash2',
40
41
  nameHash: 'nameHash2',
42
+ originalNameHash: 'originalNameHash2',
41
43
  encryptedName: 'encryptedName2',
42
44
  nameSignatureEmail: 'nameSignatureEmail2',
43
45
  nodePassphrase: 'nodePassphrase2',
@@ -151,6 +153,7 @@ describe('photosAPIService', () => {
151
153
  nodeUid: 'volumeId2~photoNodeId1',
152
154
  contentHash: 'contentHash1',
153
155
  nameHash: 'nameHash1',
156
+ originalNameHash: 'originalNameHash1',
154
157
  encryptedName: 'encryptedName1',
155
158
  nameSignatureEmail: 'nameSignatureEmail1',
156
159
  nodePassphrase: 'nodePassphrase1',
@@ -161,6 +164,7 @@ describe('photosAPIService', () => {
161
164
  nodeUid: 'volumeId2~photoNodeId2',
162
165
  contentHash: 'contentHash2',
163
166
  nameHash: 'nameHash2',
167
+ originalNameHash: 'originalNameHash2',
164
168
  encryptedName: 'encryptedName2',
165
169
  nameSignatureEmail: 'nameSignatureEmail2',
166
170
  nodePassphrase: 'nodePassphrase2',
@@ -230,4 +234,155 @@ describe('photosAPIService', () => {
230
234
  await expect(promise).rejects.toThrow(error);
231
235
  });
232
236
  });
237
+
238
+ describe('transferPhotos', () => {
239
+ const photoPayloads = [
240
+ {
241
+ nodeUid: 'volumeId1~photoNodeId1',
242
+ contentHash: 'contentHash1',
243
+ nameHash: 'nameHash1',
244
+ originalNameHash: 'originalNameHash1',
245
+ encryptedName: 'encryptedName1',
246
+ nameSignatureEmail: 'nameSignatureEmail1',
247
+ nodePassphrase: 'nodePassphrase1',
248
+ nodePassphraseSignature: 'nodePassphraseSignature1',
249
+ signatureEmail: 'signatureEmail1',
250
+ relatedPhotos: [
251
+ {
252
+ nodeUid: 'volumeId1~photoNodeId2',
253
+ contentHash: 'contentHash2',
254
+ nameHash: 'nameHash2',
255
+ originalNameHash: 'originalNameHash2',
256
+ encryptedName: 'encryptedName2',
257
+ nameSignatureEmail: 'nameSignatureEmail2',
258
+ nodePassphrase: 'nodePassphrase2',
259
+ nodePassphraseSignature: 'nodePassphraseSignature2',
260
+ signatureEmail: 'signatureEmail2',
261
+ },
262
+ ],
263
+ },
264
+ ];
265
+
266
+ it('should transfer photos', async () => {
267
+ apiMock.put = jest.fn().mockResolvedValue({
268
+ Code: 1000,
269
+ Responses: [
270
+ {
271
+ LinkID: 'photoNodeId1',
272
+ Response: {
273
+ Code: 1000,
274
+ },
275
+ },
276
+ ],
277
+ });
278
+
279
+ const result = await Array.fromAsync(api.transferPhotos(albumNodeUid, photoPayloads));
280
+
281
+ expect(result).toEqual([
282
+ {
283
+ uid: 'volumeId1~photoNodeId1',
284
+ ok: true,
285
+ },
286
+ ]);
287
+ expect(apiMock.put).toHaveBeenCalledWith(
288
+ `drive/photos/volumes/volumeId1/links/transfer-multiple`,
289
+ {
290
+ ParentLinkID: 'albumNodeId',
291
+ Links: [
292
+ expect.objectContaining({
293
+ LinkID: 'photoNodeId1',
294
+ Hash: 'nameHash1',
295
+ OriginalHash: 'originalNameHash1',
296
+ Name: 'encryptedName1',
297
+ NodePassphrase: 'nodePassphrase1',
298
+ ContentHash: 'contentHash1',
299
+ NodePassphraseSignature: null,
300
+ }),
301
+ expect.objectContaining({
302
+ LinkID: 'photoNodeId2',
303
+ Hash: 'nameHash2',
304
+ OriginalHash: 'originalNameHash2',
305
+ Name: 'encryptedName2',
306
+ NodePassphrase: 'nodePassphrase2',
307
+ ContentHash: 'contentHash2',
308
+ NodePassphraseSignature: null,
309
+ }),
310
+ ],
311
+ NameSignatureEmail: 'nameSignatureEmail1',
312
+ SignatureEmail: null,
313
+ },
314
+ undefined,
315
+ );
316
+ });
317
+
318
+ it('should return MissingRelatedPhotosError if related photos are missing', async () => {
319
+ apiMock.put = jest.fn().mockResolvedValue({
320
+ Code: 1000,
321
+ Responses: [
322
+ {
323
+ LinkID: 'photoNodeId1',
324
+ Response: {
325
+ Code: 2000,
326
+ Details: {
327
+ Missing: ['photoNodeId3'],
328
+ },
329
+ },
330
+ },
331
+ ],
332
+ });
333
+
334
+ const result = await Array.fromAsync(api.transferPhotos(albumNodeUid, photoPayloads));
335
+
336
+ expect(result).toEqual([
337
+ {
338
+ uid: 'volumeId1~photoNodeId1',
339
+ ok: false,
340
+ error: new MissingRelatedPhotosError([]),
341
+ },
342
+ ]);
343
+ expect((result[0] as any).error.missingNodeUids).toEqual(['volumeId1~photoNodeId3']);
344
+ });
345
+
346
+ it('should return error for unknown error', async () => {
347
+ apiMock.put = jest.fn().mockResolvedValue({
348
+ Code: 1000,
349
+ Responses: [
350
+ {
351
+ LinkID: 'photoNodeId1',
352
+ Response: {
353
+ Code: 3000,
354
+ Error: 'Some error',
355
+ },
356
+ },
357
+ ],
358
+ });
359
+
360
+ const result = await Array.fromAsync(api.transferPhotos(albumNodeUid, photoPayloads));
361
+
362
+ expect(result).toEqual([
363
+ {
364
+ uid: 'volumeId1~photoNodeId1',
365
+ ok: false,
366
+ error: new APICodeError('Some error', 3000),
367
+ },
368
+ ]);
369
+ });
370
+
371
+ it('should throw if name signature emails differ', async () => {
372
+ const mixedPayloads = [
373
+ photoPayloads[0],
374
+ {
375
+ ...photoPayloads[0],
376
+ nodeUid: 'volumeId1~photoNodeIdOther',
377
+ nameSignatureEmail: 'other@example.com',
378
+ relatedPhotos: [],
379
+ },
380
+ ];
381
+
382
+ await expect(Array.fromAsync(api.transferPhotos(albumNodeUid, mixedPayloads))).rejects.toThrow(
383
+ 'All photos must have the same name signature email',
384
+ );
385
+ expect(apiMock.put).not.toHaveBeenCalled();
386
+ });
387
+ });
233
388
  });
@@ -1,12 +1,11 @@
1
1
  import { c } from 'ttag';
2
2
 
3
- import { ValidationError } from '../../errors';
4
3
  import { NodeResultWithError, PhotoTag } from '../../interface';
5
4
  import { APICodeError, DriveAPIService, drivePaths, InvalidRequirementsAPIError, isCodeOk } from '../apiService';
6
5
  import { batch } from '../batch';
7
6
  import { EncryptedRootShare, EncryptedShareCrypto, ShareType } from '../shares/interface';
8
7
  import { makeNodeUid, splitNodeUid } from '../uids';
9
- import { MissingRelatedPhotosError } from './errors';
8
+ import { AlbumContainsPhotosNotInTimelineError, MissingRelatedPhotosError } from './errors';
10
9
  import { AlbumItem } from './interface';
11
10
  import { TransferEncryptedPhotoPayload } from './photosTransferPayloadBuilder';
12
11
 
@@ -82,6 +81,13 @@ type PostFavoritePhotoRequest = Extract<
82
81
  { content: object }
83
82
  >['content']['application/json'];
84
83
 
84
+ type PutTransferPhotosRequest = Extract<
85
+ drivePaths['/drive/photos/volumes/{volumeID}/links/transfer-multiple']['put']['requestBody'],
86
+ { content: object }
87
+ >['content']['application/json'];
88
+ type PutTransferPhotosResponse =
89
+ drivePaths['/drive/photos/volumes/{volumeID}/links/transfer-multiple']['put']['responses']['200']['content']['application/json'];
90
+
85
91
  const ALBUM_CONTAINS_PHOTOS_NOT_IN_TIMELINE_ERROR_CODE = 200302;
86
92
 
87
93
  /**
@@ -336,7 +342,9 @@ export class PhotosAPIService {
336
342
  );
337
343
  } catch (error) {
338
344
  if (error instanceof APICodeError && error.code === ALBUM_CONTAINS_PHOTOS_NOT_IN_TIMELINE_ERROR_CODE) {
339
- throw new ValidationError(c('Error').t`Album contains photos not in timeline`);
345
+ const childLinkIds = (error.debug as { ChildLinkIDs: string[] })?.ChildLinkIDs || [];
346
+ const nodeUids = childLinkIds.map((linkId) => makeNodeUid(volumeId, linkId));
347
+ throw new AlbumContainsPhotosNotInTimelineError(error.message, error.code, nodeUids);
340
348
  }
341
349
  throw error;
342
350
  }
@@ -556,4 +564,85 @@ export class PhotosAPIService {
556
564
  requestBody,
557
565
  );
558
566
  }
567
+
568
+ async *transferPhotos(
569
+ newParentNodeUid: string,
570
+ photoPayloads: TransferEncryptedPhotoPayload[],
571
+ signal?: AbortSignal,
572
+ ): AsyncGenerator<NodeResultWithError> {
573
+ const { volumeId, nodeId: newParentNodeId } = splitNodeUid(newParentNodeUid);
574
+
575
+ if (photoPayloads.length === 0) {
576
+ return;
577
+ }
578
+
579
+ const nameSignatureEmail = photoPayloads[0].nameSignatureEmail;
580
+ if (photoPayloads.some((photoPayload) => photoPayload.nameSignatureEmail !== nameSignatureEmail)) {
581
+ throw new Error('All photos must have the same name signature email');
582
+ }
583
+
584
+ const allPhotoPayloads = photoPayloads.flatMap((photoPayload) => [photoPayload, ...photoPayload.relatedPhotos]);
585
+ const allLinksData = allPhotoPayloads.map((photoPayload) => {
586
+ const { nodeId } = splitNodeUid(photoPayload.nodeUid);
587
+ return {
588
+ LinkID: nodeId,
589
+ Hash: photoPayload.nameHash,
590
+ OriginalHash: photoPayload.originalNameHash!,
591
+ Name: photoPayload.encryptedName,
592
+ NodePassphrase: photoPayload.nodePassphrase,
593
+ ContentHash: photoPayload.contentHash,
594
+ NodePassphraseSignature: null, // Required when moving an anonymous node.
595
+ };
596
+ });
597
+
598
+ const response = await this.apiService.put<PutTransferPhotosRequest, PutTransferPhotosResponse>(
599
+ `drive/photos/volumes/${volumeId}/links/transfer-multiple`,
600
+ {
601
+ ParentLinkID: newParentNodeId,
602
+ Links: allLinksData,
603
+ NameSignatureEmail: nameSignatureEmail,
604
+ SignatureEmail: null, // Required when moving an anonymous node.
605
+ },
606
+ signal,
607
+ );
608
+
609
+ const errors = new Map<string, Error>();
610
+
611
+ for (const r of response.Responses || []) {
612
+ const details = r as {
613
+ LinkID: string;
614
+ Response: {
615
+ Code: number;
616
+ Error?: string;
617
+ Details: { Missing: string[] };
618
+ };
619
+ };
620
+
621
+ if (!details.Response.Code || !isCodeOk(details.Response.Code) || details.Response?.Error) {
622
+ const nodeUid = makeNodeUid(volumeId, details.LinkID);
623
+
624
+ if (details.Response.Details?.Missing) {
625
+ const missingNodeUids = details.Response.Details.Missing.map((linkId) =>
626
+ makeNodeUid(volumeId, linkId),
627
+ );
628
+ errors.set(nodeUid, new MissingRelatedPhotosError(missingNodeUids));
629
+ } else {
630
+ errors.set(
631
+ nodeUid,
632
+ new APICodeError(details.Response.Error || c('Error').t`Unknown error`, details.Response.Code),
633
+ );
634
+ }
635
+ }
636
+ }
637
+
638
+ for (const photoPayload of photoPayloads) {
639
+ const uid = photoPayload.nodeUid;
640
+ const error = errors.get(uid);
641
+ if (error) {
642
+ yield { uid, ok: false, error };
643
+ } else {
644
+ yield { uid, ok: true };
645
+ }
646
+ }
647
+ }
559
648
  }
@@ -1,5 +1,7 @@
1
1
  import { c } from 'ttag';
2
2
 
3
+ import { ValidationError } from '../../errors';
4
+
3
5
  export class MissingRelatedPhotosError extends Error {
4
6
  constructor(public missingNodeUids: string[]) {
5
7
  // We do not want to leak the technical details of the error to the user.
@@ -9,3 +11,12 @@ export class MissingRelatedPhotosError extends Error {
9
11
  this.name = 'MissingRelatedPhotosError';
10
12
  }
11
13
  }
14
+
15
+ export class AlbumContainsPhotosNotInTimelineError extends ValidationError {
16
+ public readonly photosOnlyInAlbumNodeUids: string[];
17
+
18
+ constructor(message: string, code: number, photosOnlyInAlbumNodeUids: string[]) {
19
+ super(message, code);
20
+ this.photosOnlyInAlbumNodeUids = photosOnlyInAlbumNodeUids;
21
+ }
22
+ }
@@ -62,8 +62,8 @@ export function initPhotosModule(
62
62
  photoShares,
63
63
  nodesService,
64
64
  );
65
- const albums = new AlbumsManager(telemetry, api, albumsCryptoService, photoShares, nodesService);
66
65
  const photos = new PhotosManager(telemetry.getLogger('photos-update'), api, albumsCryptoService, nodesService);
66
+ const albums = new AlbumsManager(telemetry, api, albumsCryptoService, photoShares, nodesService, photos);
67
67
 
68
68
  return {
69
69
  timeline,