|
|
@ -2,13 +2,13 @@ package httpapi |
|
|
|
|
|
|
|
import ( |
|
|
|
"git.aiterp.net/stufflog3/stufflog3/entities" |
|
|
|
"git.aiterp.net/stufflog3/stufflog3/internal/genutils" |
|
|
|
"git.aiterp.net/stufflog3/stufflog3/models" |
|
|
|
"git.aiterp.net/stufflog3/stufflog3/usecases/projects" |
|
|
|
"github.com/gin-gonic/gin" |
|
|
|
) |
|
|
|
|
|
|
|
func Projects(g *gin.RouterGroup, service *projects.Service) { |
|
|
|
|
|
|
|
g.GET("", handler("projects", func(c *gin.Context) (interface{}, error) { |
|
|
|
return service.List(c.Request.Context()) |
|
|
|
})) |
|
|
@ -50,27 +50,153 @@ func Projects(g *gin.RouterGroup, service *projects.Service) { |
|
|
|
})) |
|
|
|
|
|
|
|
g.GET("/:project_id/requirements/:requirement_id", handler("requirements", func(c *gin.Context) (interface{}, error) { |
|
|
|
id, err := reqInt(c, "project_id") |
|
|
|
projectID, err := reqInt(c, "project_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
reqID, err := reqInt(c, "requirement_id") |
|
|
|
requirementID, err := reqInt(c, "requirement_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
project, err := service.Find(c.Request.Context(), id) |
|
|
|
project, err := service.Find(c.Request.Context(), projectID) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
req := genutils.Find(project.Requirements, func(r projects.RequirementResult) bool { |
|
|
|
return r.ID == reqID |
|
|
|
}) |
|
|
|
if err == nil { |
|
|
|
req := project.Requirement(requirementID) |
|
|
|
if req == nil { |
|
|
|
return nil, models.NotFoundError("Requirement") |
|
|
|
} |
|
|
|
|
|
|
|
return req, nil |
|
|
|
})) |
|
|
|
|
|
|
|
g.POST("/:project_id/requirements", handler("requirement", func(c *gin.Context) (interface{}, error) { |
|
|
|
input := struct { |
|
|
|
entities.Requirement |
|
|
|
Stats []entities.RequirementStat `json:"stats"` |
|
|
|
}{} |
|
|
|
err := c.BindJSON(&input) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
Object: "Requirement", |
|
|
|
Problem: "Invalid JSON: " + err.Error(), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
id, err := reqInt(c, "project_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return service.CreateRequirement(c.Request.Context(), id, input.Requirement, input.Stats) |
|
|
|
})) |
|
|
|
|
|
|
|
g.PUT("/:project_id/requirements/:requirement_id", handler("requirement", func(c *gin.Context) (interface{}, error) { |
|
|
|
input := models.RequirementUpdate{} |
|
|
|
err := c.BindJSON(&input) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
Object: "RequirementUpdate", |
|
|
|
Problem: "Invalid JSON: " + err.Error(), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
projectID, err := reqInt(c, "project_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
requirementID, err := reqInt(c, "requirement_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return service.UpdateRequirement(c.Request.Context(), projectID, requirementID, input) |
|
|
|
})) |
|
|
|
|
|
|
|
g.PUT("/:project_id/requirements/:requirement_id/stats/:stat_id", handler("requirement", func(c *gin.Context) (interface{}, error) { |
|
|
|
input := entities.RequirementStat{} |
|
|
|
err := c.BindJSON(&input) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
Object: "RequirementStat", |
|
|
|
Problem: "Invalid JSON: " + err.Error(), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
projectID, err := reqInt(c, "project_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
requirementID, err := reqInt(c, "requirement_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
statID, err := reqInt(c, "stat_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
input.StatID = statID |
|
|
|
|
|
|
|
return service.UpsertRequirementStat(c.Request.Context(), projectID, requirementID, input) |
|
|
|
})) |
|
|
|
|
|
|
|
g.DELETE("/:project_id/requirements/:requirement_id/stats/:stat_id", handler("requirement", func(c *gin.Context) (interface{}, error) { |
|
|
|
projectID, err := reqInt(c, "project_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
requirementID, err := reqInt(c, "requirement_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
statID, err := reqInt(c, "stat_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return service.DeleteRequirementStat(c.Request.Context(), projectID, requirementID, statID) |
|
|
|
})) |
|
|
|
|
|
|
|
g.DELETE("/:project_id/requirements/:requirement_id", handler("requirement", func(c *gin.Context) (interface{}, error) { |
|
|
|
projectID, err := reqInt(c, "project_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
requirementID, err := reqInt(c, "requirement_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return service.DeleteRequirement(c.Request.Context(), projectID, requirementID) |
|
|
|
})) |
|
|
|
|
|
|
|
g.PUT("/:project_id", handler("project", func(c *gin.Context) (interface{}, error) { |
|
|
|
input := models.ProjectUpdate{} |
|
|
|
err := c.BindJSON(&input) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
Object: "ProjectUpdate", |
|
|
|
Problem: "Invalid JSON: " + err.Error(), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
id, err := reqInt(c, "project_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return service.Update(c.Request.Context(), id, input) |
|
|
|
})) |
|
|
|
|
|
|
|
g.DELETE("/:project_id", handler("project", func(c *gin.Context) (interface{}, error) { |
|
|
|
id, err := reqInt(c, "project_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return service.Delete(c.Request.Context(), id) |
|
|
|
})) |
|
|
|
} |