refactor: make PALDRA match PDCA style exactly - remove redundant instanceConfig parameter and convert to pure singleton
Build and Push Docker Image / build (push) Successful in 20s
CI / Security audit (push) Successful in 1m18s
CI / Tests & coverage (push) Successful in 1m14s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 54s

- Remove instanceConfig parameter from all retriever methods (getTags, getQueue, getHistory)
- Retriever instances now use this.url, this.apiKey, this.id instead of passed parameter
- Convert ArrRetrieverRegistry from class with convenience functions to pure singleton object
- Export singleton instance directly instead of class + convenience functions
- Update poller.js and historyFetcher.js to call methods on singleton directly
- All 261 tests pass with zero behavior changes
This commit is contained in:
2026-05-19 14:51:22 +01:00
parent 627329df2f
commit 6e199925aa
6 changed files with 66 additions and 95 deletions
+3 -6
View File
@@ -44,25 +44,22 @@ class ArrRetriever {
/** /**
* Get tags from this *arr instance * Get tags from this *arr instance
* @param {Object} instanceConfig - Configuration for the instance
* @returns {Promise<Array>} Array of tag objects * @returns {Promise<Array>} Array of tag objects
*/ */
async getTags(instanceConfig) { async getTags() {
throw new Error('getTags() must be implemented by subclass'); throw new Error('getTags() must be implemented by subclass');
} }
/** /**
* Get queue from this *arr instance * Get queue from this *arr instance
* @param {Object} instanceConfig - Configuration for the instance
* @returns {Promise<Object>} Queue object with records array * @returns {Promise<Object>} Queue object with records array
*/ */
async getQueue(instanceConfig) { async getQueue() {
throw new Error('getQueue() must be implemented by subclass'); throw new Error('getQueue() must be implemented by subclass');
} }
/** /**
* Get history from this *arr instance * Get history from this *arr instance
* @param {Object} instanceConfig - Configuration for the instance
* @param {Object} options - Optional parameters for history fetch * @param {Object} options - Optional parameters for history fetch
* @param {number} [options.pageSize] - Number of records to fetch * @param {number} [options.pageSize] - Number of records to fetch
* @param {string} [options.sortKey] - Field to sort by * @param {string} [options.sortKey] - Field to sort by
@@ -73,7 +70,7 @@ class ArrRetriever {
* @param {string} [options.startDate] - ISO date string for filtering * @param {string} [options.startDate] - ISO date string for filtering
* @returns {Promise<Object>} History object with records array * @returns {Promise<Object>} History object with records array
*/ */
async getHistory(instanceConfig, options = {}) { async getHistory(options = {}) {
throw new Error('getHistory() must be implemented by subclass'); throw new Error('getHistory() must be implemented by subclass');
} }
} }
+12 -15
View File
@@ -18,42 +18,39 @@ class PollingRadarrRetriever extends ArrRetriever {
/** /**
* Get tags from Radarr instance * Get tags from Radarr instance
* @param {Object} instanceConfig - Configuration for the instance
* @returns {Promise<Array>} Array of tag objects * @returns {Promise<Array>} Array of tag objects
*/ */
async getTags(instanceConfig) { async getTags() {
try { try {
const response = await axios.get(`${instanceConfig.url}/api/v3/tag`, { const response = await axios.get(`${this.url}/api/v3/tag`, {
headers: { 'X-Api-Key': instanceConfig.apiKey } headers: { 'X-Api-Key': this.apiKey }
}); });
return response.data; return response.data;
} catch (error) { } catch (error) {
logToFile(`[PollingRadarrRetriever] ${instanceConfig.id} tags error: ${error.message}`); logToFile(`[PollingRadarrRetriever] ${this.id} tags error: ${error.message}`);
return []; return [];
} }
} }
/** /**
* Get queue from Radarr instance * Get queue from Radarr instance
* @param {Object} instanceConfig - Configuration for the instance
* @returns {Promise<Object>} Queue object with records array * @returns {Promise<Object>} Queue object with records array
*/ */
async getQueue(instanceConfig) { async getQueue() {
try { try {
const response = await axios.get(`${instanceConfig.url}/api/v3/queue`, { const response = await axios.get(`${this.url}/api/v3/queue`, {
headers: { 'X-Api-Key': instanceConfig.apiKey }, headers: { 'X-Api-Key': this.apiKey },
params: { includeMovie: true } params: { includeMovie: true }
}); });
return response.data; return response.data;
} catch (error) { } catch (error) {
logToFile(`[PollingRadarrRetriever] ${instanceConfig.id} queue error: ${error.message}`); logToFile(`[PollingRadarrRetriever] ${this.id} queue error: ${error.message}`);
return { records: [] }; return { records: [] };
} }
} }
/** /**
* Get history from Radarr instance * Get history from Radarr instance
* @param {Object} instanceConfig - Configuration for the instance
* @param {Object} options - Optional parameters for history fetch * @param {Object} options - Optional parameters for history fetch
* @param {number} [options.pageSize=10] - Number of records to fetch * @param {number} [options.pageSize=10] - Number of records to fetch
* @param {string} [options.sortKey] - Field to sort by * @param {string} [options.sortKey] - Field to sort by
@@ -62,7 +59,7 @@ class PollingRadarrRetriever extends ArrRetriever {
* @param {string} [options.startDate] - ISO date string for filtering * @param {string} [options.startDate] - ISO date string for filtering
* @returns {Promise<Object>} History object with records array * @returns {Promise<Object>} History object with records array
*/ */
async getHistory(instanceConfig, options = {}) { async getHistory(options = {}) {
const { const {
pageSize = 10, pageSize = 10,
sortKey, sortKey,
@@ -81,13 +78,13 @@ class PollingRadarrRetriever extends ArrRetriever {
if (sortDir) params.sortDir = sortDir; if (sortDir) params.sortDir = sortDir;
if (startDate) params.startDate = startDate; if (startDate) params.startDate = startDate;
const response = await axios.get(`${instanceConfig.url}/api/v3/history`, { const response = await axios.get(`${this.url}/api/v3/history`, {
headers: { 'X-Api-Key': instanceConfig.apiKey }, headers: { 'X-Api-Key': this.apiKey },
params params
}); });
return response.data; return response.data;
} catch (error) { } catch (error) {
logToFile(`[PollingRadarrRetriever] ${instanceConfig.id} history error: ${error.message}`); logToFile(`[PollingRadarrRetriever] ${this.id} history error: ${error.message}`);
return { records: [] }; return { records: [] };
} }
} }
+12 -15
View File
@@ -18,42 +18,39 @@ class PollingSonarrRetriever extends ArrRetriever {
/** /**
* Get tags from Sonarr instance * Get tags from Sonarr instance
* @param {Object} instanceConfig - Configuration for the instance
* @returns {Promise<Array>} Array of tag objects * @returns {Promise<Array>} Array of tag objects
*/ */
async getTags(instanceConfig) { async getTags() {
try { try {
const response = await axios.get(`${instanceConfig.url}/api/v3/tag`, { const response = await axios.get(`${this.url}/api/v3/tag`, {
headers: { 'X-Api-Key': instanceConfig.apiKey } headers: { 'X-Api-Key': this.apiKey }
}); });
return response.data; return response.data;
} catch (error) { } catch (error) {
logToFile(`[PollingSonarrRetriever] ${instanceConfig.id} tags error: ${error.message}`); logToFile(`[PollingSonarrRetriever] ${this.id} tags error: ${error.message}`);
return []; return [];
} }
} }
/** /**
* Get queue from Sonarr instance * Get queue from Sonarr instance
* @param {Object} instanceConfig - Configuration for the instance
* @returns {Promise<Object>} Queue object with records array * @returns {Promise<Object>} Queue object with records array
*/ */
async getQueue(instanceConfig) { async getQueue() {
try { try {
const response = await axios.get(`${instanceConfig.url}/api/v3/queue`, { const response = await axios.get(`${this.url}/api/v3/queue`, {
headers: { 'X-Api-Key': instanceConfig.apiKey }, headers: { 'X-Api-Key': this.apiKey },
params: { includeSeries: true, includeEpisode: true } params: { includeSeries: true, includeEpisode: true }
}); });
return response.data; return response.data;
} catch (error) { } catch (error) {
logToFile(`[PollingSonarrRetriever] ${instanceConfig.id} queue error: ${error.message}`); logToFile(`[PollingSonarrRetriever] ${this.id} queue error: ${error.message}`);
return { records: [] }; return { records: [] };
} }
} }
/** /**
* Get history from Sonarr instance * Get history from Sonarr instance
* @param {Object} instanceConfig - Configuration for the instance
* @param {Object} options - Optional parameters for history fetch * @param {Object} options - Optional parameters for history fetch
* @param {number} [options.pageSize=10] - Number of records to fetch * @param {number} [options.pageSize=10] - Number of records to fetch
* @param {string} [options.sortKey] - Field to sort by * @param {string} [options.sortKey] - Field to sort by
@@ -63,7 +60,7 @@ class PollingSonarrRetriever extends ArrRetriever {
* @param {string} [options.startDate] - ISO date string for filtering * @param {string} [options.startDate] - ISO date string for filtering
* @returns {Promise<Object>} History object with records array * @returns {Promise<Object>} History object with records array
*/ */
async getHistory(instanceConfig, options = {}) { async getHistory(options = {}) {
const { const {
pageSize = 10, pageSize = 10,
sortKey, sortKey,
@@ -84,13 +81,13 @@ class PollingSonarrRetriever extends ArrRetriever {
if (sortDir) params.sortDir = sortDir; if (sortDir) params.sortDir = sortDir;
if (startDate) params.startDate = startDate; if (startDate) params.startDate = startDate;
const response = await axios.get(`${instanceConfig.url}/api/v3/history`, { const response = await axios.get(`${this.url}/api/v3/history`, {
headers: { 'X-Api-Key': instanceConfig.apiKey }, headers: { 'X-Api-Key': this.apiKey },
params params
}); });
return response.data; return response.data;
} catch (error) { } catch (error) {
logToFile(`[PollingSonarrRetriever] ${instanceConfig.id} history error: ${error.message}`); logToFile(`[PollingSonarrRetriever] ${this.id} history error: ${error.message}`);
return { records: [] }; return { records: [] };
} }
} }
+24 -44
View File
@@ -16,13 +16,11 @@ const retrieverClasses = {
}; };
/** /**
* Registry and factory for *arr data retrievers * Singleton registry for *arr data retrievers
*/ */
class ArrRetrieverRegistry { const arrRetrieverRegistry = {
constructor() { retrievers: new Map(),
this.retrievers = new Map(); initialized: false,
this.initialized = false;
}
/** /**
* Initialize all configured *arr retrievers * Initialize all configured *arr retrievers
@@ -62,7 +60,7 @@ class ArrRetrieverRegistry {
this.initialized = true; this.initialized = true;
logToFile(`[ArrRetrieverRegistry] Initialized ${this.retrievers.size} *arr retrievers`); logToFile(`[ArrRetrieverRegistry] Initialized ${this.retrievers.size} *arr retrievers`);
} },
/** /**
* Get all registered retrievers * Get all registered retrievers
@@ -70,7 +68,7 @@ class ArrRetrieverRegistry {
*/ */
getAllRetrievers() { getAllRetrievers() {
return Array.from(this.retrievers.values()); return Array.from(this.retrievers.values());
} },
/** /**
* Get retriever by instance ID * Get retriever by instance ID
@@ -79,7 +77,7 @@ class ArrRetrieverRegistry {
*/ */
getRetriever(instanceId) { getRetriever(instanceId) {
return this.retrievers.get(instanceId) || null; return this.retrievers.get(instanceId) || null;
} },
/** /**
* Get retrievers by type * Get retrievers by type
@@ -88,7 +86,7 @@ class ArrRetrieverRegistry {
*/ */
getRetrieversByType(type) { getRetrieversByType(type) {
return this.getAllRetrievers().filter(retriever => retriever.getRetrieverType() === type); return this.getAllRetrievers().filter(retriever => retriever.getRetrieverType() === type);
} },
/** /**
* Get tags from all retrievers * Get tags from all retrievers
@@ -104,7 +102,7 @@ class ArrRetrieverRegistry {
const results = await Promise.allSettled( const results = await Promise.allSettled(
retrievers.map(async (retriever) => { retrievers.map(async (retriever) => {
try { try {
const tags = await retriever.getTags(retriever); const tags = await retriever.getTags();
logToFile(`[ArrRetrieverRegistry] ${retriever.name}: ${tags.length} tags`); logToFile(`[ArrRetrieverRegistry] ${retriever.name}: ${tags.length} tags`);
return { instance: retriever.getInstanceId(), data: tags }; return { instance: retriever.getInstanceId(), data: tags };
} catch (error) { } catch (error) {
@@ -117,7 +115,7 @@ class ArrRetrieverRegistry {
return results return results
.filter(result => result.status === 'fulfilled') .filter(result => result.status === 'fulfilled')
.map(result => result.value); .map(result => result.value);
} },
/** /**
* Get queue from all retrievers * Get queue from all retrievers
@@ -133,7 +131,7 @@ class ArrRetrieverRegistry {
const results = await Promise.allSettled( const results = await Promise.allSettled(
retrievers.map(async (retriever) => { retrievers.map(async (retriever) => {
try { try {
const queue = await retriever.getQueue(retriever); const queue = await retriever.getQueue();
logToFile(`[ArrRetrieverRegistry] ${retriever.name}: ${(queue.records || []).length} queue items`); logToFile(`[ArrRetrieverRegistry] ${retriever.name}: ${(queue.records || []).length} queue items`);
return { instance: retriever.getInstanceId(), data: queue }; return { instance: retriever.getInstanceId(), data: queue };
} catch (error) { } catch (error) {
@@ -146,7 +144,7 @@ class ArrRetrieverRegistry {
return results return results
.filter(result => result.status === 'fulfilled') .filter(result => result.status === 'fulfilled')
.map(result => result.value); .map(result => result.value);
} },
/** /**
* Get history from all retrievers * Get history from all retrievers
@@ -163,7 +161,7 @@ class ArrRetrieverRegistry {
const results = await Promise.allSettled( const results = await Promise.allSettled(
retrievers.map(async (retriever) => { retrievers.map(async (retriever) => {
try { try {
const history = await retriever.getHistory(retriever, options); const history = await retriever.getHistory(options);
logToFile(`[ArrRetrieverRegistry] ${retriever.name}: ${(history.records || []).length} history records`); logToFile(`[ArrRetrieverRegistry] ${retriever.name}: ${(history.records || []).length} history records`);
return { instance: retriever.getInstanceId(), data: history }; return { instance: retriever.getInstanceId(), data: history };
} catch (error) { } catch (error) {
@@ -176,7 +174,7 @@ class ArrRetrieverRegistry {
return results return results
.filter(result => result.status === 'fulfilled') .filter(result => result.status === 'fulfilled')
.map(result => result.value); .map(result => result.value);
} },
/** /**
* Get tags grouped by retriever type * Get tags grouped by retriever type
@@ -189,7 +187,7 @@ class ArrRetrieverRegistry {
const sonarrTags = await Promise.allSettled( const sonarrTags = await Promise.allSettled(
sonarrRetrievers.map(async (retriever) => { sonarrRetrievers.map(async (retriever) => {
try { try {
const tags = await retriever.getTags(retriever); const tags = await retriever.getTags();
return { instance: retriever.getInstanceId(), data: tags }; return { instance: retriever.getInstanceId(), data: tags };
} catch (error) { } catch (error) {
logToFile(`[ArrRetrieverRegistry] Error fetching tags from ${retriever.name}: ${error.message}`); logToFile(`[ArrRetrieverRegistry] Error fetching tags from ${retriever.name}: ${error.message}`);
@@ -201,7 +199,7 @@ class ArrRetrieverRegistry {
const radarrTags = await Promise.allSettled( const radarrTags = await Promise.allSettled(
radarrRetrievers.map(async (retriever) => { radarrRetrievers.map(async (retriever) => {
try { try {
const tags = await retriever.getTags(retriever); const tags = await retriever.getTags();
return { instance: retriever.getInstanceId(), data: tags }; return { instance: retriever.getInstanceId(), data: tags };
} catch (error) { } catch (error) {
logToFile(`[ArrRetrieverRegistry] Error fetching tags from ${retriever.name}: ${error.message}`); logToFile(`[ArrRetrieverRegistry] Error fetching tags from ${retriever.name}: ${error.message}`);
@@ -218,7 +216,7 @@ class ArrRetrieverRegistry {
.filter(result => result.status === 'fulfilled') .filter(result => result.status === 'fulfilled')
.map(result => result.value) .map(result => result.value)
}; };
} },
/** /**
* Get queue grouped by retriever type * Get queue grouped by retriever type
@@ -231,7 +229,7 @@ class ArrRetrieverRegistry {
const sonarrQueues = await Promise.allSettled( const sonarrQueues = await Promise.allSettled(
sonarrRetrievers.map(async (retriever) => { sonarrRetrievers.map(async (retriever) => {
try { try {
const queue = await retriever.getQueue(retriever); const queue = await retriever.getQueue();
return { instance: retriever.getInstanceId(), data: queue }; return { instance: retriever.getInstanceId(), data: queue };
} catch (error) { } catch (error) {
logToFile(`[ArrRetrieverRegistry] Error fetching queue from ${retriever.name}: ${error.message}`); logToFile(`[ArrRetrieverRegistry] Error fetching queue from ${retriever.name}: ${error.message}`);
@@ -243,7 +241,7 @@ class ArrRetrieverRegistry {
const radarrQueues = await Promise.allSettled( const radarrQueues = await Promise.allSettled(
radarrRetrievers.map(async (retriever) => { radarrRetrievers.map(async (retriever) => {
try { try {
const queue = await retriever.getQueue(retriever); const queue = await retriever.getQueue();
return { instance: retriever.getInstanceId(), data: queue }; return { instance: retriever.getInstanceId(), data: queue };
} catch (error) { } catch (error) {
logToFile(`[ArrRetrieverRegistry] Error fetching queue from ${retriever.name}: ${error.message}`); logToFile(`[ArrRetrieverRegistry] Error fetching queue from ${retriever.name}: ${error.message}`);
@@ -260,7 +258,7 @@ class ArrRetrieverRegistry {
.filter(result => result.status === 'fulfilled') .filter(result => result.status === 'fulfilled')
.map(result => result.value) .map(result => result.value)
}; };
} },
/** /**
* Get history grouped by retriever type * Get history grouped by retriever type
@@ -274,7 +272,7 @@ class ArrRetrieverRegistry {
const sonarrHistory = await Promise.allSettled( const sonarrHistory = await Promise.allSettled(
sonarrRetrievers.map(async (retriever) => { sonarrRetrievers.map(async (retriever) => {
try { try {
const history = await retriever.getHistory(retriever, options); const history = await retriever.getHistory(options);
return { instance: retriever.getInstanceId(), data: history }; return { instance: retriever.getInstanceId(), data: history };
} catch (error) { } catch (error) {
logToFile(`[ArrRetrieverRegistry] Error fetching history from ${retriever.name}: ${error.message}`); logToFile(`[ArrRetrieverRegistry] Error fetching history from ${retriever.name}: ${error.message}`);
@@ -286,7 +284,7 @@ class ArrRetrieverRegistry {
const radarrHistory = await Promise.allSettled( const radarrHistory = await Promise.allSettled(
radarrRetrievers.map(async (retriever) => { radarrRetrievers.map(async (retriever) => {
try { try {
const history = await retriever.getHistory(retriever, options); const history = await retriever.getHistory(options);
return { instance: retriever.getInstanceId(), data: history }; return { instance: retriever.getInstanceId(), data: history };
} catch (error) { } catch (error) {
logToFile(`[ArrRetrieverRegistry] Error fetching history from ${retriever.name}: ${error.message}`); logToFile(`[ArrRetrieverRegistry] Error fetching history from ${retriever.name}: ${error.message}`);
@@ -304,24 +302,6 @@ class ArrRetrieverRegistry {
.map(result => result.value) .map(result => result.value)
}; };
} }
}
// Create singleton instance
const registry = new ArrRetrieverRegistry();
module.exports = {
ArrRetrieverRegistry,
registry,
// Convenience functions
initializeRetrievers: () => registry.initialize(),
getAllRetrievers: () => registry.getAllRetrievers(),
getRetriever: (instanceId) => registry.getRetriever(instanceId),
getRetrieversByType: (type) => registry.getRetrieversByType(type),
getAllTags: () => registry.getAllTags(),
getAllQueues: () => registry.getAllQueues(),
getAllHistory: (options) => registry.getAllHistory(options),
getTagsByType: () => registry.getTagsByType(),
getQueuesByType: () => registry.getQueuesByType(),
getHistoryByType: (options) => registry.getHistoryByType(options)
}; };
module.exports = arrRetrieverRegistry;
+7 -7
View File
@@ -1,7 +1,7 @@
// Copyright (c) 2026 Gordon Bolton. MIT License. // Copyright (c) 2026 Gordon Bolton. MIT License.
const cache = require('./cache'); const cache = require('./cache');
const { getSonarrInstances, getRadarrInstances } = require('./config'); const { getSonarrInstances, getRadarrInstances } = require('./config');
const { initializeRetrievers, getRetrieversByType } = require('./arrRetrievers'); const arrRetrieverRegistry = require('./arrRetrievers');
// Cache TTL for recent-history data: 5 minutes. // Cache TTL for recent-history data: 5 minutes.
// History changes slowly compared to active downloads. // History changes slowly compared to active downloads.
@@ -27,17 +27,17 @@ async function fetchSonarrHistory(since) {
if (cached) return cached; if (cached) return cached;
// Ensure retrievers are initialized // Ensure retrievers are initialized
await initializeRetrievers(); await arrRetrieverRegistry.initialize();
const instances = getSonarrInstances(); const instances = getSonarrInstances();
const sonarrRetrievers = getRetrieversByType('sonarr'); const sonarrRetrievers = arrRetrieverRegistry.getRetrieversByType('sonarr');
const results = await Promise.all(sonarrRetrievers.map(async (retriever) => { const results = await Promise.all(sonarrRetrievers.map(async (retriever) => {
const inst = instances.find(i => i.id === retriever.getInstanceId()); const inst = instances.find(i => i.id === retriever.getInstanceId());
if (!inst) return []; if (!inst) return [];
try { try {
const response = await retriever.getHistory(retriever, { const response = await retriever.getHistory({
pageSize: 100, pageSize: 100,
sortKey: 'date', sortKey: 'date',
sortDir: 'descending', sortDir: 'descending',
@@ -76,17 +76,17 @@ async function fetchRadarrHistory(since) {
if (cached) return cached; if (cached) return cached;
// Ensure retrievers are initialized // Ensure retrievers are initialized
await initializeRetrievers(); await arrRetrieverRegistry.initialize();
const instances = getRadarrInstances(); const instances = getRadarrInstances();
const radarrRetrievers = getRetrieversByType('radarr'); const radarrRetrievers = arrRetrieverRegistry.getRetrieversByType('radarr');
const results = await Promise.all(radarrRetrievers.map(async (retriever) => { const results = await Promise.all(radarrRetrievers.map(async (retriever) => {
const inst = instances.find(i => i.id === retriever.getInstanceId()); const inst = instances.find(i => i.id === retriever.getInstanceId());
if (!inst) return []; if (!inst) return [];
try { try {
const response = await retriever.getHistory(retriever, { const response = await retriever.getHistory({
pageSize: 100, pageSize: 100,
sortKey: 'date', sortKey: 'date',
sortDir: 'descending', sortDir: 'descending',
+8 -8
View File
@@ -2,7 +2,7 @@
const axios = require('axios'); const axios = require('axios');
const cache = require('./cache'); const cache = require('./cache');
const { initializeClients, getAllDownloads, getDownloadsByClientType } = require('./downloadClients'); const { initializeClients, getAllDownloads, getDownloadsByClientType } = require('./downloadClients');
const { initializeRetrievers, getTagsByType, getQueuesByType, getHistoryByType } = require('./arrRetrievers'); const arrRetrieverRegistry = require('./arrRetrievers');
const { const {
getSonarrInstances, getSonarrInstances,
getRadarrInstances getRadarrInstances
@@ -41,7 +41,7 @@ async function pollAllServices() {
try { try {
// Ensure download clients and *arr retrievers are initialized // Ensure download clients and *arr retrievers are initialized
await initializeClients(); await initializeClients();
await initializeRetrievers(); await arrRetrieverRegistry.initialize();
const sonarrInstances = getSonarrInstances(); const sonarrInstances = getSonarrInstances();
const radarrInstances = getRadarrInstances(); const radarrInstances = getRadarrInstances();
@@ -53,27 +53,27 @@ async function pollAllServices() {
return downloadsByType; return downloadsByType;
}), }),
timed('Sonarr Tags', async () => { timed('Sonarr Tags', async () => {
const tagsByType = await getTagsByType(); const tagsByType = await arrRetrieverRegistry.getTagsByType();
return tagsByType.sonarr || []; return tagsByType.sonarr || [];
}), }),
timed('Sonarr Queue', async () => { timed('Sonarr Queue', async () => {
const queuesByType = await getQueuesByType(); const queuesByType = await arrRetrieverRegistry.getQueuesByType();
return queuesByType.sonarr || []; return queuesByType.sonarr || [];
}), }),
timed('Sonarr History', async () => { timed('Sonarr History', async () => {
const historyByType = await getHistoryByType({ pageSize: 10 }); const historyByType = await arrRetrieverRegistry.getHistoryByType({ pageSize: 10 });
return historyByType.sonarr || []; return historyByType.sonarr || [];
}), }),
timed('Radarr Queue', async () => { timed('Radarr Queue', async () => {
const queuesByType = await getQueuesByType(); const queuesByType = await arrRetrieverRegistry.getQueuesByType();
return queuesByType.radarr || []; return queuesByType.radarr || [];
}), }),
timed('Radarr History', async () => { timed('Radarr History', async () => {
const historyByType = await getHistoryByType({ pageSize: 10 }); const historyByType = await arrRetrieverRegistry.getHistoryByType({ pageSize: 10 });
return historyByType.radarr || []; return historyByType.radarr || [];
}), }),
timed('Radarr Tags', async () => { timed('Radarr Tags', async () => {
const tagsByType = await getTagsByType(); const tagsByType = await arrRetrieverRegistry.getTagsByType();
return tagsByType.radarr || []; return tagsByType.radarr || [];
}), }),
]); ]);