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