Files

76 lines
1.9 KiB
TypeScript

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<void> {
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<void> {
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<Buffer> {
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<Buffer> {
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<void> {
await fs.rm(catalogDir(storageDir, id), { recursive: true, force: true });
}