apps/feeds/util.go 2.3 K raw
1
package main
2
3
import (
4
	"database/sql"
5
	"fmt"
6
	"net/http"
7
	"strconv"
8
	"strings"
9
	"time"
10
)
11
12
func formatDate(ts int64) string {
13
	if ts <= 0 {
14
		return ""
15
	}
16
	return time.Unix(ts, 0).UTC().Format("Jan 2, 2006")
17
}
18
19
func parseIntDefault(s string, fallback int) int {
20
	if v, err := strconv.Atoi(s); err == nil {
21
		return v
22
	}
23
	return fallback
24
}
25
26
func parsePositiveInt(s string) (int, error) {
27
	v, err := strconv.Atoi(strings.TrimSpace(s))
28
	if err != nil || v < 1 {
29
		return 0, fmt.Errorf("invalid integer")
30
	}
31
	return v, nil
32
}
33
34
func validPollMinutes(v int) bool {
35
	return v >= 1 && v <= 1440
36
}
37
38
func formPollMinutes(r *http.Request) (int, bool) {
39
	mins, err := strconv.Atoi(r.FormValue("poll_interval_minutes"))
40
	return mins, err == nil && validPollMinutes(mins)
41
}
42
43
func itemFilterFromRequest(r *http.Request) ListItemsFilter {
44
	filter := ListItemsFilter{Limit: parseIntDefault(r.URL.Query().Get("limit"), 100), UnreadOnly: r.URL.Query().Get("unread") == "true"}
45
	if id, ok := queryInt64(r, "category_id"); ok {
46
		filter.CategoryID = &id
47
	}
48
	if id, ok := queryInt64(r, "subscription_id"); ok {
49
		filter.SubscriptionID = &id
50
	}
51
	return filter
52
}
53
54
func queryInt64(r *http.Request, key string) (int64, bool) {
55
	v := strings.TrimSpace(r.URL.Query().Get(key))
56
	if v == "" {
57
		return 0, false
58
	}
59
	id, err := strconv.ParseInt(v, 10, 64)
60
	if err != nil {
61
		return 0, false
62
	}
63
	return id, true
64
}
65
66
func splitAndTrim(s string) []string {
67
	parts := strings.Split(s, ",")
68
	out := []string{}
69
	for _, part := range parts {
70
		if trimmed := strings.TrimSpace(part); trimmed != "" {
71
			out = append(out, trimmed)
72
		}
73
	}
74
	return out
75
}
76
77
func nullStringValue(v sql.NullString) string {
78
	if v.Valid {
79
		return v.String
80
	}
81
	return ""
82
}
83
84
func nullStringPointer(v sql.NullString) *string {
85
	if v.Valid {
86
		return &v.String
87
	}
88
	return nil
89
}
90
91
func toSubscriptionView(s Subscription) subscriptionView {
92
	return subscriptionView{ID: s.ID, FeedURL: s.FeedURL, Title: s.Title, SiteURL: nullStringPointer(s.SiteURL), FaviconURL: nullStringPointer(s.FaviconURL), CategoryID: func() *int64 {
93
		if s.CategoryID.Valid {
94
			return &s.CategoryID.Int64
95
		}
96
		return nil
97
	}(), ETag: nullStringPointer(s.ETag), LastModified: nullStringPointer(s.LastModified), LastFetchedAt: nullStringPointer(s.LastFetchedAt), LastError: nullStringPointer(s.LastError), AddedAt: s.AddedAt}
98
}
99
100
func itoa(v int) string {
101
	return strconv.Itoa(v)
102
}