aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--models/item/item.go24
-rw-r--r--static/ui.html5
-rw-r--r--static/ui.js14
-rw-r--r--web/web.go49
4 files changed, 75 insertions, 17 deletions
diff --git a/models/item/item.go b/models/item/item.go
index 8d1d473..f70bba1 100644
--- a/models/item/item.go
+++ b/models/item/item.go
@@ -81,7 +81,13 @@ func filterPolicy() *bluemonday.Policy {
return p
}
+func ItemById(id int64) *Item {
+ items, _ := Filter(0, 0, "", false, false, id)
+ return items[0]
+}
+
func (i *Item) GetFullContent() {
+ fmt.Printf("fetching from %s\n", i.Url)
g := goose.New()
article, err := g.ExtractFromURL(i.Url)
if err != nil {
@@ -105,9 +111,8 @@ func (i *Item) GetFullContent() {
}
p := filterPolicy()
- md = p.Sanitize(ht)
-
- img = article.TopImage
+ i.FullContent = p.Sanitize(ht)
+ i.HeaderImage = article.TopImage
_, err = models.DB.Exec(`UPDATE item
SET full_content=?, header_image=?
@@ -117,7 +122,7 @@ func (i *Item) GetFullContent() {
}
}
-func Filter(max_id int64, feed_id int64, category string, unread_only bool, starred_only bool) ([]*Item, error) {
+func Filter(max_id int64, feed_id int64, category string, unread_only bool, starred_only bool, item_id int64) ([]*Item, error) {
var args []interface{}
@@ -148,13 +153,20 @@ func Filter(max_id int64, feed_id int64, category string, unread_only bool, star
query = query + " AND item.read_state=0 "
}
+ if item_id != 0 {
+ query = query + " AND item.id=? "
+ args = append(args, item_id)
+ }
+
+ // this is kind of dumb, but to keep the logic the same
+ // we kludge it this way for a "by id" select
if starred_only {
query = query + " AND item.starred=1 "
}
query = query + "ORDER BY item.id DESC LIMIT 15"
- // log.Println(query)
- // log.Println(args...)
+ // log.Println(query)
+ // log.Println(args...)
rows, err := models.DB.Query(query, args...)
if err != nil {
diff --git a/static/ui.html b/static/ui.html
index 89283a4..cae2c56 100644
--- a/static/ui.html
+++ b/static/ui.html
@@ -38,11 +38,12 @@
<script id="item_template" type="text/jqtmp">
<h2><a target="_blank" class="i" id="i_${item_id}" href="${item.url}">${item.title }</a>
<span class={{if item.starred}}"unstar"{{else}}"star"{{/if}}>★</span>
- <span class="full">{{if item.full}}▼{{else}}►{{/if}}</span>
</h2>
<p class="dateline" style="clear: both;">
<a href="${item.feed_url}">${item.feed_title}</a> | <a href="${item.url}">${item.p_url}</a>
- | ${item.feed_category}
+ | ${item.feed_category} |
+ <span class="full">{{if item.full}}hide{{else}}scrape{{/if}} full text</span>
+
</p>
{{if item.header_image}}
<div class="img"><img src="${item.header_image}" /></div>
diff --git a/static/ui.js b/static/ui.js
index 0c60630..4e6d7e0 100644
--- a/static/ui.js
+++ b/static/ui.js
@@ -208,7 +208,7 @@ var ControlsView = Backbone.View.extend({
var Item = Backbone.Model.extend({
idAttribute: "_id",
- url: '/item/',
+ url: '/item',
initialize: function() {
var p_url = this.get('url');
@@ -252,6 +252,16 @@ var Item = Backbone.Model.extend({
full: function() {
this.set({'full': !(this.get('full'))} );
+ // this should just use this.fetch() but
+ // it kept GETing from /item instead of /item/id
+ // so just hacking this in for now
+
+ if(this.get('full_content') == "") {
+ $.getJSON('/item/' + this.get('_id'), function(data) {
+ var i = App.items.get(data['_id'])
+ i.set('full_content', data['full_content']);
+ });
+ }
}
});
@@ -259,6 +269,8 @@ var Item = Backbone.Model.extend({
var ItemCollection = Backbone.Collection.extend({
model: Item,
+ url: '/item',
+
initialize: function() {
_.bindAll(this, 'boot', 'reboot');
},
diff --git a/web/web.go b/web/web.go
index 94204be..2151926 100644
--- a/web/web.go
+++ b/web/web.go
@@ -52,7 +52,7 @@ func streamHandler(w http.ResponseWriter, r *http.Request) {
}
var items []*item.Item
- items, err := item.Filter(int64(max_id), feed_id, category, unread_only, starred_only)
+ items, err := item.Filter(int64(max_id), feed_id, category, unread_only, starred_only, 0)
if err != nil {
log.Println(err)
}
@@ -63,12 +63,17 @@ func streamHandler(w http.ResponseWriter, r *http.Request) {
}
func itemHandler(w http.ResponseWriter, r *http.Request) {
- var i item.Item
- err := json.NewDecoder(r.Body).Decode(&i)
- if err != nil {
- log.Println(err)
- } else {
- i.Save()
+ switch r.Method {
+ case "PUT":
+ var i item.Item
+ err := json.NewDecoder(r.Body).Decode(&i)
+ if err != nil {
+ log.Println(err)
+ } else {
+ i.Save()
+ }
+ case "GET":
+ fullTextHandler(w, r)
}
defer r.Body.Close()
}
@@ -181,6 +186,31 @@ func imageProxyHandler(w http.ResponseWriter, r *http.Request) {
return
}
+func fullTextHandler(w http.ResponseWriter, r *http.Request) {
+ fmt.Printf("request: %v\n\n", r)
+
+ fmt.Printf("url string: %s\n\n", r.URL.String())
+
+ itemID, _ := strconv.Atoi(r.URL.String())
+ // fmt.Printf("item id: %v\n\n", itemID)
+
+ if itemID == 0 {
+ fmt.Printf("wah wah wah\n")
+ return
+ }
+
+ i := item.ItemById(int64(itemID))
+ // fmt.Println("item fetched: %v\n\n", i)
+
+ if i.FullContent == "" {
+ i.GetFullContent()
+ }
+
+ w.Header().Set("Content-Type", "application/json")
+ js, _ := json.Marshal(i)
+ w.Write(js)
+}
+
var AuthCookie = "auth"
var SecondsInAYear = 60 * 60 * 24 * 365
@@ -236,7 +266,10 @@ func Serve() {
http.Handle("/static/", http.StripPrefix("/static/", fs))
http.HandleFunc("/stream/", AuthWrap(streamHandler))
- http.HandleFunc("/item/", AuthWrap(itemHandler))
+
+ // http.HandleFunc("/item/", AuthWrap(itemHandler))
+ http.Handle("/item/", http.StripPrefix("/item/", AuthWrap(itemHandler)))
+
http.HandleFunc("/feed/", AuthWrap(feedHandler))
http.HandleFunc("/tag/", AuthWrap(categoryHandler))
http.Handle("/image/", http.StripPrefix("/image/", AuthWrap(imageProxyHandler)))