119 lines
2.3 KiB
Go
119 lines
2.3 KiB
Go
package api
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"machines/app/cfg"
|
|
"machines/app/db"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func handlePing(c *gin.Context) {
|
|
c.JSON(
|
|
http.StatusOK,
|
|
PingDto{
|
|
Message: "Pong!",
|
|
},
|
|
)
|
|
}
|
|
|
|
func handleGetMachines(dbConn *gorm.DB) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
machines := db.GetMachines(dbConn)
|
|
|
|
c.JSON(
|
|
http.StatusOK,
|
|
GetMachinesResponse{
|
|
Machines: *machines,
|
|
},
|
|
)
|
|
}
|
|
}
|
|
|
|
func handleGetMachine(dbConn *gorm.DB) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
machineId, err := strconv.Atoi(c.Param("machineId"))
|
|
if err != nil {
|
|
raiseBadRequestError(c, "Invalid machineId parameter")
|
|
return
|
|
}
|
|
|
|
machine, err := db.GetMachine(dbConn, machineId)
|
|
if err != nil {
|
|
raiseNotFoundError(c, "Machine not found")
|
|
return
|
|
}
|
|
|
|
c.JSON(
|
|
http.StatusOK,
|
|
machine,
|
|
)
|
|
}
|
|
}
|
|
|
|
func handleGetMachineProducts(dbConn *gorm.DB) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
machineId, err := strconv.Atoi(c.Param("machineId"))
|
|
if err != nil {
|
|
raiseBadRequestError(c, "Invalid machineId parameter")
|
|
return
|
|
}
|
|
|
|
machine, err := db.GetMachine(dbConn, machineId)
|
|
if err != nil {
|
|
raiseNotFoundError(c, "Machine not found")
|
|
return
|
|
}
|
|
|
|
url := fmt.Sprintf("%s/products?machineId=%d", cfg.Config.ProductsAppUrl, machine.Id)
|
|
resp, err := http.Get(url)
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
raiseInternalError(c, err.Error())
|
|
return
|
|
}
|
|
|
|
if resp.Body != nil {
|
|
defer resp.Body.Close()
|
|
}
|
|
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
raiseInternalError(c, err.Error())
|
|
return
|
|
}
|
|
|
|
c.Header("Content-Type", "application/json; charset=utf-8")
|
|
c.Writer.WriteString(string(body))
|
|
}
|
|
}
|
|
|
|
func initRouter(dbConn *gorm.DB) *gin.Engine {
|
|
gin.SetMode(gin.ReleaseMode)
|
|
router := gin.Default()
|
|
router.Use(corsMiddleware())
|
|
|
|
routes := router.Group("/machines")
|
|
{
|
|
routes.GET("/ping", handlePing)
|
|
routes.GET("", handleGetMachines(dbConn))
|
|
routes.GET("/:machineId", handleGetMachine(dbConn))
|
|
routes.GET("/:machineId/products", handleGetMachineProducts(dbConn))
|
|
}
|
|
|
|
return router
|
|
}
|
|
|
|
func Serve(dbConn *gorm.DB) {
|
|
serverAddr := fmt.Sprintf("%s:%d", cfg.Config.AppHost, cfg.Config.AppPort)
|
|
fmt.Printf("Starting serving on %s\n", serverAddr)
|
|
|
|
router := initRouter(dbConn)
|
|
router.Run(serverAddr)
|
|
}
|