38920-vm/backend/src/routes/ai_song_requests.js
Flatlogic Bot 2c36af7989 11
2026-03-02 00:52:09 +00:00

152 lines
4.0 KiB
JavaScript

const express = require('express');
const passport = require('passport');
const Ai_song_requestsService = require('../services/ai_song_requests');
const Ai_song_requestsDBApi = require('../db/api/ai_song_requests');
const wrapAsync = require('../helpers').wrapAsync;
const axios = require('axios');
const router = express.Router();
const { parse } = require('json2csv');
const {
checkCrudPermissions,
} = require('../middlewares/check-permissions');
// Proxy route should be PUBLIC for browser <audio> tag to work
router.get('/proxy-audio', wrapAsync(async (req, res) => {
const url = req.query.url;
if (!url) {
return res.status(400).send('URL is required');
}
try {
const response = await axios({
method: 'get',
url: url,
responseType: 'stream',
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Referer': 'https://pixabay.com/'
}
});
res.setHeader('Content-Type', response.headers['content-type'] || 'audio/mpeg');
if (response.headers['content-length']) {
res.setHeader('Content-Length', response.headers['content-length']);
}
response.data.pipe(res);
} catch (error) {
console.error('Proxy error:', error.message);
res.status(500).send('Failed to proxy audio');
}
}));
// Apply authentication to ALL other routes
router.use(passport.authenticate('jwt', { session: false }));
router.use(checkCrudPermissions('ai_song_requests'));
router.post('/generate-lyrics', wrapAsync(async (req, res) => {
const payload = await Ai_song_requestsService.generateLyrics(req.body.data, req.currentUser);
res.status(200).send(payload);
}));
router.post('/', wrapAsync(async (req, res) => {
const result = await Ai_song_requestsService.create(req.body.data, req.currentUser);
res.status(200).send(result);
}));
router.post('/bulk-import', wrapAsync(async (req, res) => {
await Ai_song_requestsService.bulkImport(req, res);
const payload = true;
res.status(200).send(payload);
}));
router.put('/:id', wrapAsync(async (req, res) => {
await Ai_song_requestsService.update(req.body.data, req.body.id, req.currentUser);
const payload = true;
res.status(200).send(payload);
}));
router.delete('/:id', wrapAsync(async (req, res) => {
await Ai_song_requestsService.remove(req.params.id, req.currentUser);
const payload = true;
res.status(200).send(payload);
}));
router.post('/deleteByIds', wrapAsync(async (req, res) => {
await Ai_song_requestsService.deleteByIds(req.body.data, req.currentUser);
const payload = true;
res.status(200).send(payload);
}));
router.get('/', wrapAsync(async (req, res) => {
const filetype = req.query.filetype
const currentUser = req.currentUser;
const payload = await Ai_song_requestsDBApi.findAll(
req.query, { currentUser }
);
if (filetype && filetype === 'csv') {
const fields = ['id','title','prompt_text','key_signature',
'target_bpm',
'requested_at','completed_at',
];
const opts = { fields };
try {
const csv = parse(payload.rows, opts);
res.status(200).attachment(csv);
res.send(csv)
} catch (err) {
console.error(err);
}
} else {
res.status(200).send(payload);
}
}));
router.get('/count', wrapAsync(async (req, res) => {
const currentUser = req.currentUser;
const payload = await Ai_song_requestsDBApi.findAll(
req.query,
null,
{ countOnly: true, currentUser }
);
res.status(200).send(payload);
}));
router.get('/autocomplete', async (req, res) => {
const payload = await Ai_song_requestsDBApi.findAllAutocomplete(
req.query.query,
req.query.limit,
req.query.offset,
);
res.status(200).send(payload);
});
router.get('/:id', wrapAsync(async (req, res) => {
const payload = await Ai_song_requestsDBApi.findBy(
{ id: req.params.id },
);
res.status(200).send(payload);
}));
router.use('/', require('../helpers').commonErrorHandler);
module.exports = router;