Release v2.5.6

This commit is contained in:
lzstealth committed 2026-08-05 19:38:16 +01:00
1 parent a8ef35b287
commit 9f831f04bc
161 files changed
+8487 -1295

No files matched your search

@@ -0,0 +1,26 @@
// RSS feed duplication helpers.
function buildDuplicateRssFeedName(feedName) {
const baseName = 'Copy of ' + String(feedName || '').trim();
return baseName;
}
function buildDuplicateRssFeed(rssFeed, duplicateName) {
return Object.assign({}, rssFeed, {
id: null,
name: duplicateName,
feedUrl: rssFeed.feed_url || '',
lastPulledAt: null,
pullError: '',
pulledItems: [],
updateIntervalValue: rssFeed.update_interval_value,
updateIntervalUnit: rssFeed.update_interval_unit || 'minutes',
itemLimit: rssFeed.item_limit,
feedUrlValue: rssFeed.feed_url || ''
});
}
module.exports = {
buildDuplicateRssFeedName,
buildDuplicateRssFeed
};
@@ -24,8 +24,9 @@ function buildRssFeedFormViewModel(rssFeed, message, currentUser, options, isEdi
inUse: Boolean(viewRssFeed.inUse),
pulledItems: viewOptions.pulledItems || viewRssFeed.pulledItems || [],
pullError: viewOptions.pullError || viewRssFeed.pullError || '',
messageVariant: viewOptions.messageVariant || '',
isEdit: Boolean(isEdit),
showSaveSecondaryActions: Boolean(isEdit),
showSaveSecondaryActions: true,
deleteDisabled: !isEdit || Boolean(viewRssFeed.inUse),
formAction: isEdit && viewRssFeed.id ? '/data-sources/rss-feeds/' + viewRssFeed.id : '/data-sources/rss-feeds',
formAttrs: isEdit && viewRssFeed.id ? 'data-async-save data-async-save-refresh-target="#rss-feed-items-panel" data-async-save-refresh-state-url="/data-sources/rss-feeds/' + viewRssFeed.id + '/state" data-async-save-close-url="/data-sources/rss-feeds" data-async-save-new-url="/data-sources/rss-feeds/new"' : 'data-async-save data-async-save-close-url="/data-sources/rss-feeds" data-async-save-new-redirect="response-url" data-async-save-new-url="/data-sources/rss-feeds/new"',
@@ -4,6 +4,7 @@ const { buildPagination } = require('../../../lib/pagination');
const renderRssFeedsPage = require('./list');
const renderRssFeedAddPage = require('./add');
const renderRssFeedEditPage = require('./edit');
const { buildDuplicateRssFeedName, buildDuplicateRssFeed } = require('./duplicate');
async function getDataSourceUsageMaps(pool, common) {
const [slides] = await pool.query('SELECT content_json FROM c_slides WHERE content_json IS NOT NULL');
@@ -155,6 +156,29 @@ module.exports = function registerRssFeedRoutes(app, deps) {
}
});
app.get('/data-sources/rss-feeds/:id/duplicate', requirePermission('rss-feeds.read'), requirePermission('rss-feeds.create'), async function (req, res, next) {
try {
const rssFeed = await common.fetchRssFeedById(pool, Number(req.params.id));
if (!rssFeed) {
return res.status(404).send('RSS feed not found');
}
let duplicateName = buildDuplicateRssFeedName(rssFeed.name);
let duplicateIndex = 2;
while (await common.fetchDuplicateName(pool, 'i_rss_feeds', duplicateName)) {
duplicateName = buildDuplicateRssFeedName(rssFeed.name) + ' (' + duplicateIndex + ')';
duplicateIndex += 1;
}
res.send(renderRssFeedAddPage(buildDuplicateRssFeed(rssFeed, duplicateName), req.query.message ? String(req.query.message) : 'Review the copied values and save when ready.', req.currentUser, {
messageVariant: 'info',
showSaveSecondaryActions: true
}));
} catch (error) {
next(error);
}
});
app.get('/data-sources/rss-feeds/:id/state', requirePermission('rss-feeds.update'), function (req, res, next) {
sendRefreshTaskState(req, res, dataSourceTasks, Number(req.params.id)).catch(next);
});