Example #1
0
        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);
        }