add project groups to backend.
This commit is contained in:
@@ -8,6 +8,7 @@ import (
|
||||
"github.com/gissleh/stufflog/internal/slerrors"
|
||||
"github.com/gissleh/stufflog/models"
|
||||
"github.com/gissleh/stufflog/services"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -30,6 +31,12 @@ func Project(g *gin.RouterGroup, db database.Database) {
|
||||
favorite := setting == "true"
|
||||
filter.Favorite = &favorite
|
||||
}
|
||||
if setting := c.Query("ungrouped"); setting != "" {
|
||||
filter.Ungrouped = setting == "true"
|
||||
}
|
||||
if setting := c.Query("groups"); setting != "" {
|
||||
filter.ProjectGroupIDs = strings.Split(setting, ",")
|
||||
}
|
||||
|
||||
return l.ListProjects(c, filter)
|
||||
}))
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
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
|
||||
}))
|
||||
}
|
||||
Reference in New Issue
Block a user