116 lines
4.0 KiB
JavaScript
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();
|
|
}
|