package loaders import ( "context" "git.aiterp.net/stufflog/server/database/repositories" "git.aiterp.net/stufflog/server/models" "time" ) var projectPermissionCtxKey = "ctx.stufflog.ProjectPermissionLoader" func ProjectPermissionLoaderFromContext(ctx context.Context) *ProjectPermissionLoader { return ctx.Value(projectPermissionCtxKey).(*ProjectPermissionLoader) } func NewProjectPermissionLoader(ctx context.Context, user *models.User, projectRepo repositories.ProjectRepository) *ProjectPermissionLoader { return &ProjectPermissionLoader{ wait: time.Millisecond / 2, maxBatch: 16, fetch: func(keys []string) ([]*models.ProjectPermission, []error) { errors := make([]error, len(keys)) results := make([]*models.ProjectPermission, len(keys)) if user == nil { for i, key := range keys { results[i] = &models.ProjectPermission{ ProjectID: key, UserID: "", Level: models.ProjectPermissionLevelNoAccess, } } return results, errors } indices := make(map[string]int) for i, key := range keys { indices[key] = i } permissions, err := projectRepo.GetUserPermissions(ctx, *user, keys) if err != nil { for i := range errors { errors[i] = err } return results, errors } for _, permission := range permissions { results[indices[permission.ProjectID]] = permission } return results, errors }, } }