Browse Source

fix endpoints for listing requirements.

master
Gisle Aune 1 year ago
parent
commit
fefb1b5e46
  1. 23
      ports/mysql/projects.go
  2. 2
      usecases/projects/repository.go
  3. 49
      usecases/projects/result.go
  4. 7
      usecases/projects/service.go

23
ports/mysql/projects.go

@ -422,18 +422,33 @@ func (r *projectRepository) FetchRequirements(ctx context.Context, scopeID int,
return requirements, stats, nil
}
func (r *projectRepository) ListRequirementsByScope(ctx context.Context, scopeID int) ([]entities.Requirement, []entities.RequirementStat, error) {
func (r *projectRepository) ListRequirementsByScope(ctx context.Context, scopeID int) ([]entities.Requirement, []entities.RequirementStat, []entities.Project, error) {
reqRows, err := r.q.ListProjectRequirementsByScopeID(ctx, scopeID)
if err != nil && err != sql.ErrNoRows {
return nil, nil, err
return nil, nil, nil, err
}
statsRows, err := r.q.ListProjectRequirementsStatsByScopeID(ctx, scopeID)
if err != nil && err != sql.ErrNoRows {
return nil, nil, err
return nil, nil, nil, err
}
return r.fillRequirements(ctx, reqRows, statsRows)
ids := genutils.Set[int]{}
for _, reqRow := range reqRows {
ids.Add(reqRow.ProjectID)
}
projects, err := r.FetchProjects(ctx, scopeID, ids.Values()...)
if err != nil && err != sql.ErrNoRows {
return nil, nil, nil, err
}
req, stats, err := r.fillRequirements(ctx, reqRows, statsRows)
if err != nil {
return nil, nil, nil, err
}
return req, stats, projects, err
}
func (r *projectRepository) ListRequirements(ctx context.Context, projectID int) ([]entities.Requirement, []entities.RequirementStat, error) {

2
usecases/projects/repository.go

@ -15,7 +15,7 @@ type Repository interface {
Update(ctx context.Context, project entities.Project, update models.ProjectUpdate) error
Delete(ctx context.Context, project entities.Project) error
FetchRequirements(ctx context.Context, scopeID int, requirementIDs ...int) ([]entities.Requirement, []entities.RequirementStat, error)
ListRequirementsByScope(ctx context.Context, scopeID int) ([]entities.Requirement, []entities.RequirementStat, error)
ListRequirementsByScope(ctx context.Context, scopeID int) ([]entities.Requirement, []entities.RequirementStat, []entities.Project, error)
ListRequirements(ctx context.Context, projectID int) ([]entities.Requirement, []entities.RequirementStat, error)
CreateRequirement(ctx context.Context, requirement entities.Requirement) (*entities.Requirement, error)
UpdateRequirement(ctx context.Context, requirement entities.Requirement, update models.RequirementUpdate) error

49
usecases/projects/result.go

@ -55,23 +55,30 @@ func (r *Result) Requirement(id int) *RequirementResult {
}
type RequirementResult struct {
ID int `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Status models.Status `json:"status"`
StatusName string `json:"statusName"`
TotalAcquired float64 `json:"totalAcquired"`
TotalRequired float64 `json:"totalRequired"`
TotalPlanned float64 `json:"totalPlanned"`
IsCoarse bool `json:"isCoarse"`
AggregateRequired int `json:"aggregateRequired"`
Stats []RequirementResultStat `json:"stats"`
Items []items.Result `json:"items,omitempty"`
Tags []string `json:"tags"`
ID int `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Status models.Status `json:"status"`
StatusName string `json:"statusName"`
TotalAcquired float64 `json:"totalAcquired"`
TotalRequired float64 `json:"totalRequired"`
TotalPlanned float64 `json:"totalPlanned"`
IsCoarse bool `json:"isCoarse"`
AggregateRequired int `json:"aggregateRequired"`
Stats []RequirementResultStat `json:"stats"`
Items []items.Result `json:"items,omitempty"`
Tags []string `json:"tags"`
Project *RequirementResultProject `json:"project,omitempty"`
Requirement entities.Requirement `json:"-"`
}
type RequirementResultProject struct {
ID int `json:"id"`
ScopeID int `json:"scopeId"`
Name string `json:"name"`
}
func (r *RequirementResult) Stat(id int) *RequirementResultStat {
for _, stat := range r.Stats {
if stat.ID == id {
@ -137,7 +144,7 @@ func generateResult(
continue
}
resReq := generateRequirementResult(req, scope, requirementStats, projectItems)
resReq := generateRequirementResult(req, scope, requirementStats, projectItems, nil)
res.TotalRequired += resReq.TotalRequired
res.TotalPlanned += resReq.TotalPlanned
@ -163,7 +170,7 @@ func generateResult(
return &res
}
func generateRequirementResult(req entities.Requirement, scope scopes.Result, requirementStats []entities.RequirementStat, projectItems []items.Result) RequirementResult {
func generateRequirementResult(req entities.Requirement, scope scopes.Result, requirementStats []entities.RequirementStat, projectItems []items.Result, projects []entities.Project) RequirementResult {
resReq := RequirementResult{
ID: req.ID,
Name: req.Name,
@ -287,5 +294,17 @@ func generateRequirementResult(req entities.Requirement, scope scopes.Result, re
resReq.Items = nil
}
for _, project := range projects {
if project.ID == req.ProjectID {
resReq.Project = &RequirementResultProject{
ID: project.ID,
ScopeID: project.ScopeID,
Name: project.Name,
}
break
}
}
return resReq
}

7
usecases/projects/service.go

@ -91,7 +91,7 @@ func (s *Service) ListRequirements(ctx context.Context) ([]RequirementResult, er
}
func (s *Service) listRequirements(ctx context.Context, sc scopes.Result) ([]RequirementResult, error) {
requirements, requirementStats, err := s.Repository.ListRequirementsByScope(ctx, sc.ID)
requirements, requirementStats, projects, err := s.Repository.ListRequirementsByScope(ctx, sc.ID)
if err != nil {
return nil, err
}
@ -103,6 +103,7 @@ func (s *Service) listRequirements(ctx context.Context, sc scopes.Result) ([]Req
sc,
requirementStats,
nil,
projects,
))
}
@ -145,6 +146,7 @@ func (s *Service) FetchRequirements(ctx context.Context, ids ...int) ([]Requirem
sc.Scope,
requirementStats,
items,
nil,
))
}
@ -238,7 +240,7 @@ func (s *Service) FindRequirement(ctx context.Context, id int) (*RequirementResu
return nil, err
}
return genutils.Ptr(generateRequirementResult(req[0], scope, reqStats, reqItems)), nil
return genutils.Ptr(generateRequirementResult(req[0], scope, reqStats, reqItems, nil)), nil
}
func (s *Service) CreateRequirement(ctx context.Context, id int, requirement entities.Requirement, stats []entities.RequirementStat) (*RequirementResult, error) {
@ -301,6 +303,7 @@ func (s *Service) CreateRequirement(ctx context.Context, id int, requirement ent
scope,
goodStats,
[]items.Result{},
nil,
)
return &result, nil

Loading…
Cancel
Save