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)); }
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)); }