package api import ( "github.com/gin-gonic/gin" "github.com/gissleh/stufflog/database" "github.com/gissleh/stufflog/internal/auth" "github.com/gissleh/stufflog/internal/generate" "github.com/gissleh/stufflog/internal/slerrors" "github.com/gissleh/stufflog/models" "github.com/gissleh/stufflog/services" ) func Group(g *gin.RouterGroup, db database.Database) { l := services.Loader{DB: db} g.GET("/", handler("groups", func(c *gin.Context) (interface{}, error) { return l.ListGroups(c, models.GroupFilter{}) })) g.GET("/:id", handler("group", func(c *gin.Context) (interface{}, error) { return l.FindGroup(c, c.Param("id")) })) g.POST("/", handler("group", func(c *gin.Context) (interface{}, error) { group := models.Group{} err := c.BindJSON(&group) if err != nil { return nil, slerrors.BadRequest("Invalid JSON") } group.ID = generate.GroupID() group.UserID = auth.UserID(c) err = db.Groups().Insert(c.Request.Context(), group) if err != nil { return nil, err } return &models.GroupResult{ Group: group, Items: []*models.Item{}, }, nil })) g.PUT("/:id", handler("group", func(c *gin.Context) (interface{}, error) { update := models.GroupUpdate{} err := c.BindJSON(&update) if err != nil { return nil, slerrors.BadRequest("Invalid JSON") } group, err := db.Groups().Find(c.Request.Context(), c.Param("id")) if err != nil { return nil, err } else if auth.UserID(c) != group.UserID { return nil, slerrors.NotFound("Item") } group.Update(update) err = db.Groups().Update(c.Request.Context(), *group) if err != nil { return nil, err } return l.FindGroup(c, group.ID) })) g.DELETE("/:id", handler("group", func(c *gin.Context) (interface{}, error) { group, err := l.FindGroup(c, c.Param("id")) if err != nil { return nil, err } if len(group.Items) > 0 { return nil, slerrors.Forbidden("cannot delete non-empty group.") } goals, err := db.Goals().List(c.Request.Context(), models.GoalFilter{GroupIDs: []string{group.ID}}) if err != nil { return nil, err } if len(goals) > 0 { return nil, slerrors.Forbidden("cannot delete group with goals.") } err = db.Groups().Delete(c.Request.Context(), group.Group) if err != nil { return nil, err } return group, nil })) }