Beispiel #1
0
        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)
                       ));
        }
Beispiel #2
0
        /// <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)
                       ));
        }
Beispiel #3
0
        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
                       ));
        }
Beispiel #4
0
 private async Task _validate(WorkspaceSearch model)
 {
     await Task.CompletedTask;
 }