context int shorthands

This commit is contained in:
Nazar Kanaev 2021-03-16 23:44:29 +00:00
parent 76937bedc9
commit ff3241bd57
2 changed files with 24 additions and 12 deletions

View File

@ -2,8 +2,10 @@ package router
import ( import (
"encoding/json" "encoding/json"
"fmt"
"log" "log"
"net/http" "net/http"
"strconv"
) )
type Context struct { type Context struct {
@ -31,3 +33,15 @@ func (c *Context) JSON(status int, data interface{}) {
c.Out.Write(body) c.Out.Write(body)
c.Out.Write([]byte("\n")) c.Out.Write([]byte("\n"))
} }
func (c *Context) VarInt64(key string) (int64, error) {
if val, ok := c.Vars[key]; ok {
return strconv.ParseInt(val, 10, 64)
}
return 0, fmt.Errorf("no such var: %s", key)
}
func (c *Context) QueryInt64(key string) (int64, error) {
query := c.Req.URL.Query()
return strconv.ParseInt(query.Get("page"), 10, 64)
}

View File

@ -12,7 +12,6 @@ import (
"math" "math"
"net/http" "net/http"
"reflect" "reflect"
"strconv"
) )
func (s *Server) handler() http.Handler { func (s *Server) handler() http.Handler {
@ -96,7 +95,7 @@ func (s *Server) handleFolderList(c *router.Context) {
} }
func (s *Server) handleFolder(c *router.Context) { func (s *Server) handleFolder(c *router.Context) {
id, err := strconv.ParseInt(c.Vars["id"], 10, 64) id, err := c.VarInt64("id")
if err != nil { if err != nil {
c.Out.WriteHeader(http.StatusBadRequest) c.Out.WriteHeader(http.StatusBadRequest)
return return
@ -136,7 +135,7 @@ func (s *Server) handleFeedErrors(c *router.Context) {
} }
func (s *Server) handleFeedIcon(c *router.Context) { func (s *Server) handleFeedIcon(c *router.Context) {
id, err := strconv.ParseInt(c.Vars["id"], 10, 64) id, err := c.VarInt64("id")
if err != nil { if err != nil {
c.Out.WriteHeader(http.StatusBadRequest) c.Out.WriteHeader(http.StatusBadRequest)
return return
@ -144,7 +143,6 @@ func (s *Server) handleFeedIcon(c *router.Context) {
feed := s.db.GetFeed(id) feed := s.db.GetFeed(id)
if feed != nil && feed.Icon != nil { if feed != nil && feed.Icon != nil {
c.Out.Header().Set("Content-Type", http.DetectContentType(*feed.Icon)) c.Out.Header().Set("Content-Type", http.DetectContentType(*feed.Icon))
c.Out.Header().Set("Content-Length", strconv.Itoa(len(*feed.Icon)))
c.Out.Write(*feed.Icon) c.Out.Write(*feed.Icon)
} else { } else {
c.Out.WriteHeader(http.StatusNotFound) c.Out.WriteHeader(http.StatusNotFound)
@ -198,7 +196,7 @@ func (s *Server) handleFeedList(c *router.Context) {
} }
func (s *Server) handleFeed(c *router.Context) { func (s *Server) handleFeed(c *router.Context) {
id, err := strconv.ParseInt(c.Vars["id"], 10, 64) id, err := c.VarInt64("id")
if err != nil { if err != nil {
c.Out.WriteHeader(http.StatusBadRequest) c.Out.WriteHeader(http.StatusBadRequest)
return return
@ -239,7 +237,7 @@ func (s *Server) handleFeed(c *router.Context) {
func (s *Server) handleItem(c *router.Context) { func (s *Server) handleItem(c *router.Context) {
if c.Req.Method == "PUT" { if c.Req.Method == "PUT" {
id, err := strconv.ParseInt(c.Vars["id"], 10, 64) id, err := c.VarInt64("id")
if err != nil { if err != nil {
c.Out.WriteHeader(http.StatusBadRequest) c.Out.WriteHeader(http.StatusBadRequest)
return return
@ -264,14 +262,14 @@ func (s *Server) handleItemList(c *router.Context) {
perPage := 20 perPage := 20
curPage := 1 curPage := 1
query := c.Req.URL.Query() query := c.Req.URL.Query()
if page, err := strconv.ParseInt(query.Get("page"), 10, 64); err == nil { if page, err := c.QueryInt64("page"); err == nil {
curPage = int(page) curPage = int(page)
} }
filter := storage.ItemFilter{} filter := storage.ItemFilter{}
if folderID, err := strconv.ParseInt(query.Get("folder_id"), 10, 64); err == nil { if folderID, err := c.QueryInt64("folder_id"); err == nil {
filter.FolderID = &folderID filter.FolderID = &folderID
} }
if feedID, err := strconv.ParseInt(query.Get("feed_id"), 10, 64); err == nil { if feedID, err := c.QueryInt64("feed_id"); err == nil {
filter.FeedID = &feedID filter.FeedID = &feedID
} }
if status := query.Get("status"); len(status) != 0 { if status := query.Get("status"); len(status) != 0 {
@ -292,12 +290,12 @@ func (s *Server) handleItemList(c *router.Context) {
"list": items, "list": items,
}) })
} else if c.Req.Method == "PUT" { } else if c.Req.Method == "PUT" {
query := c.Req.URL.Query()
filter := storage.MarkFilter{} filter := storage.MarkFilter{}
if folderID, err := strconv.ParseInt(query.Get("folder_id"), 10, 64); err == nil {
if folderID, err := c.QueryInt64("folder_id"); err == nil {
filter.FolderID = &folderID filter.FolderID = &folderID
} }
if feedID, err := strconv.ParseInt(query.Get("feed_id"), 10, 64); err == nil { if feedID, err := c.QueryInt64("feed_id"); err == nil {
filter.FeedID = &feedID filter.FeedID = &feedID
} }
s.db.MarkItemsRead(filter) s.db.MarkItemsRead(filter)