Files
poshmanager/server/controllers/assetController.js
2026-06-25 12:05:53 -05:00

116 lines
4.0 KiB
JavaScript

import {
assetFolderSchema,
assetLinkSchema,
assetUpdateSchema,
assetUploadSchema
} from '../forms/schemas.js';
import fs from 'node:fs';
import {
createAssetFolder,
createAssetFromUpload,
createAssetLink,
deleteAsset,
deleteAssetFolder,
deleteAssetLink,
getAsset,
getAssetFile,
listAssetFolders,
listAssetLinks,
listAssets,
updateAsset,
updateAssetFolder
} from '../models/assetModel.js';
export function assetFolders(req, res) {
res.json(listAssetFolders(req.user.id));
}
export function createAssetFolderAction(req, res) {
const parsed = assetFolderSchema.safeParse(req.body);
if (!parsed.success) return res.status(400).json({ error: 'Invalid asset folder payload' });
res.status(201).json(createAssetFolder(parsed.data, req.user.id));
}
export function updateAssetFolderAction(req, res) {
const parsed = assetFolderSchema.partial().safeParse(req.body);
if (!parsed.success) return res.status(400).json({ error: 'Invalid asset folder payload' });
const folder = updateAssetFolder(req.params.id, parsed.data, req.user.id);
if (!folder) return res.status(404).json({ error: 'Asset folder not found' });
res.json(folder);
}
export function deleteAssetFolderAction(req, res) {
deleteAssetFolder(req.params.id, req.user.id);
res.status(204).end();
}
export function assets(req, res) {
res.json(listAssets(req.user.id));
}
export function createAssetAction(req, res) {
const parsed = assetUploadSchema.safeParse(req.body);
if (!parsed.success) {
if (req.file?.path) fs.rmSync(req.file.path, { force: true });
return res.status(400).json({ error: 'Invalid asset upload payload' });
}
try {
res.status(201).json(createAssetFromUpload(req.file, parsed.data, req.user.id));
} catch (error) {
if (req.file?.path) fs.rmSync(req.file.path, { force: true });
res.status(400).json({ error: error.message || 'Asset upload failed' });
}
}
export function getAssetAction(req, res) {
const asset = getAsset(req.params.id, req.user.id);
if (!asset) return res.status(404).json({ error: 'Asset not found' });
res.json(asset);
}
export function updateAssetAction(req, res) {
const parsed = assetUpdateSchema.safeParse(req.body);
if (!parsed.success) return res.status(400).json({ error: 'Invalid asset payload' });
const asset = updateAsset(req.params.id, parsed.data, req.user.id);
if (!asset) return res.status(404).json({ error: 'Asset not found' });
res.json(asset);
}
export function deleteAssetAction(req, res) {
if (!deleteAsset(req.params.id, req.user.id)) return res.status(404).json({ error: 'Asset not found' });
res.status(204).end();
}
export function viewAssetAction(req, res) {
const result = getAssetFile(req.params.id, req.user.id);
if (!result) return res.status(404).json({ error: 'Asset not found' });
res.type(result.asset.mimeType || 'application/octet-stream');
res.setHeader('Content-Disposition', `inline; filename="${encodeURIComponent(result.asset.originalName)}"`);
res.sendFile(result.filePath);
}
export function downloadAssetAction(req, res) {
const result = getAssetFile(req.params.id, req.user.id);
if (!result) return res.status(404).json({ error: 'Asset not found' });
res.download(result.filePath, result.asset.originalName);
}
export function assetLinks(req, res) {
const links = listAssetLinks(req.params.id, req.user.id);
if (!links) return res.status(404).json({ error: 'Asset not found' });
res.json(links);
}
export function createAssetLinkAction(req, res) {
const parsed = assetLinkSchema.safeParse(req.body);
if (!parsed.success) return res.status(400).json({ error: 'Invalid asset link payload' });
const link = createAssetLink(req.params.id, parsed.data, req.user.id);
if (!link) return res.status(404).json({ error: 'Asset not found' });
res.status(201).json(link);
}
export function deleteAssetLinkAction(req, res) {
if (!deleteAssetLink(req.params.linkId, req.user.id)) return res.status(404).json({ error: 'Asset link not found' });
res.status(204).end();
}