diff --git a/server.js b/server.js index 9c9fa3e..b504f1e 100644 --- a/server.js +++ b/server.js @@ -11,6 +11,7 @@ const fs = require("fs"); const https = require("https"); const http = require("http"); const archiver = require("archiver"); +const { placeAsset } = require("./lib/ampp-folder-placer"); require("events").defaultMaxListeners = 50; @@ -808,6 +809,29 @@ app.get("/api/ampp/jobs/:jobId", requireAuth, async (req, res) => { } catch (err) { res.status(500).json({ success: false, error: err.message }); } }); +// ---- AMPP Folder Placement ---- +// POST /api/ampp/place — place an already-ingested AMPP asset into virtual folders. +// Body: { assetId: "...", assetName: "NEWS--PKG--clip.mxf" } +// assetName uses the "--" delimiter convention — same as folder-organizer-v3.5.py. +// Finds or creates the nested AMPP folder hierarchy, then links the asset to the +// deepest folder. All v3.5 defensive guards are ported to Node.js (see ampp-folder-placer.js). +app.post("/api/ampp/place", requireAuth, async (req, res) => { + const { assetId, assetName } = req.body; + if (!assetId || !assetName) + return res.status(400).json({ success: false, error: "assetId and assetName are required" }); + if (!getAmppApiKey()) + return res.status(503).json({ success: false, error: "AMPP API key not configured" }); + try { + const token = await getAmppToken(); + const result = await placeAsset(getAmppBase(), assetName, assetId, token); + console.log(`[AMPP place] ${assetName} (${assetId}) → ${JSON.stringify(result)}`); + res.json({ success: true, ...result }); + } catch (err) { + console.error("[AMPP place] Error:", err.message); + res.status(500).json({ success: false, error: err.message }); + } +}); + // ==================== CHROME EXTENSION DOWNLOAD ==================== // ==================== SHARE LINKS ==================== app.get("/api/sharelinks", requireAdmin, (req, res) => {