public async Task <TypedResult <IEnumerable <MailEntity> > > GetMail(GetMailFilter getMailFilter) { try { var filters = new List <FilterDefinition <MailEntity> >(); if (getMailFilter?.After != null) { filters.Add(Builders <MailEntity> .Filter.Gte(me => me.Date, getMailFilter.After)); } if (getMailFilter?.Before != null) { filters.Add(Builders <MailEntity> .Filter.Lte(me => me.Date, getMailFilter.Before)); } if (!string.IsNullOrWhiteSpace(getMailFilter?.ToEmail)) { var emailFilter = new List <FilterDefinition <MailEntity> > { Builders <MailEntity> .Filter.AnyEq(me => me.ToRecipients, getMailFilter.ToEmail), Builders <MailEntity> .Filter.AnyEq(me => me.CcRecipients, getMailFilter.ToEmail), Builders <MailEntity> .Filter.AnyEq(me => me.BccRecipients, getMailFilter.ToEmail) }; filters.Add(Builders <MailEntity> .Filter.Or(emailFilter)); } if (!string.IsNullOrWhiteSpace(getMailFilter?.FromEmail)) { filters.Add(Builders <MailEntity> .Filter.Eq(me => me.From, getMailFilter.FromEmail)); } var opts = new FindOptions <MailEntity>() { Limit = getMailFilter.Limit, Skip = getMailFilter.Skip, Sort = Builders <MailEntity> .Sort.Descending(me => me.Date) }; if (filters.Any()) { var foundMail = (await _mailCollection.FindAsync(Builders <MailEntity> .Filter.And(filters), opts)).ToList(); return(new SuccessfulTypedResult <IEnumerable <MailEntity> >(foundMail)); } else { var foundMail = (await _mailCollection.FindAsync(Builders <MailEntity> .Filter.Empty, opts)).ToList(); return(new SuccessfulTypedResult <IEnumerable <MailEntity> >(foundMail)); } } catch (Exception e) { return(new FailedTypedResult <IEnumerable <MailEntity> >(e)); } }
// Always returns in desc datetime order public async Task <IActionResult> GetMail(DateTimeOffset?before = null, DateTimeOffset?after = null, string toEmail = null, string fromEmail = null, int limit = 100, int skip = 0) { var getMailFilter = new GetMailFilter { Before = before, After = after, ToEmail = toEmail, FromEmail = fromEmail, Limit = Math.Min(limit, 1000), Skip = Math.Max(0, skip) }; var getMailResult = await MailService.GetMail(getMailFilter); switch (getMailResult) { case BadRequestTypedResult <IEnumerable <MailEntity> > badRequestTypedResult: ModelState.AddModelError(badRequestTypedResult.Key, badRequestTypedResult.ErrorMessage); return(ValidationProblem(ModelState)); case FailedTypedResult <IEnumerable <MailEntity> > failedTypedResult: return(Problem(failedTypedResult.Error.ToString(), statusCode: StatusCodes.Status500InternalServerError, title: failedTypedResult.Error.Message)); case NotFoundTypedResult <IEnumerable <MailEntity> > _: return(NotFound()); case SuccessfulTypedResult <IEnumerable <MailEntity> > successfulTypedResult: return(Ok(new FilteredDtoOut <GetMailFilter, MailOutDto>(getMailFilter, Mapper.Map <IEnumerable <MailEntity>, IEnumerable <MailOutDto> >(successfulTypedResult.Value)))); default: throw new ArgumentOutOfRangeException(nameof(getMailResult)); } }