private async Task <ReservationWriteResource> AttachUserIdToRecord(ReservationWriteResource record)
        {
            var user = await Identity.GetConnectedUserId(httpContext);

            record.UserId = user.UserId;
            return(record);
        }
        public async Task <int> GetPortIdFromPickupPointId(ReservationWriteResource record)
        {
            PickupPoint pickupPoint = await context.PickupPoints
                                      .Include(x => x.CoachRoute)
                                      .FirstOrDefaultAsync(x => x.Id == record.PickupPointId);

            return(pickupPoint.CoachRoute.PortId);
        }
 public bool IsKeyUnique(ReservationWriteResource record)
 {
     return(!context.Reservations.Any(x =>
                                      x.Date == Convert.ToDateTime(record.Date) &&
                                      x.ReservationId != record.ReservationId &&
                                      x.DestinationId == record.DestinationId &&
                                      x.CustomerId == record.CustomerId &&
                                      string.Equals(x.TicketNo, record.TicketNo, StringComparison.OrdinalIgnoreCase)));
 }
 public async Task <int> IsValid(ReservationWriteResource record, IScheduleRepository scheduleRepo)
 {
     return(true switch {
         var x when x == !IsValidCustomer(record) => 450,
         var x when x == !IsValidDestination(record) => 451,
         var x when x == !IsValidPickupPoint(record) => 452,
         var x when x == !IsValidDriver(record) => 453,
         var x when x == !IsValidShip(record) => 454,
         var x when x == !IsValidNationality(record) => 456,
         var x when x == !IsValidGender(record) => 457,
         var x when x == !IsValidOccupant(record) => 458,
         var x when x == !IsCorrectPassengerCount(record) => 455,
         var x when x == !UserCanAddReservationInThePast(record.Date) => 431,
         var x when x == !scheduleRepo.DayHasSchedule(record.Date) => 432,
         var x when x == !scheduleRepo.DayHasScheduleForDestination(record.Date, record.DestinationId) => 430,
         var x when x == !scheduleRepo.PortHasDepartures(record.Date, record.DestinationId, await GetPortIdFromPickupPointId(record)) => 427,
         var x when x == !PortHasVacancy(scheduleRepo, record.Date, record.Date, record.ReservationId, record.DestinationId, await GetPortIdFromPickupPointId(record), record.Adults + record.Kids + record.Free) => 433,
         var x when x == !IsKeyUnique(record) => 409,
         _ => 200,
     });
        public async Task <IActionResult> PutReservation([FromRoute] string id, [FromBody] ReservationWriteResource record)
        {
            await AttachUserIdToRecord(record);

            var response = await reservationRepo.IsValid(record, scheduleRepo);

            record = reservationRepo.UpdateForeignKeysWithNull(record);
            if (response == 200)
            {
                await reservationRepo.Update(id, mapper.Map <ReservationWriteResource, Reservation>(record));

                return(StatusCode(200, new {
                    message = record.RefNo
                }));
            }
            else
            {
                return(GetErrorMessage(response));
            }
        }
        public async Task <IActionResult> PostReservationAsync([FromBody] ReservationWriteResource record)
        {
            var response = await reservationRepo.IsValid(record, scheduleRepo);

            if (response == 200)
            {
                await AssignRefNoToNewReservationAsync(record);
                await AttachPortIdToRecordAsync(record);
                await AttachUserIdToRecord(record);

                reservationRepo.Create(mapper.Map <ReservationWriteResource, Reservation>(record));
                return(StatusCode(200, new {
                    message = record.RefNo
                }));
            }
            else
            {
                return(GetErrorMessage(response));
            }
        }
        private async Task <ReservationWriteResource> AssignRefNoToNewReservationAsync(ReservationWriteResource record)
        {
            record.RefNo = await reservationRepo.AssignRefNoToNewReservation(record);

            return(record);
        }
        private async Task <ReservationWriteResource> AttachPortIdToRecordAsync(ReservationWriteResource record)
        {
            record.PortId = await reservationRepo.GetPortIdFromPickupPointId(record);

            return(record);
        }