Files
server/graph/loaders/activityloader.go
T

59 lines
1.4 KiB
Go

package loaders
import (
"context"
"git.aiterp.net/stufflog/server/database/repositories"
"git.aiterp.net/stufflog/server/internal/slerrors"
"git.aiterp.net/stufflog/server/models"
"time"
)
// go run github.com/vektah/dataloaden ActivityLoader string \*git.aiterp.net/stufflog/server/models.Activity
var activityLoaderCtxKey = "ctx.stufflog.ActivityLoader"
func ActivityLoaderFromContext(ctx context.Context) *ActivityLoader {
return ctx.Value(activityLoaderCtxKey).(*ActivityLoader)
}
func NewActivityLoader(ctx context.Context, activityRepo repositories.ActivityRepository) *ActivityLoader {
return &ActivityLoader{
fetch: func(keys []string) ([]*models.Activity, []error) {
results := make([]*models.Activity, len(keys))
errors := make([]error, len(keys))
activities, err := activityRepo.List(ctx, models.ActivityFilter{ActivityIDs: keys})
if err != nil {
for i := range errors {
errors[i] = err
}
return results, errors
}
for i, key := range keys {
found := false
for j, activity := range activities {
if activity.ID == key {
found = true
results[i] = activity
activities[j] = activities[len(activities)-1]
activities = activities[:len(activities)-1]
break
}
}
if !found {
errors[i] = slerrors.NotFound("Activity")
}
}
return results, errors
},
wait: time.Millisecond / 2,
maxBatch: 16,
}
}