|
|
@ -12,6 +12,17 @@ import ( |
|
|
|
"time" |
|
|
|
) |
|
|
|
|
|
|
|
func ItemsAllScopes(g *gin.RouterGroup, items *items.Service) { |
|
|
|
g.GET("", handler("items", func(c *gin.Context) (interface{}, error) { |
|
|
|
filter, err := getItemFilterFromQuery(c) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return items.ListAllScopes(c.Request.Context(), filter) |
|
|
|
})) |
|
|
|
} |
|
|
|
|
|
|
|
func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
g.GET("/:item_id", handler("project", func(c *gin.Context) (interface{}, error) { |
|
|
|
id, err := reqInt(c, "item_id") |
|
|
@ -23,12 +34,105 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
})) |
|
|
|
|
|
|
|
g.GET("", handler("items", func(c *gin.Context) (interface{}, error) { |
|
|
|
filter, err := getItemFilterFromQuery(c) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return items.ListScoped(c.Request.Context(), filter) |
|
|
|
})) |
|
|
|
|
|
|
|
g.POST("", handler("item", func(c *gin.Context) (interface{}, error) { |
|
|
|
input := struct { |
|
|
|
entities.Item |
|
|
|
Stats []entities.ItemStat `json:"stats"` |
|
|
|
}{} |
|
|
|
err := c.BindJSON(&input) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
Object: "Project", |
|
|
|
Problem: "Invalid JSON: " + err.Error(), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return items.Create(c.Request.Context(), input.Item, input.Stats) |
|
|
|
})) |
|
|
|
|
|
|
|
g.PUT("/:item_id", handler("item", func(c *gin.Context) (interface{}, error) { |
|
|
|
input := struct { |
|
|
|
models.ItemUpdate |
|
|
|
Stats []entities.ItemStat `json:"stats"` |
|
|
|
}{} |
|
|
|
err := c.BindJSON(&input) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
Object: "Project", |
|
|
|
Problem: "Invalid JSON: " + err.Error(), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
id, err := reqInt(c, "item_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return items.Update(c.Request.Context(), id, input.ItemUpdate, input.Stats) |
|
|
|
})) |
|
|
|
|
|
|
|
g.PUT("/:item_id/stats/:stat_id", handler("item", func(c *gin.Context) (interface{}, error) { |
|
|
|
input := entities.ItemStat{} |
|
|
|
err := c.BindJSON(&input) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
Object: "Project", |
|
|
|
Problem: "Invalid JSON: " + err.Error(), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
itemID, err := reqInt(c, "item_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
statID, err := reqInt(c, "stat_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
input.StatID = statID |
|
|
|
|
|
|
|
return items.UpdateStat(c.Request.Context(), itemID, input) |
|
|
|
})) |
|
|
|
|
|
|
|
g.DELETE("/:item_id/stats/:stat_id", handler("item", func(c *gin.Context) (interface{}, error) { |
|
|
|
itemID, err := reqInt(c, "item_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
statID, err := reqInt(c, "stat_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return items.DeleteStat(c.Request.Context(), itemID, statID) |
|
|
|
})) |
|
|
|
|
|
|
|
g.DELETE("/:item_id", handler("item", func(c *gin.Context) (interface{}, error) { |
|
|
|
id, err := reqInt(c, "item_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return items.Delete(c.Request.Context(), id) |
|
|
|
})) |
|
|
|
} |
|
|
|
|
|
|
|
func getItemFilterFromQuery(c *gin.Context) (models.ItemFilter, error) { |
|
|
|
filter := models.ItemFilter{} |
|
|
|
|
|
|
|
if rawFilter := c.Query("filter"); rawFilter != "" { |
|
|
|
err := json.Unmarshal([]byte(rawFilter), &filter) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Query", |
|
|
|
Field: "filter", |
|
|
|
Problem: "Invalid raw filter: " + err.Error(), |
|
|
@ -45,7 +149,7 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
if queryScheduledMin != "" && queryScheduledMax != "" { |
|
|
|
min, err := models.ParseDate(queryScheduledMin) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Query", |
|
|
|
Field: "scheduledMin", |
|
|
|
Problem: "Invalid from date: " + err.Error(), |
|
|
@ -53,7 +157,7 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
} |
|
|
|
max, err := models.ParseDate(queryScheduledMax) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Query", |
|
|
|
Field: "scheduledMax", |
|
|
|
Problem: "Invalid to date: " + err.Error(), |
|
|
@ -68,7 +172,7 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
if queryCreatedMin != "" && queryCreatedMax != "" { |
|
|
|
min, err := time.Parse(time.RFC3339, queryCreatedMin) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Query", |
|
|
|
Field: "createdMin", |
|
|
|
Problem: "Invalid from date: " + err.Error(), |
|
|
@ -76,7 +180,7 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
} |
|
|
|
max, err := time.Parse(time.RFC3339, queryCreatedMax) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Query", |
|
|
|
Field: "createdMax", |
|
|
|
Problem: "Invalid to date: " + err.Error(), |
|
|
@ -91,7 +195,7 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
if queryAcquiredMin != "" && queryAcquiredMax != "" { |
|
|
|
min, err := time.Parse(time.RFC3339, queryAcquiredMin) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Query", |
|
|
|
Field: "acquiredMin", |
|
|
|
Problem: "Invalid from date: " + err.Error(), |
|
|
@ -99,7 +203,7 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
} |
|
|
|
max, err := time.Parse(time.RFC3339, queryAcquiredMax) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Query", |
|
|
|
Field: "acquiredMax", |
|
|
|
Problem: "Invalid to date: " + err.Error(), |
|
|
@ -114,7 +218,7 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
if anyDateMin != "" && anyDateMax != "" { |
|
|
|
min, err := time.Parse(time.RFC3339, anyDateMin) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Query", |
|
|
|
Field: "anyDateMin", |
|
|
|
Problem: "Invalid from date: " + err.Error(), |
|
|
@ -122,7 +226,7 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
} |
|
|
|
max, err := time.Parse(time.RFC3339, anyDateMax) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Query", |
|
|
|
Field: "anyDateMax", |
|
|
|
Problem: "Invalid to date: " + err.Error(), |
|
|
@ -145,7 +249,7 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
for _, id := range ids { |
|
|
|
parsed, err := strconv.Atoi(id) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Query", |
|
|
|
Field: fmt.Sprintf("projectId[%d]", len(filter.ProjectIDs)), |
|
|
|
Problem: "Invalid number", |
|
|
@ -162,7 +266,7 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
for _, id := range ids { |
|
|
|
parsed, err := strconv.Atoi(id) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Query", |
|
|
|
Field: fmt.Sprintf("requirementId[%d]", len(filter.RequirementIDs)), |
|
|
|
Problem: "Invalid number", |
|
|
@ -181,7 +285,7 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
for _, id := range ids { |
|
|
|
parsed, err := strconv.Atoi(id) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Query", |
|
|
|
Field: fmt.Sprintf("statId[%d]", len(filter.StatIDs)), |
|
|
|
Problem: "Invalid number", |
|
|
@ -193,110 +297,26 @@ func Items(g *gin.RouterGroup, items *items.Service) { |
|
|
|
} |
|
|
|
|
|
|
|
if filter.ScheduledDate != nil && !filter.ScheduledDate.Valid() { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Filter", |
|
|
|
Field: "scheduledDate", |
|
|
|
Problem: "Invalid scheduled date range", |
|
|
|
} |
|
|
|
} |
|
|
|
if filter.CreatedTime != nil && !filter.CreatedTime.Valid() { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Filter", |
|
|
|
Field: "createdTime", |
|
|
|
Problem: "Invalid created time range", |
|
|
|
} |
|
|
|
} |
|
|
|
if filter.AcquiredTime != nil && !filter.AcquiredTime.Valid() { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
return models.ItemFilter{}, models.BadInputError{ |
|
|
|
Object: "Filter", |
|
|
|
Field: "acquiredTime", |
|
|
|
Problem: "Invalid created time range", |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return items.ListScoped(c.Request.Context(), filter) |
|
|
|
})) |
|
|
|
|
|
|
|
g.POST("", handler("item", func(c *gin.Context) (interface{}, error) { |
|
|
|
input := struct { |
|
|
|
entities.Item |
|
|
|
Stats []entities.ItemStat `json:"stats"` |
|
|
|
}{} |
|
|
|
err := c.BindJSON(&input) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
Object: "Project", |
|
|
|
Problem: "Invalid JSON: " + err.Error(), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return items.Create(c.Request.Context(), input.Item, input.Stats) |
|
|
|
})) |
|
|
|
|
|
|
|
g.PUT("/:item_id", handler("item", func(c *gin.Context) (interface{}, error) { |
|
|
|
input := struct { |
|
|
|
models.ItemUpdate |
|
|
|
Stats []entities.ItemStat `json:"stats"` |
|
|
|
}{} |
|
|
|
err := c.BindJSON(&input) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
Object: "Project", |
|
|
|
Problem: "Invalid JSON: " + err.Error(), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
id, err := reqInt(c, "item_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return items.Update(c.Request.Context(), id, input.ItemUpdate, input.Stats) |
|
|
|
})) |
|
|
|
|
|
|
|
g.PUT("/:item_id/stats/:stat_id", handler("item", func(c *gin.Context) (interface{}, error) { |
|
|
|
input := entities.ItemStat{} |
|
|
|
err := c.BindJSON(&input) |
|
|
|
if err != nil { |
|
|
|
return nil, models.BadInputError{ |
|
|
|
Object: "Project", |
|
|
|
Problem: "Invalid JSON: " + err.Error(), |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
itemID, err := reqInt(c, "item_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
statID, err := reqInt(c, "stat_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
input.StatID = statID |
|
|
|
|
|
|
|
return items.UpdateStat(c.Request.Context(), itemID, input) |
|
|
|
})) |
|
|
|
|
|
|
|
g.DELETE("/:item_id/stats/:stat_id", handler("item", func(c *gin.Context) (interface{}, error) { |
|
|
|
itemID, err := reqInt(c, "item_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
statID, err := reqInt(c, "stat_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return items.DeleteStat(c.Request.Context(), itemID, statID) |
|
|
|
})) |
|
|
|
|
|
|
|
g.DELETE("/:item_id", handler("item", func(c *gin.Context) (interface{}, error) { |
|
|
|
id, err := reqInt(c, "item_id") |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return items.Delete(c.Request.Context(), id) |
|
|
|
})) |
|
|
|
return filter, nil |
|
|
|
} |