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.
143 lines
3.4 KiB
143 lines
3.4 KiB
package projects
|
|
|
|
import (
|
|
"git.aiterp.net/stufflog3/stufflog3/entities"
|
|
"git.aiterp.net/stufflog3/stufflog3/models"
|
|
"time"
|
|
)
|
|
|
|
type Entry struct {
|
|
ID int `json:"id"`
|
|
OwnerID string `json:"ownerId"`
|
|
CreatedTime time.Time `json:"createdTime"`
|
|
Name string `json:"name"`
|
|
Status models.Status `json:"status"`
|
|
}
|
|
|
|
func generateEntry(project entities.Project) Entry {
|
|
return Entry{
|
|
ID: project.ID,
|
|
OwnerID: project.OwnerID,
|
|
CreatedTime: project.CreatedTime,
|
|
Name: project.Name,
|
|
Status: project.Status,
|
|
}
|
|
}
|
|
|
|
type Result struct {
|
|
entities.Project
|
|
Requirements []ResultRequirement `json:"requirements"`
|
|
}
|
|
|
|
func GenerateResult(
|
|
project entities.Project,
|
|
requirement []entities.Requirement,
|
|
requirementStats []entities.RequirementStat,
|
|
items []entities.Item,
|
|
itemProgresses []entities.ItemProgress,
|
|
stats []entities.Stat,
|
|
) Result {
|
|
res := Result{
|
|
Project: project,
|
|
Requirements: make([]ResultRequirement, 0, 8),
|
|
}
|
|
|
|
for _, req := range requirement {
|
|
if req.ProjectID != project.ID {
|
|
continue
|
|
}
|
|
|
|
resReq := ResultRequirement{
|
|
ID: req.ID,
|
|
Name: req.Name,
|
|
Description: req.Description,
|
|
Status: req.Status,
|
|
Stats: make([]ResultRequirementStat, 0, 8),
|
|
Items: make([]ResultRequirementItem, 0, 8),
|
|
}
|
|
statIndices := make(map[int]int)
|
|
for _, reqStat := range requirementStats {
|
|
if reqStat.RequirementID != req.ID {
|
|
continue
|
|
}
|
|
|
|
resStat := ResultRequirementStat{
|
|
ID: reqStat.StatID,
|
|
Required: reqStat.Required,
|
|
}
|
|
for _, stat := range stats {
|
|
if stat.ID == resStat.ID {
|
|
resStat.Name = stat.Name
|
|
resStat.Weight = stat.Weight
|
|
break
|
|
}
|
|
}
|
|
|
|
resReq.Stats = append(resReq.Stats, resStat)
|
|
statIndices[reqStat.StatID] = len(resReq.Stats) - 1
|
|
}
|
|
|
|
for _, item := range items {
|
|
if item.ProjectRequirementID == nil || *item.ProjectRequirementID != req.ID {
|
|
continue
|
|
}
|
|
|
|
resItem := ResultRequirementItem{
|
|
Item: item,
|
|
Stats: make([]ResultRequirementStat, 0, 8),
|
|
}
|
|
for _, itemProgress := range itemProgresses {
|
|
if itemProgress.ItemID != item.ID {
|
|
continue
|
|
}
|
|
|
|
resStat := ResultRequirementStat{
|
|
ID: itemProgress.StatID,
|
|
Acquired: itemProgress.Acquired,
|
|
Required: itemProgress.Required,
|
|
}
|
|
for _, stat := range stats {
|
|
if stat.ID == resStat.ID {
|
|
resStat.Name = stat.Name
|
|
resStat.Weight = stat.Weight
|
|
break
|
|
}
|
|
}
|
|
if si, ok := statIndices[resStat.ID]; ok {
|
|
resReq.Stats[si].Acquired += itemProgress.Acquired
|
|
}
|
|
|
|
resItem.Stats = append(resItem.Stats, resStat)
|
|
}
|
|
|
|
resReq.Items = append(resReq.Items, resItem)
|
|
}
|
|
|
|
res.Requirements = append(res.Requirements, resReq)
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
type ResultRequirement struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
Status models.Status `json:"status"`
|
|
Stats []ResultRequirementStat `json:"stats"`
|
|
Items []ResultRequirementItem `json:"items"`
|
|
}
|
|
|
|
type ResultRequirementStat struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Weight float64 `json:"weight"`
|
|
Acquired int `json:"acquired"`
|
|
Required int `json:"required"`
|
|
}
|
|
|
|
type ResultRequirementItem struct {
|
|
entities.Item
|
|
|
|
Stats []ResultRequirementStat `json:"stats"`
|
|
}
|