152 lines
4.0 KiB
JavaScript
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;
|