summaryrefslogtreecommitdiffstats
path: root/js/service/OPMLImporter.js
blob: b2b52bc4c12938b6a48f045a20356bd8ccbe69dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/**
 * Nextcloud - News
 *
 * This file is licensed under the Affero General Public License version 3 or
 * later. See the COPYING file.
 *
 * @author Bernhard Posselt <dev@bernhard-posselt.com>
 * @copyright Bernhard Posselt 2014
 */
app.service('OPMLImporter', function (FeedResource, FolderResource, Publisher, $q) {
    'use strict';
    var startFeedJob = function (queue) {
        var deferred = $q.defer();
        try {
            if (queue.length > 0) {
                var feed = queue.pop();
                var url = feed.url;
                var title = feed.title;
                var folderId = 0;
                var folderName = feed.folderName;

                if (folderName !== undefined &&
                    FolderResource.get(folderName) !== undefined) {
                    var folder = FolderResource.get(folderName);
                    folder.opened = true;
                    folderId = folder.id;

                    // display folder while adding the feed
                    folder.getsFeed = true;
                    folder.getsFeedCounter = folder.getsFeedCounter || 0;
                    folder.getsFeedCounter += 1;
                }

                // make sure to not add already existing feeds
                if (url !== undefined && FeedResource.get(url) === undefined) {
                    FeedResource.create(url, folderId, title)
                        .then(function (data) {
                            Publisher.publishAll(data);
                        })
                        .finally(function () {
                            if (folderId !== 0) {
                                folder.getsFeedCounter -= 1;

                                if (folder.getsFeedCounter === 0) {
                                    folder.getsFeed = false;
                                }
                            }
                            startFeedJob(queue);
                        });
                }
            } else {
                deferred.resolve();
            }
        } catch (e) {
            console.error(e);
            deferred.resolve();
        }

        return deferred.promise;
    };

    this.importFolders = function (content) {
        // assumption: folders are fast to create and we dont need a queue for
        // them
        var feedQueue = [];
        var folderPromises = [];
        content.folders.forEach(function (folder) {
            if (folder.name !== undefined) {
                // skip already created folders
                if (FolderResource.get(folder.name) === undefined) {
                    var promise = FolderResource.create(folder.name)
                        .then(function (data) {
                            Publisher.publishAll(data);
                        });
                    folderPromises.push(promise);
                }

                folder.feeds.forEach(function (feed) {
                    feed.folderName = folder.name;
                    feedQueue.push(feed);
                });
            }
        });
        feedQueue = feedQueue.concat(content.feeds);

        var deferred = $q.defer();

        $q.all(folderPromises).finally(function () {
            deferred.resolve(feedQueue);
        });

        return deferred.promise;
    };

    this.importFeedQueue = function (feedQueue, jobSize) {
        // queue feeds to prevent server slowdown
        var deferred = $q.defer();

        var jobPromises = [];
        for (var i = 0; i < jobSize; i += 1) {
            jobPromises.push(startFeedJob(feedQueue));
        }

        $q.all(jobPromises).then(function () {
            deferred.resolve();
        });

        return deferred.promise;
    };

});