- Update db/index.ts to read data directory from env var - Update storage.ts to read data directory from env var - Both default to ./data for local development
63 lines
1.6 KiB
TypeScript
63 lines
1.6 KiB
TypeScript
import { mkdir, writeFile, unlink } from 'node:fs/promises';
|
|
import { join } from 'node:path';
|
|
|
|
const DATA_DIR = process.env.TASKPLANER_DATA_DIR || './data';
|
|
export const UPLOAD_DIR = join(DATA_DIR, 'uploads');
|
|
export const ORIGINALS_DIR = join(DATA_DIR, 'uploads/originals');
|
|
export const THUMBNAILS_DIR = join(DATA_DIR, 'uploads/thumbnails');
|
|
|
|
/**
|
|
* Ensure upload directories exist
|
|
*/
|
|
export async function ensureDirectories(): Promise<void> {
|
|
await mkdir(ORIGINALS_DIR, { recursive: true });
|
|
await mkdir(THUMBNAILS_DIR, { recursive: true });
|
|
}
|
|
|
|
/**
|
|
* Save original image to filesystem
|
|
*/
|
|
export async function saveOriginal(id: string, ext: string, buffer: Buffer): Promise<void> {
|
|
const path = getOriginalPath(id, ext);
|
|
await writeFile(path, buffer);
|
|
}
|
|
|
|
/**
|
|
* Save thumbnail to filesystem (always jpg)
|
|
*/
|
|
export async function saveThumbnail(id: string, buffer: Buffer): Promise<void> {
|
|
const path = getThumbnailPath(id);
|
|
await writeFile(path, buffer);
|
|
}
|
|
|
|
/**
|
|
* Get path to original image
|
|
*/
|
|
export function getOriginalPath(id: string, ext: string): string {
|
|
return join(ORIGINALS_DIR, `${id}.${ext}`);
|
|
}
|
|
|
|
/**
|
|
* Get path to thumbnail (always jpg)
|
|
*/
|
|
export function getThumbnailPath(id: string): string {
|
|
return join(THUMBNAILS_DIR, `${id}.jpg`);
|
|
}
|
|
|
|
/**
|
|
* Delete both original and thumbnail files
|
|
* Does not throw if files don't exist
|
|
*/
|
|
export async function deleteImage(id: string, ext: string): Promise<void> {
|
|
try {
|
|
await unlink(getOriginalPath(id, ext));
|
|
} catch {
|
|
// File may not exist, ignore
|
|
}
|
|
try {
|
|
await unlink(getThumbnailPath(id));
|
|
} catch {
|
|
// File may not exist, ignore
|
|
}
|
|
}
|