Initial
This commit is contained in:
115
server/controllers/assetController.js
Normal file
115
server/controllers/assetController.js
Normal file
@@ -0,0 +1,115 @@
|
||||
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();
|
||||
}
|
||||
Reference in New Issue
Block a user