package api import ( "net/http" db "github.com/Fluffy-Bean/TastyBites/database" "github.com/Fluffy-Bean/TastyBites/front" sb "github.com/huandu/go-sqlbuilder" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" ) type Config struct { Host string Logging bool } type JSONResponse struct { Data interface{} `json:"data,omitempty"` Error string `json:"error,omitempty"` } func Serve(c Config) { r := echo.New() if c.Logging { r.Use(middleware.Logger()) r.Use(middleware.CORS()) } r.Use(middleware.Recover()) r.StaticFS("/", front.DistDir) apiGroup := r.Group("/api") apiGroup.GET("/items", func(e echo.Context) error { var response JSONResponse type ItemResponse struct { Item []db.Item `json:"item"` } builder := db.ItemStruct.SelectFrom("Item").Select("*") query, args := builder.BuildWithFlavor(sb.SQLite) rows, err := db.Conn.Query(query, args...) defer rows.Close() if err != nil { r.Logger.Fatal(err) response.Error = "Could not query for data" return e.JSON(http.StatusInternalServerError, response) } var items []db.Item for rows.Next() { var item db.Item err := rows.Scan(db.ItemStruct.Addr(&item)...) if err != nil { r.Logger.Fatal(err) response.Error = "Failed to map response" return e.JSON(http.StatusInternalServerError, response) } items = append(items, item) } response.Data = ItemResponse{ Item: items, } return e.JSON(http.StatusOK, response) }) r.HideBanner = true r.Logger.Fatal(r.Start(c.Host)) }