Skip to content

Commit

Permalink
fix: Fixed double extension for screenshots (#2419)
Browse files Browse the repository at this point in the history
Check if the key in a File Key Value Storage already has an extension. If so use the key as the file name directly, otherwise append extension.

Closes #1980
  • Loading branch information
damianr13 committed Apr 22, 2024
1 parent e4cd41c commit e8b39c4
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
5 changes: 4 additions & 1 deletion packages/memory-storage/src/fs/key-value-store/fs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { basename } from 'node:path/win32';

import { AsyncQueue } from '@sapphire/async-queue';
import { ensureDir } from 'fs-extra';
import mime from 'mime-types';

import { lockAndWrite } from '../../background-handler/fs-utils';
import type { InternalKeyRecord } from '../../resource-clients/key-value-store';
Expand Down Expand Up @@ -57,7 +58,9 @@ export class KeyValueFileSystemEntry implements StorageImplementation<InternalKe

async update(data: InternalKeyRecord) {
await this.fsQueue.wait();
this.filePath ??= resolve(this.storeDirectory, `${data.key}.${data.extension}`);
const fileName = mime.contentType(data.key) === data.contentType ? data.key : `${data.key}.${data.extension}`;

this.filePath ??= resolve(this.storeDirectory, fileName);
this.fileMetadataPath ??= resolve(this.storeDirectory, `${data.key}.__metadata__.json`);

const { value, ...rest } = data;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { resolve } from 'node:path';

import { existsSync, emptyDirSync } from 'fs-extra';
import { createKeyValueStorageImplementation } from 'packages/memory-storage/src/fs/key-value-store';

describe('KeyValueStore should append extension only when needed', () => {
const mockImageBuffer = Buffer.from('This is a test image', 'utf8');

afterAll(() => emptyDirSync('tmp'));

test('should append extension when needed', async () => {
const testDir = resolve('tmp', 'test_no_extension');
const storage = createKeyValueStorageImplementation({
persistStorage: true,
storeDirectory: testDir,
writeMetadata: true,
});
await storage.update({ key: 'jibberish', value: mockImageBuffer, contentType: 'image/jpeg', extension: 'jpeg' });

expect(existsSync(resolve(testDir, 'jibberish.jpeg'))).toBeTruthy();
expect(existsSync(resolve(testDir, 'jibberish'))).toBeFalsy();
});

test('should not append extension when already available', async () => {
const testDir = resolve('tmp', 'test_extension');
const storage = createKeyValueStorageImplementation({
persistStorage: true,
storeDirectory: testDir,
writeMetadata: true,
});
await storage.update({ key: 'jibberish.jpg', value: mockImageBuffer, contentType: 'image/jpeg', extension: 'jpeg' });

expect(existsSync(resolve(testDir, 'jibberish.jpg'))).toBeTruthy();
expect(existsSync(resolve(testDir, 'jibberish.jpg.jpeg'))).toBeFalsy();
});
});

0 comments on commit e8b39c4

Please sign in to comment.