Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@internxt/sdk",
"author": "Internxt <hello@internxt.com>",
"version": "1.24.0",
"version": "1.25.0",
"description": "An sdk for interacting with Internxt's services",
"repository": {
"type": "git",
Expand Down
6 changes: 5 additions & 1 deletion src/drive/photos/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ApiSecurity, ApiUrl, AppDetails } from '../../shared';
import { headersWithToken } from '../../shared/headers';
import { HttpClient } from '../../shared/http/client';
import { PhotoDevice } from './types';
import { GetPhotoFilesInFoldersPayload, GetPhotoFilesInFoldersResponse, PhotoDevice } from './types';

export class Photos {
private readonly client: HttpClient;
Expand Down Expand Up @@ -38,6 +38,10 @@ export class Photos {
return this.client.patch(`/photos/devices/${uuid}`, { deviceName }, this.headers());
}

public getFilesInFolders(payload: GetPhotoFilesInFoldersPayload): Promise<GetPhotoFilesInFoldersResponse> {
return this.client.post('/photos/folders/files/delta/search', payload, this.headers());
}

private headers() {
return headersWithToken({
clientName: this.appDetails.clientName,
Expand Down
8 changes: 8 additions & 0 deletions src/drive/photos/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
import { components } from '../../schema';

export type PhotoDevice = {
uuid: string;
plainName: string;
bucket: string;
status: 'EXISTS' | 'TRASHED' | 'DELETED';
};

export type GetPhotoFilesInFoldersPayload = components['schemas']['GetFilesInFoldersDto'];

export type GetPhotoFilesInFoldersResponse = components['schemas']['GetFilesInFoldersResponseDto'];

export type PhotoFolderFile = GetPhotoFilesInFoldersResponse['files'][number];
43 changes: 42 additions & 1 deletion test/drive/photos/index.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, test, vi } from 'vitest';
import { Photos } from '../../../src/drive/photos';
import { PhotoDevice } from '../../../src/drive/photos/types';
import { PhotoDevice, PhotoFolderFile } from '../../../src/drive/photos/types';
import { ApiSecurity, AppDetails } from '../../../src/shared';
import { headersWithToken } from '../../../src/shared/headers';
import { HttpClient } from '../../../src/shared/http/client';
Expand Down Expand Up @@ -124,3 +124,44 @@ describe('renameDevice', () => {
await expect(client.renameDevice('device-uuid-1', 'New Name')).rejects.toThrow('server error');
});
});

describe('getFilesInFolders', () => {
const photoFile = {
uuid: 'file-uuid-1',
plainName: 'IMG_0001',
type: 'heic',
folderUuid: 'day-folder-uuid-1',
status: 'EXISTS',
thumbnails: [],
} as unknown as PhotoFolderFile;

test('when files are requested by folders and date, then the files and next cursor are returned', async () => {
const response = { files: [photoFile], nextCursor: 'next-cursor' };
vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue(response);
const { client, headers } = clientAndHeaders();
const payload = { folderUuids: ['day-folder-uuid-1', 'day-folder-uuid-2'], updatedAt: '1970-01-01T00:00:00.000Z' };

const result = await client.getFilesInFolders(payload);

expect(result).toEqual(response);
expect(HttpClient.prototype.post).toHaveBeenCalledWith('/photos/folders/files/delta/search', payload, headers);
});

test('when a cursor and a limit are given, then they are sent to fetch the next page', async () => {
vi.spyOn(HttpClient.prototype, 'post').mockResolvedValue({ files: [], nextCursor: null });
const { client, headers } = clientAndHeaders();
const payload = { folderUuids: ['day-folder-uuid-1'], cursor: 'next-cursor', limit: 50 };

const result = await client.getFilesInFolders(payload);

expect(result).toEqual({ files: [], nextCursor: null });
expect(HttpClient.prototype.post).toHaveBeenCalledWith('/photos/folders/files/delta/search', payload, headers);
});

test('when the server throws, then the error is propagated', async () => {
vi.spyOn(HttpClient.prototype, 'post').mockRejectedValue(new Error('payment required'));
const { client } = clientAndHeaders();

await expect(client.getFilesInFolders({ folderUuids: ['day-folder-uuid-1'] })).rejects.toThrow('payment required');
});
});
Loading