feat: AMPP folder sync integration — pre-create folder hierarchy on upload, expose lookup endpoint for Script Task: settings.js
This commit is contained in:
parent
36a462dac4
commit
56e2a97506
1 changed files with 87 additions and 0 deletions
87
services/mam-api/src/routes/settings.js
Normal file
87
services/mam-api/src/routes/settings.js
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
import express from 'express';
|
||||||
|
import pool from '../db/pool.js';
|
||||||
|
import { requireAuth } from '../middleware/auth.js';
|
||||||
|
import { getAmppConfig } from '../ampp/client.js';
|
||||||
|
|
||||||
|
const router = express.Router();
|
||||||
|
router.use(requireAuth);
|
||||||
|
|
||||||
|
// GET /api/v1/settings/ampp — Return current AMPP config (token value masked)
|
||||||
|
router.get('/ampp', async (req, res, next) => {
|
||||||
|
try {
|
||||||
|
const result = await pool.query(
|
||||||
|
"SELECT key, value FROM settings WHERE key IN ('ampp_base_url', 'ampp_token')"
|
||||||
|
);
|
||||||
|
const out = {};
|
||||||
|
for (const row of result.rows) {
|
||||||
|
if (row.key === 'ampp_token') {
|
||||||
|
out.ampp_token_exists = true; // Never return the raw token
|
||||||
|
} else {
|
||||||
|
out[row.key] = row.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res.json(out);
|
||||||
|
} catch (err) {
|
||||||
|
next(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// PUT /api/v1/settings/ampp — Save AMPP credentials
|
||||||
|
router.put('/ampp', async (req, res, next) => {
|
||||||
|
try {
|
||||||
|
const { ampp_base_url, ampp_token } = req.body;
|
||||||
|
if (!ampp_base_url) {
|
||||||
|
return res.status(400).json({ error: 'ampp_base_url is required' });
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseUrl = ampp_base_url.trim().replace(/\/$/, '');
|
||||||
|
|
||||||
|
await pool.query(
|
||||||
|
`INSERT INTO settings (key, value, updated_at)
|
||||||
|
VALUES ('ampp_base_url', $1, NOW())
|
||||||
|
ON CONFLICT (key) DO UPDATE SET value = $1, updated_at = NOW()`,
|
||||||
|
[baseUrl]
|
||||||
|
);
|
||||||
|
|
||||||
|
if (ampp_token) {
|
||||||
|
await pool.query(
|
||||||
|
`INSERT INTO settings (key, value, updated_at)
|
||||||
|
VALUES ('ampp_token', $1, NOW())
|
||||||
|
ON CONFLICT (key) DO UPDATE SET value = $1, updated_at = NOW()`,
|
||||||
|
[ampp_token.trim()]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({ message: 'AMPP settings saved' });
|
||||||
|
} catch (err) {
|
||||||
|
next(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// POST /api/v1/settings/ampp/test — Verify AMPP connectivity
|
||||||
|
router.post('/ampp/test', async (req, res, next) => {
|
||||||
|
try {
|
||||||
|
const config = await getAmppConfig();
|
||||||
|
if (!config) {
|
||||||
|
return res.status(400).json({ error: 'AMPP credentials not configured' });
|
||||||
|
}
|
||||||
|
|
||||||
|
const testUrl = `${config.ampp_base_url}/api/v1/store/folder/folders?limit=1`;
|
||||||
|
const testRes = await fetch(testUrl, {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${config.ampp_token}`,
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!testRes.ok) {
|
||||||
|
return res.status(400).json({ error: `AMPP returned HTTP ${testRes.status}` });
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({ message: 'AMPP connection successful' });
|
||||||
|
} catch (err) {
|
||||||
|
res.status(400).json({ error: `Connection failed: ${err.message}` });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default router;
|
||||||
Loading…
Reference in a new issue