107 lines
2.9 KiB
Go
107 lines
2.9 KiB
Go
|
|
package httpapi
|
||
|
|
|
||
|
|
import (
|
||
|
|
"database/sql"
|
||
|
|
"fmt"
|
||
|
|
"net/url"
|
||
|
|
"strconv"
|
||
|
|
"strings"
|
||
|
|
|
||
|
|
hres "form-builder-be-go/internal/hal"
|
||
|
|
sq "form-builder-be-go/internal/sqlc"
|
||
|
|
|
||
|
|
"github.com/gin-gonic/gin"
|
||
|
|
"github.com/raff/halgo"
|
||
|
|
)
|
||
|
|
|
||
|
|
func RegisterLanguageRoutes(r *gin.Engine, db *sql.DB) {
|
||
|
|
// List languages
|
||
|
|
r.GET("/languages", func(c *gin.Context) {
|
||
|
|
limit := parseIntDefault(c.Query("limit"), 20)
|
||
|
|
if limit > 100 {
|
||
|
|
limit = 100
|
||
|
|
}
|
||
|
|
offset := parseIntDefault(c.Query("offset"), 0)
|
||
|
|
order := c.Query("order")
|
||
|
|
|
||
|
|
q := sq.New(db)
|
||
|
|
langs, err := q.ListLanguages(c, sq.ListLanguagesParams{Limit: int64(limit), Offset: int64(offset)})
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(500, gin.H{"error": err.Error()})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
total, err := q.CountLanguages(c)
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(500, gin.H{"error": err.Error()})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
selfURL := buildURL("/languages", limit, offset, order, c.Query("expand"))
|
||
|
|
res := hres.New(selfURL)
|
||
|
|
res.AddCurie()
|
||
|
|
res.AddLink("self", halgo.Link{Href: selfURL})
|
||
|
|
if int64(offset+limit) < total {
|
||
|
|
nextURL := buildURL("/languages", limit, offset+limit, order, c.Query("expand"))
|
||
|
|
res.AddLink("next", halgo.Link{Href: nextURL})
|
||
|
|
}
|
||
|
|
if offset > 0 {
|
||
|
|
prev := offset - limit
|
||
|
|
if prev < 0 {
|
||
|
|
prev = 0
|
||
|
|
}
|
||
|
|
prevURL := buildURL("/languages", limit, prev, order, c.Query("expand"))
|
||
|
|
res.AddLink("prev", halgo.Link{Href: prevURL})
|
||
|
|
}
|
||
|
|
|
||
|
|
var embedded []interface{}
|
||
|
|
for _, l := range langs {
|
||
|
|
itemURL := "/languages/" + strconv.FormatInt(l.LanguageID, 10)
|
||
|
|
item := hres.New(itemURL)
|
||
|
|
item.SetState(l)
|
||
|
|
item.AddLink("self", halgo.Link{Href: itemURL})
|
||
|
|
// Convenience link to films filtered by this language name
|
||
|
|
name := strings.TrimSpace(fmt.Sprint(l.Name))
|
||
|
|
if name != "" {
|
||
|
|
qv := url.Values{"language.name": []string{name}}
|
||
|
|
item.AddLink("sakila:films", halgo.Link{Href: "/films?" + qv.Encode()})
|
||
|
|
}
|
||
|
|
embedded = append(embedded, item)
|
||
|
|
}
|
||
|
|
res.Embed("languages", embedded)
|
||
|
|
res.SetState(gin.H{"count": len(langs), "total": total, "limit": limit, "offset": offset})
|
||
|
|
c.Header("Content-Type", "application/hal+json")
|
||
|
|
c.JSON(200, res)
|
||
|
|
})
|
||
|
|
|
||
|
|
// Get language
|
||
|
|
r.GET("/languages/:id", func(c *gin.Context) {
|
||
|
|
id, err := strconv.ParseInt(c.Param("id"), 10, 64)
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(400, gin.H{"error": "invalid id"})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
q := sq.New(db)
|
||
|
|
l, err := q.GetLanguage(c, id)
|
||
|
|
if err != nil {
|
||
|
|
if err == sql.ErrNoRows {
|
||
|
|
c.JSON(404, gin.H{"error": "not found"})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
c.JSON(500, gin.H{"error": err.Error()})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
self := "/languages/" + strconv.FormatInt(l.LanguageID, 10)
|
||
|
|
res := hres.New(self)
|
||
|
|
res.AddCurie()
|
||
|
|
res.SetState(l)
|
||
|
|
res.AddLink("self", halgo.Link{Href: self})
|
||
|
|
name := strings.TrimSpace(fmt.Sprint(l.Name))
|
||
|
|
if name != "" {
|
||
|
|
qv := url.Values{"language.name": []string{name}}
|
||
|
|
res.AddLink("sakila:films", halgo.Link{Href: "/films?" + qv.Encode()})
|
||
|
|
}
|
||
|
|
c.Header("Content-Type", "application/hal+json")
|
||
|
|
c.JSON(200, res)
|
||
|
|
})
|
||
|
|
}
|