-
Notifications
You must be signed in to change notification settings - Fork 0
/
posts.go
124 lines (104 loc) · 2.8 KB
/
posts.go
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
112
113
114
115
116
117
118
119
120
121
122
123
124
package main
import (
"encoding/json"
"fmt"
"github.com/drags/pinboard"
"net/http"
"time"
)
func postsGetHandler(w http.ResponseWriter, r *http.Request) {
p := authedPinboard(w, r)
pf := pinboard.PostsFilter{}
if len(r.FormValue("date")) > 0 {
dt, err := time.Parse("2006-01-02", r.FormValue("date"))
if err != nil {
msg := fmt.Sprintf("Failed to parse date: %v", err)
http.Error(w, msg, http.StatusInternalServerError)
return
}
pf.Date = dt
}
if len(r.FormValue("tag")) > 0 {
pf.Tags = append(pf.Tags, r.FormValue("tag"))
}
po, err := p.PostsGet(pf)
if err != nil {
msg := fmt.Sprintf("Failed to retrieve Posts: %v", err)
http.Error(w, msg, http.StatusInternalServerError)
return
}
err = json.NewEncoder(w).Encode(po)
if err != nil {
msg := fmt.Sprintf("Failed to encode Posts as JSON: %v", err)
http.Error(w, msg, http.StatusInternalServerError)
return
}
}
func postDatesHandler(w http.ResponseWriter, r *http.Request) {
p := authedPinboard(w, r)
pd, err := p.PostsDates(r.FormValue("tag"))
if err != nil {
msg := fmt.Sprintf("Failed to retrieve PostsDates: %v", err)
http.Error(w, msg, http.StatusInternalServerError)
return
}
err = json.NewEncoder(w).Encode(pd)
if err != nil {
msg := fmt.Sprintf("Failed to encode Posts as JSON: %v", err)
http.Error(w, msg, http.StatusInternalServerError)
return
}
}
func postDeleteTagHandler(w http.ResponseWriter, r *http.Request) {
p := authedPinboard(w, r)
po, err := postByUrl(p, r.FormValue("url"))
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
t := r.FormValue("tag")
newTags := make([]string, 0)
for _, tag := range po.Tags {
if tag != t {
newTags = append(newTags, tag)
}
}
po.Tags = newTags
err = updatePost(p, po)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
fmt.Fprintf(w, "Removed tag: %s from URL: %s", t, r.FormValue("url"))
}
func postAddTagHandler(w http.ResponseWriter, r *http.Request) {
p := authedPinboard(w, r)
po, err := postByUrl(p, r.FormValue("url"))
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
t := r.FormValue("tag")
po.Tags = append(po.Tags, t)
err = updatePost(p, po)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
fmt.Fprintf(w, "Added tag: %s from URL: %s", t, r.FormValue("url"))
}
func postByUrl(p *pinboard.Pinboard, u string) (pinboard.Post, error) {
pf := pinboard.PostsFilter{Url: u}
tmp, err := p.PostsGet(pf)
if err != nil {
return pinboard.Post{}, fmt.Errorf("Failed to retrieve post: %v", err)
}
return tmp[0], nil
}
func updatePost(p *pinboard.Pinboard, po pinboard.Post) error {
err := p.PostsAdd(po, false, false)
if err != nil {
return fmt.Errorf("Failed to update post: %v", err)
}
return nil
}