add logging and a lot of loaders.

This commit is contained in:
2020-05-30 15:28:40 +02:00
parent a4c019e67b
commit bd024a01a4
24 changed files with 1078 additions and 95 deletions
+3 -1
View File
@@ -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
}
+16 -14
View File
@@ -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"))
}
+40 -6
View File
@@ -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.
+3 -2
View File
@@ -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) {
+16 -13
View File
@@ -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
}
+13 -3
View File
@@ -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) {
+12 -5
View File
@@ -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))
}
}