Esempio n. 1
0
        public async Task <IActionResult> SearchNotesAsync([FromQuery] TodoInfoSearchQuery query, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var modelQuery     = TodoInfoSearchQueryConverter.Convert(query ?? new ClientModels.Todos.TodoInfoSearchQuery());
            var nameIdentifier = this.HttpContext.User.Claims
                                 .FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier);
            var user = await _userRepository.GetAsync(nameIdentifier.Value, cancellationToken);

            modelQuery.UserId = user.Id;
            var modelNotes = await this._todoService.SearchAsync(modelQuery, cancellationToken).ConfigureAwait(false);

            var clientrecords   = modelNotes.Select(record => TodoInfoConverter.Convert(record)).ToList();
            var clientNotesList = new ClientModels.Todos.TodoList()
            {
                Todos = clientrecords
            };

            return(this.Ok(clientNotesList));
        }
Esempio n. 2
0
        public async Task <IReadOnlyList <TodoInfo> > SearchAsync(TodoInfoSearchQuery query, CancellationToken cancellationToken)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query));
            }

            cancellationToken.ThrowIfCancellationRequested();

            var cursor = await _todos.FindAsync <Todo>(record => query.UserId == record.UserId, cancellationToken : cancellationToken)
                         .ConfigureAwait(false);

            var search = cursor.ToEnumerable();

            if (query.CreatedFrom != null)
            {
                search = search.Where(note => note.CreatedAt >= query.CreatedFrom.Value);
            }

            if (query.CreatedTo != null)
            {
                search = search.Where(note => note.CreatedAt <= query.CreatedTo.Value);
            }

            if (query.UserId != null)
            {
                search = search.Where(note => note.UserId == query.UserId.Value);
            }


            if (query.Tags != null)
            {
                bool WhereTagsPresent(TodoInfo todoInfo)
                {
                    return(query.Tags.All(tag => todoInfo.Tags.Contains(tag)));
                }

                search = search.Where(WhereTagsPresent);
            }

            if (query.Offset != null)
            {
                search = search.Take(query.Offset.Value);
            }

            if (query.Limit != null)
            {
                search = search.Take(query.Limit.Value);
            }

            var sort   = query.Sort ?? SortType.Ascending;
            var sortBy = query.SortBy ?? TodoSortBy.Creation;

            if (sort != SortType.Ascending || sortBy != TodoSortBy.Creation)
            {
                DateTime select(TodoInfo note)
                {
                    switch (sortBy)
                    {
                    case TodoSortBy.LastUpdate:
                        return(note.LastUpdatedAt);

                    case TodoSortBy.Creation:
                        return(note.CreatedAt);

                    default:
                        throw new ArgumentException($"Unknown note sort by value \"{sortBy}\".", nameof(query));
                    }
                }

                search = sort == SortType.Ascending ?
                         search.OrderBy(select) :
                         search.OrderByDescending(select);
            }

            var result = search.ToList();

            return(await Task.FromResult <IReadOnlyList <TodoInfo> >(result));
        }