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.
209 lines
5.3 KiB
209 lines
5.3 KiB
package httpapi
|
|
|
|
import (
|
|
"git.aiterp.net/stufflog3/stufflog3/entities"
|
|
"git.aiterp.net/stufflog3/stufflog3/models"
|
|
"git.aiterp.net/stufflog3/stufflog3/usecases/projects"
|
|
"github.com/gin-gonic/gin"
|
|
"strings"
|
|
)
|
|
|
|
func Projects(g *gin.RouterGroup, service *projects.Service) {
|
|
g.GET("", handler("projects", func(c *gin.Context) (interface{}, error) {
|
|
if tagsQuery := c.Query("tags"); tagsQuery != "" {
|
|
return service.ListByTags(c.Request.Context(), strings.Split(tagsQuery, ","))
|
|
} else {
|
|
return service.List(c.Request.Context())
|
|
}
|
|
}))
|
|
|
|
g.GET("/:project_id", handler("project", func(c *gin.Context) (interface{}, error) {
|
|
id, err := reqInt(c, "project_id")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return service.Find(c.Request.Context(), id)
|
|
}))
|
|
|
|
g.POST("", handler("project", func(c *gin.Context) (interface{}, error) {
|
|
input := entities.Project{}
|
|
err := c.BindJSON(&input)
|
|
if err != nil {
|
|
return nil, models.BadInputError{
|
|
Object: "Project",
|
|
Problem: "Invalid JSON: " + err.Error(),
|
|
}
|
|
}
|
|
|
|
return service.Create(c.Request.Context(), input)
|
|
}))
|
|
|
|
g.GET("/:project_id/requirements", handler("requirements", func(c *gin.Context) (interface{}, error) {
|
|
id, err := reqInt(c, "project_id")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
project, err := service.Find(c.Request.Context(), id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return project.Requirements, nil
|
|
}))
|
|
|
|
g.GET("/: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
|
|
}
|
|
|
|
project, err := service.Find(c.Request.Context(), projectID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
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 := struct {
|
|
models.RequirementUpdate
|
|
Stats []entities.RequirementStat `json:"stats"`
|
|
}{}
|
|
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.RequirementUpdate, input.Stats)
|
|
}))
|
|
|
|
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)
|
|
}))
|
|
}
|