diff --git a/src/components/modules/calendar/CalendarModule.tsx b/src/components/modules/calendar/CalendarModule.tsx index 02398eaa0..49d0f20ce 100644 --- a/src/components/modules/calendar/CalendarModule.tsx +++ b/src/components/modules/calendar/CalendarModule.tsx @@ -1,9 +1,9 @@ /* eslint-disable react/no-children-prop */ -import { Box, Divider, Indicator, Popover, ScrollArea, useMantineTheme } from '@mantine/core'; +import { Box, Divider, Indicator, Popover, ScrollArea } from '@mantine/core'; import React, { useEffect, useState } from 'react'; import { Calendar } from '@mantine/dates'; -import { showNotification } from '@mantine/notifications'; -import { IconCalendar as CalendarIcon, IconCheck as Check } from '@tabler/icons'; +import { IconCalendar as CalendarIcon } from '@tabler/icons'; +import axios from 'axios'; import { useConfig } from '../../../tools/state'; import { IModule } from '../modules'; import { @@ -12,6 +12,7 @@ import { LidarrMediaDisplay, ReadarrMediaDisplay, } from './MediaDisplay'; +import { serviceItem } from '../../../tools/types'; export const CalendarModule: IModule = { title: 'Calendar', @@ -27,105 +28,32 @@ export default function CalendarComponent(props: any) { const [lidarrMedias, setLidarrMedias] = useState([] as any); const [radarrMedias, setRadarrMedias] = useState([] as any); const [readarrMedias, setReadarrMedias] = useState([] as any); + const sonarrService = config.services.filter((service) => service.type === 'Sonarr').at(0); + const radarrService = config.services.filter((service) => service.type === 'Radarr').at(0); + const lidarrService = config.services.filter((service) => service.type === 'Lidarr').at(0); + const readarrService = config.services.filter((service) => service.type === 'Readarr').at(0); + + function getMedias(service: serviceItem | undefined, type: string) { + if (!service || !service.apiKey) { + return Promise.resolve({ data: [] }); + } + return axios.get(`/api/modules/calendar?type=${type}`, { + data: { + body: service, + }, + }); + } useEffect(() => { // Filter only sonarr and radarr services - const filtered = config.services.filter( - (service) => - service.type === 'Sonarr' || - service.type === 'Radarr' || - service.type === 'Lidarr' || - service.type === 'Readarr' - ); // Get the url and apiKey for all Sonarr and Radarr services - const sonarrService = filtered.filter((service) => service.type === 'Sonarr').at(0); - const radarrService = filtered.filter((service) => service.type === 'Radarr').at(0); - const lidarrService = filtered.filter((service) => service.type === 'Lidarr').at(0); - const readarrService = filtered.filter((service) => service.type === 'Readarr').at(0); - const nextMonth = new Date(new Date().setMonth(new Date().getMonth() + 2)).toISOString(); - const lastMonth = new Date(new Date().setMonth(new Date().getMonth() - 2)).toISOString(); - if (sonarrService && sonarrService.apiKey) { - const baseUrl = new URL(sonarrService.url).origin; - fetch( - `${baseUrl}/api/calendar?apikey=${sonarrService?.apiKey}&end=${nextMonth}&start=${lastMonth}` - ).then((response) => { - response.ok && - response.json().then((data) => { - setSonarrMedias(data); - showNotification({ - title: 'Sonarr', - icon: , - color: 'green', - autoClose: 1500, - radius: 'md', - message: `Loaded ${data.length} releases`, - }); - }); - }); - } - if (radarrService && radarrService.apiKey) { - const baseUrl = new URL(radarrService.url).origin; - fetch( - `${baseUrl}/api/v3/calendar?apikey=${radarrService?.apiKey}&end=${nextMonth}&start=${lastMonth}` - ).then((response) => { - response.ok && - response.json().then((data) => { - setRadarrMedias(data); - showNotification({ - title: 'Radarr', - icon: , - color: 'green', - autoClose: 1500, - radius: 'md', - message: `Loaded ${data.length} releases`, - }); - }); - }); - } - if (lidarrService && lidarrService.apiKey) { - const baseUrl = new URL(lidarrService.url).origin; - fetch( - `${baseUrl}/api/v1/calendar?apikey=${lidarrService?.apiKey}&end=${nextMonth}&start=${lastMonth}` - ).then((response) => { - response.ok && - response.json().then((data) => { - setLidarrMedias(data); - showNotification({ - title: 'Lidarr', - icon: , - color: 'green', - autoClose: 1500, - radius: 'md', - message: `Loaded ${data.length} releases`, - }); - }); - }); - } - if (readarrService && readarrService.apiKey) { - const baseUrl = new URL(readarrService.url).origin; - fetch( - `${baseUrl}/api/v1/calendar?apikey=${readarrService?.apiKey}&end=${nextMonth}&start=${lastMonth}` - ).then((response) => { - response.ok && - response.json().then((data) => { - setReadarrMedias(data); - showNotification({ - title: 'Readarr', - icon: , - color: 'green', - autoClose: 1500, - radius: 'md', - message: `Loaded ${data.length} releases`, - }); - }); - }); - } + getMedias(sonarrService, 'sonarr').then((res) => setSonarrMedias(res.data)); + getMedias(radarrService, 'radarr').then((res) => setRadarrMedias(res.data)); + getMedias(lidarrService, 'lidarr').then((res) => setLidarrMedias(res.data)); + getMedias(readarrService, 'readarr').then((res) => setReadarrMedias(res.data)); }, [config.services]); - if (sonarrMedias === undefined && radarrMedias === undefined) { - return ; - } return ( {}} @@ -152,7 +80,6 @@ function DayComponent(props: any) { }: { renderdate: Date; sonarrmedias: []; radarrmedias: []; lidarrmedias: []; readarrmedias: [] } = props; const [opened, setOpened] = useState(false); - const theme = useMantineTheme(); const day = renderdate.getDate(); diff --git a/src/pages/api/modules/calendar.ts b/src/pages/api/modules/calendar.ts new file mode 100644 index 000000000..768cbb90c --- /dev/null +++ b/src/pages/api/modules/calendar.ts @@ -0,0 +1,66 @@ +import axios from 'axios'; +import { NextApiRequest, NextApiResponse } from 'next'; +import { serviceItem } from '../../../tools/types'; + +async function Get(req: NextApiRequest, res: NextApiResponse) { + // Parse req.body as a ServiceItem + const nextMonth = new Date(new Date().setMonth(new Date().getMonth() + 2)).toISOString(); + const lastMonth = new Date(new Date().setMonth(new Date().getMonth() - 2)).toISOString(); + const TypeToUrl: { service: string; url: string }[] = [ + { + service: 'sonarr', + url: '/api/calendar', + }, + { + service: 'radarr', + url: '/api/v3/calendar', + }, + { + service: 'lidarr', + url: '/api/v1/calendar', + }, + { + service: 'readarr', + url: '/api/v1/calendar', + }, + ]; + const service: serviceItem = req.body; + const { type } = req.query; + if (!type) { + return res.status(400).json({ + message: 'Missing required parameter in url: type', + }); + } + if (!service) { + return res.status(400).json({ + message: 'Missing required parameter in body: service', + }); + } + // Match the type to the correct url + const url = TypeToUrl.find((x) => x.service === type); + if (!url) { + return res.status(400).json({ + message: 'Invalid type', + }); + } + // Get the origin URL + const { origin } = new URL(service.url); + const data = await axios.get( + `${origin}${url?.url}?apiKey=${service.apiKey}&end=${nextMonth}&start=${lastMonth}` + ); + return res.status(200).json(data.data); + // // Make a request to the URL + // const response = await axios.get(url); + // // Return the response +} + +export default async (req: NextApiRequest, res: NextApiResponse) => { + // Filter out if the reuqest is a POST or a GET + if (req.method === 'GET') { + return Get(req, res); + } + return res.status(405).json({ + statusCode: 405, + message: 'Method not allowed', + }); +};