You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.6 KiB
77 lines
1.6 KiB
package api
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"git.aiterp.net/lucifer/new-server/models"
|
|
"github.com/gin-gonic/gin"
|
|
"strconv"
|
|
)
|
|
|
|
var errorMap = map[error]int{
|
|
models.ErrNotFound: 404,
|
|
models.ErrInvalidName: 400,
|
|
models.ErrBadInput: 400,
|
|
models.ErrBadColor: 400,
|
|
models.ErrInternal: 500,
|
|
models.ErrUnknownColorFormat: 400,
|
|
|
|
models.ErrSceneInvalidInterval: 400,
|
|
models.ErrSceneNoRoles: 400,
|
|
models.ErrSceneRoleNoStates: 400,
|
|
models.ErrSceneRoleUnsupportedOrdering: 422,
|
|
models.ErrSceneRoleUnknownEffect: 422,
|
|
models.ErrSceneRoleUnknownPowerMode: 422,
|
|
}
|
|
|
|
type response struct {
|
|
Code int `json:"code"`
|
|
Message string `json:"message"`
|
|
Data interface{} `json:"data"`
|
|
}
|
|
|
|
func handler(fun func(c *gin.Context) (interface{}, error)) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
val, err := fun(c)
|
|
if err != nil {
|
|
errCode := errorMap[err]
|
|
if errCode == 0 {
|
|
errCode = 500
|
|
}
|
|
|
|
c.JSON(errCode, response{
|
|
Code: errCode,
|
|
Message: err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
c.JSON(200, response{
|
|
Code: 200,
|
|
Message: "success",
|
|
Data: val,
|
|
})
|
|
}
|
|
}
|
|
|
|
func intParam(c *gin.Context, key string) int {
|
|
i, err := strconv.Atoi(c.Param(key))
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
|
|
return i
|
|
}
|
|
|
|
func parseBody(c *gin.Context, target interface{}) error {
|
|
err := json.NewDecoder(c.Request.Body).Decode(target)
|
|
if err != nil {
|
|
return models.ErrBadInput
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func ctxOf(c *gin.Context) context.Context {
|
|
return c.Request.Context()
|
|
}
|