You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.0 KiB
150 lines
4.0 KiB
4 years ago
|
import { Router } from 'express';
|
||
|
import RadarrAPI from '../../api/radarr';
|
||
|
import { getSettings, RadarrSettings } from '../../lib/settings';
|
||
|
import logger from '../../logger';
|
||
|
|
||
|
const radarrRoutes = Router();
|
||
|
|
||
|
radarrRoutes.get('/', (_req, res) => {
|
||
|
const settings = getSettings();
|
||
|
|
||
|
res.status(200).json(settings.radarr);
|
||
|
});
|
||
|
|
||
|
radarrRoutes.post('/', (req, res) => {
|
||
|
const settings = getSettings();
|
||
|
|
||
|
const newRadarr = req.body as RadarrSettings;
|
||
|
const lastItem = settings.radarr[settings.radarr.length - 1];
|
||
|
newRadarr.id = lastItem ? lastItem.id + 1 : 0;
|
||
|
|
||
|
// If we are setting this as the default, clear any previous defaults for the same type first
|
||
|
// ex: if is4k is true, it will only remove defaults for other servers that have is4k set to true
|
||
|
// and are the default
|
||
|
if (req.body.isDefault) {
|
||
|
settings.radarr
|
||
|
.filter((radarrInstance) => radarrInstance.is4k === req.body.is4k)
|
||
|
.forEach((radarrInstance) => {
|
||
|
radarrInstance.isDefault = false;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
settings.radarr = [...settings.radarr, newRadarr];
|
||
|
settings.save();
|
||
|
|
||
|
return res.status(201).json(newRadarr);
|
||
|
});
|
||
|
|
||
|
radarrRoutes.post('/test', async (req, res, next) => {
|
||
|
try {
|
||
|
const radarr = new RadarrAPI({
|
||
|
apiKey: req.body.apiKey,
|
||
|
url: `${req.body.useSsl ? 'https' : 'http'}://${req.body.hostname}:${
|
||
|
req.body.port
|
||
|
}${req.body.baseUrl ?? ''}/api`,
|
||
|
});
|
||
|
|
||
|
const profiles = await radarr.getProfiles();
|
||
|
const folders = await radarr.getRootFolders();
|
||
|
|
||
|
return res.status(200).json({
|
||
|
profiles,
|
||
|
rootFolders: folders.map((folder) => ({
|
||
|
id: folder.id,
|
||
|
path: folder.path,
|
||
|
})),
|
||
|
});
|
||
|
} catch (e) {
|
||
|
logger.error('Failed to test Radarr', {
|
||
|
label: 'Radarr',
|
||
|
message: e.message,
|
||
|
});
|
||
|
|
||
|
next({ status: 500, message: 'Failed to connect to Radarr' });
|
||
|
}
|
||
|
});
|
||
|
|
||
|
radarrRoutes.put<{ id: string }>('/:id', (req, res) => {
|
||
|
const settings = getSettings();
|
||
|
|
||
|
const radarrIndex = settings.radarr.findIndex(
|
||
|
(r) => r.id === Number(req.params.id)
|
||
|
);
|
||
|
|
||
|
if (radarrIndex === -1) {
|
||
|
return res
|
||
|
.status(404)
|
||
|
.json({ status: '404', message: 'Settings instance not found' });
|
||
|
}
|
||
|
|
||
|
// If we are setting this as the default, clear any previous defaults for the same type first
|
||
|
// ex: if is4k is true, it will only remove defaults for other servers that have is4k set to true
|
||
|
// and are the default
|
||
|
if (req.body.isDefault) {
|
||
|
settings.radarr
|
||
|
.filter((radarrInstance) => radarrInstance.is4k === req.body.is4k)
|
||
|
.forEach((radarrInstance) => {
|
||
|
radarrInstance.isDefault = false;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
settings.radarr[radarrIndex] = {
|
||
|
...req.body,
|
||
|
id: Number(req.params.id),
|
||
|
} as RadarrSettings;
|
||
|
settings.save();
|
||
|
|
||
|
return res.status(200).json(settings.radarr[radarrIndex]);
|
||
|
});
|
||
|
|
||
|
radarrRoutes.get<{ id: string }>('/:id/profiles', async (req, res) => {
|
||
|
const settings = getSettings();
|
||
|
|
||
|
const radarrSettings = settings.radarr.find(
|
||
|
(r) => r.id === Number(req.params.id)
|
||
|
);
|
||
|
|
||
|
if (!radarrSettings) {
|
||
|
return res
|
||
|
.status(404)
|
||
|
.json({ status: '404', message: 'Settings instance not found' });
|
||
|
}
|
||
|
|
||
|
const radarr = new RadarrAPI({
|
||
|
apiKey: radarrSettings.apiKey,
|
||
|
url: `${radarrSettings.useSsl ? 'https' : 'http'}://${
|
||
|
radarrSettings.hostname
|
||
|
}:${radarrSettings.port}${radarrSettings.baseUrl ?? ''}/api`,
|
||
|
});
|
||
|
|
||
|
const profiles = await radarr.getProfiles();
|
||
|
|
||
|
return res.status(200).json(
|
||
|
profiles.map((profile) => ({
|
||
|
id: profile.id,
|
||
|
name: profile.name,
|
||
|
}))
|
||
|
);
|
||
|
});
|
||
|
|
||
|
radarrRoutes.delete<{ id: string }>('/:id', (req, res) => {
|
||
|
const settings = getSettings();
|
||
|
|
||
|
const radarrIndex = settings.radarr.findIndex(
|
||
|
(r) => r.id === Number(req.params.id)
|
||
|
);
|
||
|
|
||
|
if (radarrIndex === -1) {
|
||
|
return res
|
||
|
.status(404)
|
||
|
.json({ status: '404', message: 'Settings instance not found' });
|
||
|
}
|
||
|
|
||
|
const removed = settings.radarr.splice(radarrIndex, 1);
|
||
|
settings.save();
|
||
|
|
||
|
return res.status(200).json(removed[0]);
|
||
|
});
|
||
|
|
||
|
export default radarrRoutes;
|