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) }) }