add logging and a lot of loaders.
This commit is contained in:
@@ -94,7 +94,9 @@ func (r *issueResolver) Items(ctx context.Context, obj *models.Issue, filter *mo
|
||||
}
|
||||
|
||||
func (r *issueResolver) Logs(ctx context.Context, obj *models.Issue) ([]*models.Log, error) {
|
||||
logs, err := r.Database.Logs().List(ctx, models.LogFilter{IssueIDs: []string{obj.ID}})
|
||||
loader := loaders.LogsByIssueLoaderFromContext(ctx)
|
||||
|
||||
logs, err := loader.Load(obj.ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -5,14 +5,14 @@ package resolvers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"git.aiterp.net/stufflog/server/graph/loaders"
|
||||
|
||||
"git.aiterp.net/stufflog/server/graph/graphcore"
|
||||
"git.aiterp.net/stufflog/server/models"
|
||||
)
|
||||
|
||||
func (r *issueItemResolver) Issue(ctx context.Context, obj *models.IssueItem) (*models.Issue, error) {
|
||||
return r.Database.Issues().Find(ctx, obj.IssueID)
|
||||
return loaders.IssueLoaderFromContext(ctx).Load(obj.IssueID)
|
||||
}
|
||||
|
||||
func (r *issueItemResolver) Item(ctx context.Context, obj *models.IssueItem) (*models.Item, error) {
|
||||
@@ -24,21 +24,23 @@ func (r *issueItemResolver) Remaining(ctx context.Context, obj *models.IssueItem
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
// TODO: Use logs
|
||||
return obj.Quantity, nil
|
||||
loader := loaders.LogsByIssueLoaderFromContext(ctx)
|
||||
logs, err := loader.Load(obj.IssueID)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
remaining := obj.Quantity
|
||||
for _, log := range logs {
|
||||
if item := log.Item(obj.ID); item != nil {
|
||||
remaining -= item.Amount
|
||||
}
|
||||
}
|
||||
|
||||
return remaining, nil
|
||||
}
|
||||
|
||||
// IssueItem returns graphcore.IssueItemResolver implementation.
|
||||
func (r *Resolver) IssueItem() graphcore.IssueItemResolver { return &issueItemResolver{r} }
|
||||
|
||||
type issueItemResolver struct{ *Resolver }
|
||||
|
||||
// !!! WARNING !!!
|
||||
// The code below was going to be deleted when updating resolvers. It has been copied here so you have
|
||||
// one last chance to move it out of harms way if you want. There are two reasons this happens:
|
||||
// - When renaming or deleting a resolver the old code will be put in here. You can safely delete
|
||||
// it when you're done.
|
||||
// - You have helper methods in this file. Move them out to keep these resolver files clean.
|
||||
func (r *issueItemResolver) Quanity(ctx context.Context, obj *models.IssueItem) (int, error) {
|
||||
panic(fmt.Errorf("not implemented"))
|
||||
}
|
||||
|
||||
@@ -6,19 +6,19 @@ package resolvers
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.aiterp.net/stufflog/server/graph/graphcore"
|
||||
"git.aiterp.net/stufflog/server/graph/graphutil"
|
||||
"git.aiterp.net/stufflog/server/graph/loaders"
|
||||
"git.aiterp.net/stufflog/server/internal/slerrors"
|
||||
"git.aiterp.net/stufflog/server/models"
|
||||
)
|
||||
|
||||
func (r *issueTaskResolver) EstimatedUnits(ctx context.Context, obj *models.IssueTask) (*int, error) {
|
||||
// TODO: Data loader
|
||||
activity, err := r.Database.Activities().Find(ctx, obj.ActivityID)
|
||||
activity, err := loaders.ActivityLoaderFromContext(ctx).Load(obj.ActivityID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -30,11 +30,11 @@ func (r *issueTaskResolver) EstimatedUnits(ctx context.Context, obj *models.Issu
|
||||
}
|
||||
|
||||
func (r *issueTaskResolver) Issue(ctx context.Context, obj *models.IssueTask) (*models.Issue, error) {
|
||||
return r.Database.Issues().Find(ctx, obj.IssueID)
|
||||
return loaders.IssueLoaderFromContext(ctx).Load(obj.IssueID)
|
||||
}
|
||||
|
||||
func (r *issueTaskResolver) Activity(ctx context.Context, obj *models.IssueTask) (*models.Activity, error) {
|
||||
return r.Database.Activities().Find(ctx, obj.ActivityID)
|
||||
return loaders.ActivityLoaderFromContext(ctx).Load(obj.ActivityID)
|
||||
}
|
||||
|
||||
func (r *issueTaskResolver) Status(ctx context.Context, obj *models.IssueTask) (*models.ProjectStatus, error) {
|
||||
@@ -79,11 +79,45 @@ func (r *issueTaskResolver) Status(ctx context.Context, obj *models.IssueTask) (
|
||||
}
|
||||
|
||||
func (r *issueTaskResolver) RemainingTime(ctx context.Context, obj *models.IssueTask) (time.Duration, error) {
|
||||
panic(fmt.Errorf("not implemented"))
|
||||
loader := loaders.LogsByIssueLoaderFromContext(ctx)
|
||||
logs, err := loader.Load(obj.IssueID)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
remaining := obj.EstimatedTime
|
||||
for _, log := range logs {
|
||||
if task := log.Task(obj.ID); task != nil {
|
||||
remaining -= task.Duration
|
||||
}
|
||||
}
|
||||
|
||||
return remaining, nil
|
||||
}
|
||||
|
||||
func (r *issueTaskResolver) RemainingUnits(ctx context.Context, obj *models.IssueTask) (*int, error) {
|
||||
panic(fmt.Errorf("not implemented"))
|
||||
activity, err := loaders.ActivityLoaderFromContext(ctx).Load(obj.ActivityID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !activity.Countable || activity.UnitIsTimeSpent {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
loader := loaders.LogsByIssueLoaderFromContext(ctx)
|
||||
logs, err := loader.Load(obj.IssueID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
remaining := obj.EstimatedUnits
|
||||
for _, log := range logs {
|
||||
if task := log.Task(obj.ID); task != nil && task.Units != nil {
|
||||
remaining -= *task.Units
|
||||
}
|
||||
}
|
||||
|
||||
return &remaining, nil
|
||||
}
|
||||
|
||||
// IssueTask returns graphcore.IssueTaskResolver implementation.
|
||||
|
||||
@@ -5,6 +5,7 @@ package resolvers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.aiterp.net/stufflog/server/graph/loaders"
|
||||
|
||||
"git.aiterp.net/stufflog/server/graph/graphcore"
|
||||
"git.aiterp.net/stufflog/server/models"
|
||||
@@ -15,7 +16,7 @@ func (r *logResolver) User(ctx context.Context, obj *models.Log) (*models.User,
|
||||
}
|
||||
|
||||
func (r *logItemResolver) Issue(ctx context.Context, obj *models.LogItem) (*models.Issue, error) {
|
||||
return r.Database.Issues().Find(ctx, obj.IssueID)
|
||||
return loaders.IssueLoaderFromContext(ctx).Load(obj.IssueID)
|
||||
}
|
||||
|
||||
func (r *logItemResolver) Item(ctx context.Context, obj *models.LogItem) (*models.IssueItem, error) {
|
||||
@@ -23,7 +24,7 @@ func (r *logItemResolver) Item(ctx context.Context, obj *models.LogItem) (*model
|
||||
}
|
||||
|
||||
func (r *logTaskResolver) Issue(ctx context.Context, obj *models.LogTask) (*models.Issue, error) {
|
||||
return r.Database.Issues().Find(ctx, obj.IssueID)
|
||||
return loaders.IssueLoaderFromContext(ctx).Load(obj.IssueID)
|
||||
}
|
||||
|
||||
func (r *logTaskResolver) Task(ctx context.Context, obj *models.LogTask) (*models.IssueTask, error) {
|
||||
|
||||
@@ -6,6 +6,7 @@ package resolvers
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"git.aiterp.net/stufflog/server/graph/loaders"
|
||||
"log"
|
||||
"sort"
|
||||
"time"
|
||||
@@ -59,7 +60,7 @@ func (r *mutationResolver) CreateActivity(ctx context.Context, input graphcore.A
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if perm, err := r.Auth.ProjectPermission(ctx, *project); err != nil || !perm.CanManageActivities() {
|
||||
if perm, err := r.Auth.ProjectPermission(ctx, project.ID); err != nil || !perm.CanManageActivities() {
|
||||
return nil, slerrors.PermissionDenied
|
||||
}
|
||||
|
||||
@@ -101,7 +102,7 @@ func (r *mutationResolver) EditActivity(ctx context.Context, input graphcore.Act
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if perm, err := r.Auth.ProjectPermission(ctx, *project); err != nil || !perm.CanManageActivities() {
|
||||
if perm, err := r.Auth.ProjectPermission(ctx, project.ID); err != nil || !perm.CanManageActivities() {
|
||||
return nil, slerrors.PermissionDenied
|
||||
}
|
||||
|
||||
@@ -261,7 +262,7 @@ func (r *mutationResolver) CreateIssue(ctx context.Context, input graphcore.Issu
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if perm, err := r.Auth.ProjectPermission(ctx, *project); err != nil || !perm.CanManageOwnIssue() {
|
||||
if perm, err := r.Auth.ProjectPermission(ctx, project.ID); err != nil || !perm.CanManageOwnIssue() {
|
||||
return nil, slerrors.PermissionDenied
|
||||
}
|
||||
|
||||
@@ -295,6 +296,8 @@ func (r *mutationResolver) CreateIssue(ctx context.Context, input graphcore.Issu
|
||||
return nil, err
|
||||
}
|
||||
|
||||
loaders.IssueLoaderFromContext(ctx).Prime(issue.ID, issue)
|
||||
|
||||
return issue, nil
|
||||
}
|
||||
|
||||
@@ -304,7 +307,7 @@ func (r *mutationResolver) CreateIssueTask(ctx context.Context, input graphcore.
|
||||
return nil, slerrors.PermissionDenied
|
||||
}
|
||||
|
||||
issue, err := r.Database.Issues().Find(ctx, input.IssueID)
|
||||
issue, err := loaders.IssueLoaderFromContext(ctx).Load(input.IssueID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -317,7 +320,7 @@ func (r *mutationResolver) CreateIssueTask(ctx context.Context, input graphcore.
|
||||
return nil, err
|
||||
}
|
||||
|
||||
activity, err := r.Database.Activities().Find(ctx, input.ActivityID)
|
||||
activity, err := loaders.ActivityLoaderFromContext(ctx).Load(input.ActivityID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if activity.ProjectID != issue.ProjectID {
|
||||
@@ -361,7 +364,7 @@ func (r *mutationResolver) EditIssueTask(ctx context.Context, input graphcore.Is
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issue, err := r.Database.Issues().Find(ctx, task.IssueID)
|
||||
issue, err := loaders.IssueLoaderFromContext(ctx).Load(task.IssueID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -382,7 +385,7 @@ func (r *mutationResolver) EditIssueTask(ctx context.Context, input graphcore.Is
|
||||
task.EstimatedTime = *input.SetEstimatedTime
|
||||
}
|
||||
if input.SetEstimatedUnits != nil {
|
||||
activity, err := r.Database.Activities().Find(ctx, task.ActivityID)
|
||||
activity, err := loaders.ActivityLoaderFromContext(ctx).Load(task.ActivityID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -418,7 +421,7 @@ func (r *mutationResolver) CreateIssueItem(ctx context.Context, input graphcore.
|
||||
return nil, slerrors.PermissionDenied
|
||||
}
|
||||
|
||||
issue, err := r.Database.Issues().Find(ctx, input.IssueID)
|
||||
issue, err := loaders.IssueLoaderFromContext(ctx).Load(input.IssueID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -452,7 +455,7 @@ func (r *mutationResolver) EditIssueItem(ctx context.Context, input graphcore.Is
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issue, err := r.Database.Issues().Find(ctx, item.IssueID)
|
||||
issue, err := loaders.IssueLoaderFromContext(ctx).Load(item.IssueID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -495,7 +498,7 @@ func (r *mutationResolver) CreateLog(ctx context.Context, input graphcore.LogCre
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issue, err := r.Database.Issues().Find(ctx, item.IssueID)
|
||||
issue, err := loaders.IssueLoaderFromContext(ctx).Load(item.IssueID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -516,7 +519,7 @@ func (r *mutationResolver) CreateLog(ctx context.Context, input graphcore.LogCre
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issue, err := r.Database.Issues().Find(ctx, task.IssueID)
|
||||
issue, err := loaders.IssueLoaderFromContext(ctx).Load(task.IssueID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -583,7 +586,7 @@ func (r *mutationResolver) EditLog(ctx context.Context, input graphcore.LogEditI
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issue, err := r.Database.Issues().Find(ctx, item.IssueID)
|
||||
issue, err := loaders.IssueLoaderFromContext(ctx).Load(item.IssueID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -605,7 +608,7 @@ func (r *mutationResolver) EditLog(ctx context.Context, input graphcore.LogEditI
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issue, err := r.Database.Issues().Find(ctx, task.IssueID)
|
||||
issue, err := loaders.IssueLoaderFromContext(ctx).Load(task.IssueID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ func (r *projectResolver) Issues(ctx context.Context, obj *models.Project, filte
|
||||
filter = &graphcore.ProjectIssueFilter{}
|
||||
}
|
||||
|
||||
return r.Database.Issues().List(ctx, models.IssueFilter{
|
||||
issues, err := r.Database.Issues().List(ctx, models.IssueFilter{
|
||||
ProjectIDs: []string{obj.ID},
|
||||
AssigneeIDs: filter.AssigneeIds,
|
||||
Search: filter.Search,
|
||||
@@ -25,10 +25,20 @@ func (r *projectResolver) Issues(ctx context.Context, obj *models.Project, filte
|
||||
MaxStage: filter.MaxStage,
|
||||
Limit: filter.Limit,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
loader := loaders.IssueLoaderFromContext(ctx)
|
||||
for _, issue := range issues {
|
||||
loader.Prime(issue.ID, issue)
|
||||
}
|
||||
|
||||
return issues, nil
|
||||
}
|
||||
|
||||
func (r *projectResolver) Permissions(ctx context.Context, obj *models.Project) ([]*models.ProjectPermission, error) {
|
||||
if perm, err := r.Auth.ProjectPermission(ctx, *obj); err != nil || !perm.CanManagePermissions() {
|
||||
if perm, err := r.Auth.ProjectPermission(ctx, obj.ID); err != nil || !perm.CanManagePermissions() {
|
||||
return nil, slerrors.PermissionDenied
|
||||
}
|
||||
|
||||
@@ -36,7 +46,7 @@ func (r *projectResolver) Permissions(ctx context.Context, obj *models.Project)
|
||||
}
|
||||
|
||||
func (r *projectResolver) UserPermissions(ctx context.Context, obj *models.Project) (*models.ProjectPermission, error) {
|
||||
return r.Auth.ProjectPermission(ctx, *obj)
|
||||
return r.Auth.ProjectPermission(ctx, obj.ID)
|
||||
}
|
||||
|
||||
func (r *projectResolver) Statuses(ctx context.Context, obj *models.Project, filter *models.ProjectStatusFilter) ([]*models.ProjectStatus, error) {
|
||||
|
||||
@@ -6,6 +6,7 @@ package resolvers
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"git.aiterp.net/stufflog/server/graph/loaders"
|
||||
|
||||
"git.aiterp.net/stufflog/server/graph/graphcore"
|
||||
"git.aiterp.net/stufflog/server/internal/slerrors"
|
||||
@@ -18,7 +19,8 @@ func (r *queryResolver) Issue(ctx context.Context, id string) (*models.Issue, er
|
||||
return nil, slerrors.PermissionDenied
|
||||
}
|
||||
|
||||
issue, err := r.Database.Issues().Find(ctx, id)
|
||||
issue, err := loaders.IssueLoaderFromContext(ctx).Load(id)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -44,6 +46,11 @@ func (r *queryResolver) Issues(ctx context.Context, filter *models.IssueFilter)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
loader := loaders.IssueLoaderFromContext(ctx)
|
||||
for _, issue := range issues {
|
||||
loader.Prime(issue.ID, issue)
|
||||
}
|
||||
|
||||
deleteList := make([]int, 0, len(issues))
|
||||
for i, issue := range issues {
|
||||
_, err := r.Auth.IssuePermission(ctx, *issue)
|
||||
@@ -100,7 +107,7 @@ func (r *queryResolver) IssueItem(ctx context.Context, id string) (*models.Issue
|
||||
return nil, err
|
||||
}
|
||||
|
||||
issue, err := r.Database.Issues().Find(ctx, item.IssueID)
|
||||
issue, err := loaders.IssueLoaderFromContext(ctx).Load(id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -138,7 +145,7 @@ func (r *queryResolver) IssueItems(ctx context.Context, filter *models.IssueItem
|
||||
continue
|
||||
}
|
||||
|
||||
issue, err := r.Database.Issues().Find(ctx, item.IssueID)
|
||||
issue, err := loaders.IssueLoaderFromContext(ctx).Load(item.IssueID)
|
||||
if err != nil {
|
||||
deleteList = append(deleteList, i-len(deleteList))
|
||||
accessMap[item.IssueID] = true
|
||||
@@ -169,7 +176,7 @@ func (r *queryResolver) Project(ctx context.Context, id string) (*models.Project
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_, err = r.Auth.ProjectPermission(ctx, *project)
|
||||
_, err = r.Auth.ProjectPermission(ctx, project.ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -203,7 +210,7 @@ func (r *queryResolver) Projects(ctx context.Context, filter *models.ProjectFilt
|
||||
if !skipCheck && len(projects) > 0 {
|
||||
deleteList := make([]int, 0, 4)
|
||||
for i, project := range projects {
|
||||
if _, err := r.Auth.ProjectPermission(ctx, *project); err != nil {
|
||||
if _, err := r.Auth.ProjectPermission(ctx, project.ID); err != nil {
|
||||
deleteList = append(deleteList, i-len(deleteList))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user