feat(attachments): depolama soyutlaması, içerikten tür tespiti, sharp/HEIC dönüşümü ve yetkili dosya servisi

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-05 07:55:04 +03:00
parent 99fc9dfea6
commit 2e1f4d7929
21 changed files with 1246 additions and 16 deletions
+35
View File
@@ -0,0 +1,35 @@
import { mkdtemp, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import path from "node:path";
import { afterAll, describe, expect, it } from "vitest";
import { createLocalDriver } from "./local";
import { isValidStorageKey } from "./types";
const dirs: string[] = [];
afterAll(() => Promise.all(dirs.map((d) => rm(d, { recursive: true, force: true }))));
describe("yerel depolama", () => {
it("anahtar biçimi: yol geçişi ve beklenmeyen uzantılar reddedilir", () => {
expect(isValidStorageKey("ab/0123456789abcdef0123.webp")).toBe(true);
expect(isValidStorageKey("ab/0123456789abcdef0123.thumb.webp")).toBe(true);
expect(isValidStorageKey("ab/0123456789abcdef0123.pdf")).toBe(true);
expect(isValidStorageKey("../0123456789abcdef0123.webp")).toBe(false);
expect(isValidStorageKey("ab/../../etc/passwd")).toBe(false);
expect(isValidStorageKey("/ab/0123456789abcdef0123.webp")).toBe(false);
expect(isValidStorageKey("ab/0123456789abcdef0123.html")).toBe(false);
});
it("put/get/delete", async () => {
const dir = await mkdtemp(path.join(tmpdir(), "butcem-storage-"));
dirs.push(dir);
const s = createLocalDriver(dir);
const key = "cd/cdef0123456789abcdef.pdf";
expect(await s.get(key)).toBeNull();
await s.put(key, new TextEncoder().encode("merhaba"));
expect((await s.get(key))!.toString()).toBe("merhaba");
await s.delete(key);
await s.delete(key);
expect(await s.get(key)).toBeNull();
await expect(s.put("../x.pdf", new Uint8Array())).rejects.toThrow();
});
});