superdesk/superdesk-client-core

View on GitHub
scripts/apps/publish/services/SubscribersService.ts

Summary

Maintainability
C
7 hrs
Test Coverage
import _ from 'lodash';

SubscribersService.$inject = ['api', '$q', '$filter'];
export function SubscribersService(api, $q, $filter) {
    /**
     * Recursively returns all subscribers
     *
     * @return {*}
     */
    var _getAllSubscribers = function(criteria = {}, page = 1, subscribers = []) {
        return api.query('subscribers', _.extend({max_results: 200, page: page}, criteria))
            .then((result) => {
                let pg = page;
                let merged = subscribers.concat(result._items);

                if (result._links.next) {
                    pg++;
                    return _getAllSubscribers(criteria, pg, merged);
                }

                return $filter('sortByName')(merged);
            });
    };

    var service = {
        fetched: null,
        subscribersLookup: {},
        subscribers: null,
        fetchSubscribers: function(criteria) {
            return _getAllSubscribers(criteria);
        },

        fetchActiveSubscribers: function(criteria) {
            return _getAllSubscribers(criteria).then((result) => _.filter(result, {is_active: true}));
        },

        fetchTargetableSubscribers: function(criteria) {
            return _getAllSubscribers(criteria)
                .then((result) =>
                    _.filter(result, (r) => (!('is_targetable' in r) || r.is_targetable) && r.is_active));
        },

        fetchSubscribersByKeyword: function(keyword) {
            return this.fetchSubscribers({$or: [{name: {$regex: keyword, $options: 'i'}}]});
        },

        fetchSubscribersByIds: function(ids) {
            var parts = [];

            _.each(ids, (id) => {
                parts.push({_id: id});
            });
            return this.fetchSubscribers({$or: parts});
        },
        initialize: function() {
            if (!this.fetched) {
                this.fetched = _getAllSubscribers()
                    .then((subscribers) => {
                        this.subscribers = subscribers;
                        this.subscribersLookup = _.keyBy(subscribers, '_id');
                    });
            }
            return this.fetched;
        },
    };

    return service;
}