public async Task <IActionResult> PostReservation([FromBody] ReservationRequest item) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var user = await GetApplicationUser(); if (!_context.ObjectTags.Any(c => c.Id == item.ObjectTagId)) { return(BadRequest()); } var reservation = item.ToDataModel(user.Id); // TODO: 予約可能かどうか、判定 // TODO: 先約にリクエストを送る処理なども検討...? _context.Reservations.Add(reservation); try { await _context.SaveChangesAsync(); _reservationService.OnAddReservation(reservation); await RegisterReservationUser(item.Users, reservation); await _context.SaveChangesAsync(); } catch (DbUpdateException) { if (ReservationExists(reservation.Id)) { return(new StatusCodeResult(StatusCodes.Status409Conflict)); } else { throw; } } var response = await _context.IncludeReservationContext().FirstOrDefaultAsync(c => c.Id == reservation.Id); return(CreatedAtAction("GetReservation", new { id = reservation.Id }, response.ToApiModel())); }
public async Task <IActionResult> PutReservation([FromRoute] string id, [FromBody] ReservationRequest item) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if (id != item.Id) { return(BadRequest()); } var reservation = await _context.IncludeReservationContext().FirstOrDefaultAsync(m => m.Id == id); if (reservation == null) { return(NotFound()); } var user = await GetApplicationUser(); if (user.Id != reservation.OwnerUserId) { return(Forbid()); } if (!_context.ObjectTags.Any(c => c.Id == item.ObjectTagId)) { return(BadRequest()); } // TODO: 予約可能かどうか、判定 reservation = item.ToDataModel(user.Id, reservation); _context.Entry(reservation).State = EntityState.Modified; try { var userIds = _context.ReservationUsers.Select(c => c.UserId).ToList(); await RemoveReservationUser(userIds, reservation.Id); await _context.SaveChangesAsync(); _reservationService.OnEditReservation(reservation); await RegisterReservationUser(item.Users, reservation); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!ReservationExists(id)) { return(NotFound()); } else { throw; } } var response = await _context.IncludeReservationContext().FirstOrDefaultAsync(c => c.Id == reservation.Id); return(Ok(response.ToApiModel())); }