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.
66 lines
1.3 KiB
66 lines
1.3 KiB
package items
|
|
|
|
import (
|
|
"context"
|
|
"git.aiterp.net/stufflog3/stufflog3/models"
|
|
"git.aiterp.net/stufflog3/stufflog3/usecases/scopes"
|
|
"git.aiterp.net/stufflog3/stufflog3/usecases/stats"
|
|
)
|
|
|
|
type Service struct {
|
|
Scopes *scopes.Service
|
|
Stats *stats.Service
|
|
Repository Repository
|
|
}
|
|
|
|
func (s *Service) ListScoped(ctx context.Context, filter models.ItemFilter) ([]Result, error) {
|
|
sc := s.Scopes.Context(ctx)
|
|
if sc == nil {
|
|
return nil, models.PermissionDeniedError{}
|
|
}
|
|
|
|
if filter.ScopeIDs != nil {
|
|
userScopes, err := sc.Scopes(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, id := range filter.ScopeIDs {
|
|
found := false
|
|
for _, scope := range userScopes {
|
|
if scope.ID == id {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if !found {
|
|
return nil, models.ForbiddenError("Scope you do not belong to found in filter scope IDs.")
|
|
}
|
|
}
|
|
} else {
|
|
filter.ScopeIDs = []int{sc.ID}
|
|
}
|
|
|
|
items, err := s.Repository.Fetch(ctx, filter)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
progresses, err := s.Repository.ListProgress(ctx, items...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
scopeStats, err := sc.Stats(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
res := make([]Result, 0, len(items))
|
|
for _, item := range items {
|
|
res = append(res, generateResult(item, progresses, scopeStats))
|
|
}
|
|
|
|
return res, nil
|
|
}
|