stufflog graphql server
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.

58 lines
1.4 KiB

  1. package loaders
  2. import (
  3. "context"
  4. "git.aiterp.net/stufflog/server/database/repositories"
  5. "git.aiterp.net/stufflog/server/internal/slerrors"
  6. "git.aiterp.net/stufflog/server/models"
  7. "time"
  8. )
  9. // go run github.com/vektah/dataloaden ActivityLoader string \*git.aiterp.net/stufflog/server/models.Activity
  10. var activityLoaderCtxKey = "ctx.stufflog.ActivityLoader"
  11. func ActivityLoaderFromContext(ctx context.Context) *ActivityLoader {
  12. return ctx.Value(activityLoaderCtxKey).(*ActivityLoader)
  13. }
  14. func NewActivityLoader(ctx context.Context, activityRepo repositories.ActivityRepository) *ActivityLoader {
  15. return &ActivityLoader{
  16. fetch: func(keys []string) ([]*models.Activity, []error) {
  17. results := make([]*models.Activity, len(keys))
  18. errors := make([]error, len(keys))
  19. activities, err := activityRepo.List(ctx, models.ActivityFilter{ActivityIDs: keys})
  20. if err != nil {
  21. for i := range errors {
  22. errors[i] = err
  23. }
  24. return results, errors
  25. }
  26. for i, key := range keys {
  27. found := false
  28. for j, activity := range activities {
  29. if activity.ID == key {
  30. found = true
  31. results[i] = activity
  32. activities[j] = activities[len(activities)-1]
  33. activities = activities[:len(activities)-1]
  34. break
  35. }
  36. }
  37. if !found {
  38. errors[i] = slerrors.NotFound("Activity")
  39. }
  40. }
  41. return results, errors
  42. },
  43. wait: time.Millisecond / 2,
  44. maxBatch: 16,
  45. }
  46. }