コード例 #1
0
        internal async Task <HttpResponseMessage> PostWalkRequest(WalkRequestDto requestDto, string ownerToken)
        {
            var url           = "/api/owners/requestWalk";
            var serializedObj = JsonConvert.SerializeObject(requestDto);
            var content       = new StringContent(serializedObj, Encoding.UTF8, "application/json");

            _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ownerToken);
            var res = await _client.PostAsync(url, content);

            _client.DefaultRequestHeaders.Clear();
            var parsedWalkRequest = await res.Content.ReadAsStringAsync();

            return(res);
        }
コード例 #2
0
ファイル: OwnerController.cs プロジェクト: ErickOF/Digi-Pet
        public async Task <IActionResult> PostWalkRequest([FromBody] WalkRequestDto walkRequestDto)
        {
            var username = User.Claims.Where(c => c.Type == ClaimTypes.Name).FirstOrDefault().Value;
            var owner    = await _repository.GetOwnerByUserName(username);

            var petsIds = owner.Pets.Select(p => p.Id);

            if (!petsIds.Contains(walkRequestDto.PetId))
            {
                return(BadRequest(new { message = "pet not yours!" }));
            }
            var result = await _repository.RequestWalk(walkRequestDto);

            if (result.Item1 == null)
            {
                return(BadRequest(result.Item2));
            }
            return(Ok(result.Item1));
        }
コード例 #3
0
ファイル: Repository.cs プロジェクト: ErickOF/Digi-Pet
        public async Task <Tuple <WalkInfoDto, string> > RequestWalk(WalkRequestDto walkRequestDto)
        {
            if (walkRequestDto.Begin.Date != walkRequestDto.End.Date)
            {
                return(new Tuple <WalkInfoDto, string>(null, "no se puede ese rango de horas"));
            }

            var pet = await _dbContext.Pets.Include(p => p.Petowner).FirstOrDefaultAsync(p => p.Id == walkRequestDto.PetId);


            var walkers = _dbContext.Walker.Include(w => w.User)
                          .Include(w => w.Walks).ThenInclude(wa => wa.Pet).ThenInclude(p => p.Petowner)
                          .Include(w => w.WalkerSchedules)
                          //se filtran por provincia, se quitan los bloqueados y los que tienen agendado horas disponibles para el dia
                          .Where(w => (w.User.Province == walkRequestDto.Province || (w.DoesOtherProvinces && w.OtherProvinces.Contains(walkRequestDto.Province))) &&
                                 !w.Blocked && w.WalkerSchedules.Select(we => we.Date).Contains(walkRequestDto.Begin.Date) &&
                                 w.WalkerSchedules.First(we => we.Date == walkRequestDto.Begin).HoursAvailable.Contains(walkRequestDto.Begin.AddMinutes(-30).Hour) &&
                                 w.WalkerSchedules.First(we => we.Date == walkRequestDto.Begin).HoursAvailable.Contains(walkRequestDto.End.AddMinutes(30).Hour) &&
                                 maxDuration(w.WalkerSchedules.First(we => we.Date == walkRequestDto.Begin).HoursAvailable, walkRequestDto.Begin.Hour) >= walkRequestDto.Duration
                                 ).ToList();


            walkers.RemoveAll(w =>
            {
                //remueve aquellos cuidadores que tienen conflicto de horarios
                var walks = w.Walks.Where(
                    ww => ((walkRequestDto.Begin >= ww.Begin.AddMinutes(-30) && walkRequestDto.Begin <= ww.Begin.AddMinutes(30)) ||
                           (walkRequestDto.End >= ww.Begin.AddMinutes(-30) && walkRequestDto.End <= ww.Begin.AddMinutes(30))) && ww.Pet.PetOwnerId != pet.PetOwnerId
                    );
                return(walks.Count() != 0);
            });
            //queda filtrar los paseos que son del mismo dueno pero a distintas horas
            walkers.RemoveAll(w =>
            {
                var walks = w.Walks.Where(ww => ww.Pet.PetOwnerId == pet.PetOwnerId &&
                                          (walkRequestDto.Begin != ww.Begin || walkRequestDto.End != ww.End) &&
                                          (walkRequestDto.Begin.Date == ww.Begin.Date)
                                          );
                return(walks.Count() != 0);
            });
            walkers.RemoveAll(w =>
            {
                var walks = w.Walks.Where(ww => ww.Province != walkRequestDto.Province && ww.Canton != walkRequestDto.Canton);
                return(walks.Count() != 0);
            }
                              );

            // se le asignan los 10 puntos adicionales si es del canton
            walkers.ForEach(w =>
            {
                w.TempPoints = w.Points + ((w.User.Canton == walkRequestDto.Canton && w.User.Province == walkRequestDto.Province) ? 10 : 0);
                if (w.Walks.Select(wa => wa.Pet.PetOwnerId).Contains(pet.PetOwnerId))
                {
                    w.TempPoints = 0;                                                                  //se desincentiva asignar un cuidador otra vez
                }
            });
            walkers.OrderByDescending(w => w.TempPoints);
            if (walkers.Count() == 0)
            {
                return(new Tuple <WalkInfoDto, string>(null, "cant find walker"));
            }

            Walker walker;
            //rota la seleccion nuevo/viejo
            var next = _userChoose.NextWalker();

            if (next == UserChoose.New)
            {
                walker = walkers.FirstOrDefault(w => w.Walks.Count == 0);
                if (walker == null)
                {
                    walker = walkers.First();
                }
            }
            else
            {
                walker = walkers.FirstOrDefault(w => w.Walks.Count != 0);
                if (walker == null)
                {
                    walker = walkers.First();
                }
            }
            var chosenWalker = walker;

            if (chosenWalker == null)
            {
                return(new Tuple <WalkInfoDto, string>(null, "no se puede ese rango de horas"));
            }
            var walk = new Walk
            {
                Begin        = walkRequestDto.Begin,
                Duration     = walkRequestDto.Duration,
                Province     = walkRequestDto.Province,
                Canton       = walkRequestDto.Canton,
                Description  = walkRequestDto.Description,
                PetId        = walkRequestDto.PetId,
                WalkerId     = walker.Id,
                ExactAddress = walkRequestDto.ExactAddress,
                Total        = HourPrice() * walkRequestDto.Duration
            };
            await _dbContext.Walks.AddAsync(walk);

            try
            {
                await _dbContext.SaveChangesAsync();

                return(new Tuple <WalkInfoDto, string>(new WalkInfoDto(walk), "success"));
            }
            catch (Exception e)
            {
                return(new Tuple <WalkInfoDto, string>(null, e.Message));
            }
        }
コード例 #4
0
        public async Task RequestWalk_Path()
        {
            try
            {
                var res = await CreateWalker(TempWalker);//crea cuidador

                res.EnsureSuccessStatusCode();
                var returnedWalker = JsonConvert.DeserializeObject <CreatedWalkerResponse>(await res.Content.ReadAsStringAsync());

                Assert.Equal(TempWalker.SchoolId, returnedWalker.userName);
                Assert.NotEqual(0, returnedWalker.id);
                if (string.IsNullOrEmpty(TempWalkerToken))//autentica nuevo usuario
                {
                    TempWalkerToken = await Authenticate(TempWalker.SchoolId, TempWalker.Password);
                }

                res = await PostWalkerSchedule(TempWeekSchedule);//se crea un horario

                res.EnsureSuccessStatusCode();

                await CompareWalkerScheduleWithOriginal();// se compara el horario creado

                var res2 = await CreateOwner(TestOwner);

                if (string.IsNullOrEmpty(TestOwnerToken))
                {
                    TestOwnerToken = await Authenticate(TestOwner.Email, TestOwner.Password);
                }

                var pets = await GetPets(TestOwnerToken);

                Assert.Equal(2, pets.Count);
                var walkRequest = new WalkRequestDto
                {
                    PetId        = pets[0].Id,
                    Begin        = DateTime.Today.AddDays(3).AddHours(9).ToUniversalTime(),
                    Duration     = 1,
                    Province     = TempWalker.Province,
                    Canton       = TempWalker.Canton,
                    Description  = "noo",
                    ExactAddress = "direccion exacta"
                };

                // pide paseo para una mascota
                var res3 = await PostWalkRequest(walkRequest, TestOwnerToken);

                res3.EnsureSuccessStatusCode();
                var message3 = await res3.Content.ReadAsStringAsync();

                var parsedWalkRequest = JsonConvert.DeserializeObject <WalkInfoDto>(message3);

                Assert.Equal(returnedWalker.id, parsedWalkRequest.WalkerId);
                //pide paseo para la otra mascota y debe asignar el mismo
                walkRequest.PetId = pets[1].Id;
                var res4 = await PostWalkRequest(walkRequest, TestOwnerToken);

                res4.EnsureSuccessStatusCode();
                var message4 = await res3.Content.ReadAsStringAsync();

                var parsedWalkRequest2 = JsonConvert.DeserializeObject <WalkInfoDto>(message4);

                Assert.Equal(returnedWalker.id, parsedWalkRequest2.WalkerId);

                await CheckOwnerWalks(pets);
                await CheckWalkerWalks(pets);

                //pide un paseo para el siguiente dia y debe fallar porque el cuidador no tiene hora disponible
                walkRequest.Begin = DateTime.Today.AddDays(4).AddHours(9);
                var res5 = await PostWalkRequest(walkRequest, TestOwnerToken);

                Assert.Equal(HttpStatusCode.BadRequest, res5.StatusCode);

                var resBlockWalker = await BlockUnblockWalker(returnedWalker.id, true);

                resBlockWalker.EnsureSuccessStatusCode();

                var resGetProfile = await GetProfile("walkers", TempWalkerToken);

                resGetProfile.EnsureSuccessStatusCode();
                var resWalkerProfile = JsonConvert.DeserializeObject <ReturnWalker>(await resGetProfile.Content.ReadAsStringAsync());
                Assert.Equal(returnedWalker.id, resWalkerProfile.Id);
                //se verifica que se haya bloqueado perfil
                Assert.True(resWalkerProfile.Blocked);

                //al pedir en el dia que tiene disponible pero al estar bloqueado, no se pueden encontrar
                walkRequest.Begin = DateTime.Today.AddDays(4).AddHours(15);
                var res6 = await PostWalkRequest(walkRequest, TestOwnerToken);

                Assert.Equal(HttpStatusCode.BadRequest, res6.StatusCode);

                var resUnBlockWalker = await BlockUnblockWalker(returnedWalker.id, false);

                resUnBlockWalker.EnsureSuccessStatusCode();
                var resGetProfile2 = await GetProfile("walkers", TempWalkerToken);

                resGetProfile2.EnsureSuccessStatusCode();
                var resWalkerProfile2 = JsonConvert.DeserializeObject <ReturnWalker>(await resGetProfile2.Content.ReadAsStringAsync());
                Assert.Equal(returnedWalker.id, resWalkerProfile2.Id);

                //se verifica que se haya desbloqueado perfil
                Assert.False(resWalkerProfile2.Blocked);

                //al desbloquear usuario se debe poder volver a encontrar un cuidador

                var res7 = await PostWalkRequest(walkRequest, TestOwnerToken);

                res7.EnsureSuccessStatusCode();
                var message7 = await res7.Content.ReadAsStringAsync();

                var parsedWalkRequest7 = JsonConvert.DeserializeObject <WalkInfoDto>(message7);

                Assert.Equal(returnedWalker.id, parsedWalkRequest7.WalkerId);

                //modifico fecha para que pueda hacer tarjeta de reporte
                var resModifyDate = await ModifyDate(parsedWalkRequest.Id, DateTime.Today.AddDays(-1));

                resModifyDate.EnsureSuccessStatusCode();

                await PostReportCard(parsedWalkRequest.Id);
            }
            finally
            {
                //eliminar dueño y cuidador
                await DeleteUser(TestOwner.Email);
                await DeleteUser(TempWalker.SchoolId);
            }
        }