diff --git a/assets/graphicarts/alert-circle.svg b/assets/graphicarts/alert-circle.svg
new file mode 100644
index 0000000..8d02b7d
--- /dev/null
+++ b/assets/graphicarts/alert-circle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/index.html b/assets/index.html
index 338f803..bf5bdee 100644
--- a/assets/index.html
+++ b/assets/index.html
@@ -337,6 +337,11 @@
{{ feed.title }}
+
+ {% inline "alert-circle.svg" %}
+
diff --git a/assets/javascripts/api.js b/assets/javascripts/api.js
index 55006a6..f7f1280 100644
--- a/assets/javascripts/api.js
+++ b/assets/javascripts/api.js
@@ -43,6 +43,9 @@
refresh: function() {
return api('post', '/api/feeds/refresh')
},
+ list_errors: function() {
+ return api('get', '/api/feeds/errors').then(json)
+ },
},
folders: {
list: function() {
diff --git a/assets/javascripts/app.js b/assets/javascripts/app.js
index a6d4626..5651278 100644
--- a/assets/javascripts/app.js
+++ b/assets/javascripts/app.js
@@ -177,6 +177,7 @@ var vm = new Vue({
},
'refreshRate': undefined,
'authenticated': authenticated(),
+ 'feed_errors': {},
}
},
computed: {
@@ -529,6 +530,12 @@ var vm = new Vue({
showSettings: function(settings) {
this.settings = settings
this.$bvModal.show('settings-modal')
+
+ if (settings === 'manage') {
+ api.feeds.list_errors().then(function(errors) {
+ vm.feed_errors = errors
+ })
+ }
},
resizeFeedList: function(width) {
this.feedListWidth = Math.min(Math.max(200, width), 700)
diff --git a/server/handlers.go b/server/handlers.go
index 2b18178..af19929 100644
--- a/server/handlers.go
+++ b/server/handlers.go
@@ -31,6 +31,7 @@ var routes []Route = []Route{
p("/api/feeds", FeedListHandler),
p("/api/feeds/find", FeedHandler),
p("/api/feeds/refresh", FeedRefreshHandler),
+ p("/api/feeds/errors", FeedErrorsHandler),
p("/api/feeds/:id/icon", FeedIconHandler),
p("/api/feeds/:id", FeedHandler),
p("/api/items", ItemListHandler),
@@ -229,6 +230,11 @@ func FeedRefreshHandler(rw http.ResponseWriter, req *http.Request) {
}
}
+func FeedErrorsHandler(rw http.ResponseWriter, req *http.Request) {
+ errors := db(req).GetFeedErrors()
+ writeJSON(rw, errors)
+}
+
func FeedIconHandler(rw http.ResponseWriter, req *http.Request) {
id, err := strconv.ParseInt(Vars(req)["id"], 10, 64)
if err != nil {
diff --git a/storage/feed.go b/storage/feed.go
index 691791c..9ac6e8a 100644
--- a/storage/feed.go
+++ b/storage/feed.go
@@ -150,3 +150,23 @@ func (s *Storage) SetFeedError(feedID int64, lastError error) {
s.log.Print(err)
}
}
+
+func (s *Storage) GetFeedErrors() map[int64]string {
+ errors := make(map[int64]string)
+
+ rows, err := s.db.Query(`select feed_id, error from feed_errors`)
+ if err != nil {
+ s.log.Print(err)
+ return errors
+ }
+
+ for rows.Next() {
+ var id int64
+ var error string
+ if err = rows.Scan(&id, &error); err != nil {
+ s.log.Print(err)
+ }
+ errors[id] = error
+ }
+ return errors
+}