import fs from "node:fs/promises"; import path from "node:path"; import { isJpeg } from "./magic"; export class StorageError extends Error { constructor(message: string) { super(message); this.name = "StorageError"; } } export function pageFileName(n: number): string { return `page-${String(n).padStart(3, "0")}.jpg`; } export function catalogDir(storageDir: string, id: string): string { return path.join(storageDir, "catalogs", id); } export async function saveCatalogPages( storageDir: string, id: string, pages: Buffer[], ): Promise { const dir = catalogDir(storageDir, id); await fs.mkdir(dir, { recursive: true }); let i = 1; for (const page of pages) { if (!isJpeg(page)) { await fs.rm(dir, { recursive: true, force: true }); throw new StorageError("نوع فایل پشتیبانی نمی‌شود"); } await fs.writeFile(path.join(dir, pageFileName(i)), page); i += 1; } } export async function saveQr( storageDir: string, id: string, png: Buffer, ): Promise { const dir = catalogDir(storageDir, id); await fs.mkdir(dir, { recursive: true }); await fs.writeFile(path.join(dir, "qr.png"), png); } export async function readPage( storageDir: string, id: string, n: number, ): Promise { const file = path.join(catalogDir(storageDir, id), pageFileName(n)); try { return await fs.readFile(file); } catch { throw new StorageError("کاتالوگ پیدا نشد"); } } export async function readQr(storageDir: string, id: string): Promise { const file = path.join(catalogDir(storageDir, id), "qr.png"); try { return await fs.readFile(file); } catch { throw new StorageError("کاتالوگ پیدا نشد"); } } export async function deleteCatalogFiles( storageDir: string, id: string, ): Promise { await fs.rm(catalogDir(storageDir, id), { recursive: true, force: true }); }