Manual Reference Source

app/modules/3rdparty/rss/controllers.js

// @flow
const Feed = require('feed');
const EntitiesUtils = require('../../utils/entities');
const LangUtils = require('../../utils/lang');
const Errors = require('../../exceptions/errors');
const Handlebars = require('../../utils/templating');


async function generate_rss_feed(ctx: Object): Promise<*> {
    const body = ctx.params;

    const entity = body.entity;
    const lang = body.lang || 'EN';
    let mapping = Buffer.from(body.mapping, 'base64').toString();
    mapping = JSON.parse(mapping);

    let query = {};
    let sort = [];
    let size = 2000;

    if (body.query) {
        query = Buffer.from(body.query, 'base64').toString();
        query = JSON.parse(query);
    }

    if (body.sort) {
        sort = Buffer.from(body.sort, 'base64').toString();
        sort = JSON.parse(sort);
    }

    if (body.size) {
        size = Math.min(parseInt(body.size, 10), size);
    }

    const litems = ['l_rss_title', 'l_rss_description',
        'l_rss_id', 'l_rss_link', 'l_rss_copyright', 'l_p_action'];
    const lang_items = await Promise.all(litems.map(l =>
        LangUtils.get_language_values_from_langs(l, [{ value: lang }])));
    const langs_object = lang_items.reduce((obj, items) => {
        if (items.length > 0) {
            obj[items[0].key] = items[0].value;
        }
        return obj;
    }, {});

    const feed = new Feed({
        title: langs_object.l_rss_title || 'l_rss_title',
        description: langs_object.l_rss_description || 'l_rss_description',
        id: langs_object.l_rss_id || 'l_rss_id',
        link: langs_object.l_rss_link || 'l_rss_link',
        copyright: langs_object.l_rss_copyright || 'l_rss_copyright',
        generator: 'PolarisOS',
    });

    const items = await EntitiesUtils.search_and_get_sources(entity, {
        size,
        sort,
        where: query,
    });

    items.forEach((item) => {
        feed.addItem({
            title: Handlebars.compile(mapping.title)(item),
            id: Handlebars.compile(mapping.id)(item),
            link: Handlebars.compile(mapping.link)(item),
            description: mapping.description ? Handlebars.compile(mapping.description)(item) : '',
            content: mapping.content ? Handlebars.compile(mapping.content)(item) : '',
        });
    });

    ctx.set('Content-Type', 'application/rss+xml');
    ctx.body = feed.rss2();
}

module.exports = {
    generate_rss_feed,
};