|
|
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 ProjectGroup(g *gin.RouterGroup, db database.Database) { l := services.Loader{DB: db}
g.GET("/", handler("projectGroups", func(c *gin.Context) (interface{}, error) { return l.ListProjectGroups(c) }))
g.GET("/:id", handler("projectGroup", func(c *gin.Context) (interface{}, error) { return l.FindProject(c, c.Param("id")) }))
g.POST("/", handler("projectGroup", func(c *gin.Context) (interface{}, error) { group := models.ProjectGroup{} err := c.BindJSON(&group) if err != nil { return nil, slerrors.BadRequest("Invalid JSON") } if group.Abbreviation == "" || group.Name == "" { return nil, slerrors.BadRequest("Abbreviation and name cannot be left empty.") }
group.ID = generate.ProjectGroupID() group.UserID = auth.UserID(c) if group.CategoryNames == nil { group.CategoryNames = make(map[string]string) }
err = db.ProjectGroups().Insert(c.Request.Context(), group) if err != nil { return nil, err }
return &group, nil }))
g.PUT("/:id", handler("projectGroup", func(c *gin.Context) (interface{}, error) { update := models.ProjectGroupUpdate{} err := c.BindJSON(&update) if err != nil { return nil, slerrors.BadRequest("Invalid JSON") } if (update.Name != nil && *update.Name == "") || (update.Abbreviation != nil && *update.Abbreviation == "") { return nil, slerrors.BadRequest("Abbreviation and name cannot be left empty.") }
group, err := db.ProjectGroups().Find(c, c.Param("id")) if err != nil { return nil, err } if group.UserID != auth.UserID(c) { return nil, slerrors.NotFound("Project group") }
group.Update(update)
err = db.ProjectGroups().Update(c.Request.Context(), *group) if err != nil { return nil, err }
return group, nil }))
g.DELETE("/:id", handler("project", func(c *gin.Context) (interface{}, error) { group, err := l.FindProjectGroup(c.Request.Context(), c.Param("id")) if err != nil { return nil, err }
if len(group.Projects) > 0 { return nil, slerrors.Forbidden("You cannot delete non-empty project group.") }
err = db.ProjectGroups().Delete(c.Request.Context(), group.ProjectGroup) if err != nil { return nil, err }
return group, nil })) }
|