Files
taskplaner/src/lib/server/images/storage.ts
Thomas Richter 457bacaeab feat(06-01): configure data paths via TASKPLANER_DATA_DIR env var
- 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
2026-02-01 13:20:49 +01:00

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
}
}