public async Task <ActionResult <WorkspaceSummary[]> > ListWorkspaces([FromQuery] WorkspaceSearch search, CancellationToken ct) { await Validate(search); await Validate(new ClientAudience { Audience = search.aud, Scope = Actor.Scope }); AuthorizeAll(); search.scope = Actor.Scope; return(Ok( await _svc.List(search, Actor.Id, Actor.IsAdmin, ct) )); }
/// <summary> /// List workspace summaries. /// </summary> /// <returns>Array of WorkspaceSummary</returns> public async Task <WorkspaceSummary[]> List(WorkspaceSearch search, string subjectId, bool sudo, CancellationToken ct = default(CancellationToken)) { search.scope += " " + _options.DefaultUserScope; // TODO: change this to use tags (efcore many-to-many) if (search.WantsPlayable) { return(await ListPlayable(search, ct)); } var q = _store.List(search.Term); if (search.WantsAudience) { q = q.Where(w => w.Audience.Contains(search.aud)); } else if (!sudo) { q = q.Where(p => p.Workers.Any(w => w.SubjectId == subjectId)); } q = search.Sort == "age" ? q.OrderByDescending(w => w.WhenCreated) : q.OrderBy(w => w.Name); if (search.Skip > 0) { q = q.Skip(search.Skip); } if (search.Take > 0) { q = q.Take(search.Take); } return(Mapper.Map <WorkspaceSummary[]>( await q.ToArrayAsync(ct) )); }
private async Task <WorkspaceSummary[]> ListPlayable(WorkspaceSearch search, CancellationToken ct = default(CancellationToken)) { // TODO: change this to use tags (efcore many-to-many) var scopes = search.scope.Split( AppConstants.InlineListSeparators, StringSplitOptions.RemoveEmptyEntries ); var data = await _store.List(search.Term) .Where(w => !string.IsNullOrEmpty(w.Audience)) .ToArrayAsync() ; var q = data.AsQueryable() .Where(w => w.Audience.HasAnyToken(search.scope)) ; q = search.Sort == "age" ? q.OrderByDescending(w => w.WhenCreated) : q.OrderBy(w => w.Name); if (search.Skip > 0) { q = q.Skip(search.Skip); } if (search.Take > 0) { q = q.Take(search.Take); } return(Mapper.Map <WorkspaceSummary[]>( q )); }
private async Task _validate(WorkspaceSearch model) { await Task.CompletedTask; }