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.
98 lines
2.4 KiB
98 lines
2.4 KiB
package api
|
|
|
|
import (
|
|
"git.aiterp.net/stufflog3/stufflog3-api/internal/database"
|
|
"git.aiterp.net/stufflog3/stufflog3-api/internal/models"
|
|
"git.aiterp.net/stufflog3/stufflog3-api/internal/slerrors"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func Stats(g *gin.RouterGroup, db database.Database) {
|
|
g.Use(scopeIDMiddleware(db))
|
|
|
|
g.GET("/", handler("stats", func(c *gin.Context) (interface{}, error) {
|
|
return getScope(c).Stats, nil
|
|
}))
|
|
|
|
g.GET("/:id", handler("stat", func(c *gin.Context) (interface{}, error) {
|
|
id, err := reqInt(c, "id")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
stat := getScope(c).Stat(id)
|
|
if stat == nil {
|
|
return nil, slerrors.NotFound("Stat")
|
|
}
|
|
|
|
return stat, nil
|
|
}))
|
|
|
|
g.POST("/", handler("stat", func(c *gin.Context) (interface{}, error) {
|
|
stat := &models.Stat{}
|
|
err := c.BindJSON(stat)
|
|
if err != nil {
|
|
return nil, slerrors.BadRequest("Invalid JSON input: " + err.Error())
|
|
}
|
|
|
|
if stat.Name == "" {
|
|
return nil, slerrors.BadRequest("Project name cannot be blank")
|
|
}
|
|
if stat.Weight < 0 {
|
|
return nil, slerrors.BadRequest("Negative weight not allowed")
|
|
}
|
|
for key, value := range stat.AllowedAmounts {
|
|
if value <= 0 {
|
|
return nil, slerrors.BadRequest("Invalid allowed amount: " + key + " (0/-1 only allowed when updating to delete them)")
|
|
}
|
|
}
|
|
|
|
return db.Stats(getScope(c).ID).Create(c.Request.Context(), *stat)
|
|
}))
|
|
|
|
g.PUT("/:id", handler("stat", func(c *gin.Context) (interface{}, error) {
|
|
id, err := reqInt(c, "id")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
update := &models.StatUpdate{}
|
|
err = c.BindJSON(update)
|
|
if err != nil {
|
|
return nil, slerrors.BadRequest("Invalid JSON input: " + err.Error())
|
|
}
|
|
|
|
stat := getScope(c).Stat(id)
|
|
if stat == nil {
|
|
return nil, slerrors.NotFound("Stat")
|
|
}
|
|
|
|
if update.Name != nil && *update.Name == "" {
|
|
return nil, slerrors.BadRequest("Project name cannot be blank")
|
|
}
|
|
if update.Weight != nil && *update.Weight < 0 {
|
|
return nil, slerrors.BadRequest("Negative weight not allowed")
|
|
}
|
|
|
|
return db.Stats(getScope(c).ID).Update(c.Request.Context(), *stat, *update)
|
|
}))
|
|
|
|
g.DELETE("/:id", handler("stat", func(c *gin.Context) (interface{}, error) {
|
|
id, err := reqInt(c, "id")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
stat := getScope(c).Stat(id)
|
|
if stat == nil {
|
|
return nil, slerrors.NotFound("Stat")
|
|
}
|
|
|
|
err = db.Stats(getScope(c).ID).Delete(c.Request.Context(), *stat)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return stat, nil
|
|
}))
|
|
}
|