public async Task <IActionResult> GetSamplesPage(int id, DateTime start, DateTime end) { if (start.Equals(DateTime.MinValue) || end.Equals(DateTime.MinValue)) { return(BadRequest(ModelState)); } if (end < start) { var tmp = start; start = end; end = tmp; } var request = new SampleAccessRequest() { Selector = SampleAccessRequest.SelectionCriteria.Pet, UserId = _claimsCompat.ExtractFirstIdClaim(HttpContext.User), PetId = id, RangeStart = start, RangeEnd = end }; var port = new BasicPresenter <GenericDataResponse <IEnvDataSample> >(); var success = await _sampleDataUseCase.Handle(request, port); if (!success) { return(BadRequest()); } return(new OkObjectResult(port.Response.Result.Select(SampleDto.From))); }
public async Task <bool> Handle(SampleAccessRequest message, IOutboundPort <GenericDataResponse <IEnvDataSample> > outputPort) { var response = new GenericDataResponse <IEnvDataSample>(); var user = await _userStore.GetUserById(message.UserId); switch (message.Selector) { case SampleAccessRequest.SelectionCriteria.User: if (user == null) { return(false); } response.Result = await _sampleStore.GetRangeByUser(user, message.RangeStart, message.RangeEnd); break; case SampleAccessRequest.SelectionCriteria.Environment: // ensure the user has access to see this environment's data: await _userStore.LoadEnvironments(user); var env = user.Environments.FirstOrDefault(e => e.Id == message.EnvId); if (env == null) { return(false); // env doesn't exist or user can't access it. } response.Result = await _sampleStore.GetRangeByEnv(env, message.RangeStart, message.RangeEnd); break; case SampleAccessRequest.SelectionCriteria.Pet: // ensure the user owns the pet in question: await _userStore.LoadPets(user); var pet = user.Pets.FirstOrDefault(p => p.Id == message.PetId); if (pet == null) { return(false); // pet doesn't exist or user can't access its data. } response.Result = await _sampleStore.GetRangeByPet(pet, message.RangeStart, message.RangeEnd); break; default: throw new ArgumentException("Invalid selection mode", nameof(message)); } outputPort.Handle(response); return(true); }