public async Task <IActionResult> Add(TourViewModel model) { try { if (ModelState.IsValid) { if (await tourDAL.IsExistedTourIdAsync(model.Id)) { ModelState.AddModelError("", $"Tour ID '{model.Id.ToUpper()}' is existed"); } if (model.FromDate.CompareTo(DateTime.Now) <= 0) { ModelState.AddModelError("", "Start Date must be greater than today"); } else if (model.FromDate.CompareTo(DateTime.Parse("9999-12-31 12:00")) > 0) { ModelState.AddModelError("", "Start Date is out of range"); } if (model.ToDate.CompareTo(DateTime.Now) <= 0) { ModelState.AddModelError("", "End Date must be greater than today"); } else if (model.ToDate.CompareTo(DateTime.Parse("9999-12-31 12:00")) > 0) { ModelState.AddModelError("", "End Dae is out of range"); } if (model.FromDate.CompareTo(model.ToDate) >= 0) { ModelState.AddModelError("", "End Date must be greater than Start Date"); } if (!await destinationDAL.IsAvailableDestinationAsync(model.Departure)) { ModelState.AddModelError("", $"The departure '{model.Departure.ToUpper()}' is not existed or available"); } bool duplicated = false; foreach (string id in model.Destinations) { if (id.Equals(model.Departure, StringComparison.OrdinalIgnoreCase)) { duplicated = true; } if (!await destinationDAL.IsAvailableDestinationAsync(id)) { ModelState.AddModelError("", $"Destination '{id.ToUpper()}' is not existed or available"); } } if (duplicated) { ModelState.AddModelError("", "The departure can't also be destinations"); } List <string> availableGuides = new List <string>(); IEnumerable <AppUser> guides = await userManager.GetUsersInRoleAsync("Guide"); foreach (AppUser guide in guides) { if (!await userManager.IsLockedOutAsync(guide)) { availableGuides.Add(guide.Id); } } foreach (string id in model.Guides) { if (!availableGuides.Contains(id)) { ModelState.AddModelError("", $"Guide '{id.ToUpper()}' is not existed or available"); } } if (!ModelState.IsValid) { model.DestinationItems = await InitDestinationItemsAsync(); model.GuideItems = await InitGuideItemsAsync(); return(View("Add", model)); } model.Destinations.Insert(0, model.Departure); List <Destination> destinations = new List <Destination>(); foreach (string id in model.Destinations) { destinations.Add(new Destination { Id = id }); } Tour tour = new Tour { Id = model.Id.ToUpper(), Name = model.Name, FromDate = model.FromDate, ToDate = model.ToDate, AdultFare = model.AdultFare, KidFare = model.KidFare, Description = model.Description ?? "", MaxGuest = model.MaxGuest, Transport = model.Transport ?? "", Destinations = destinations, Guides = guides.Where(g => model.Guides.Contains(g.Id)), IsActive = model.IsActive }; string img = model.Image ?? "https://ztourist.blob.core.windows.net/others/tour.jpg"; if (model.Photo != null && !string.IsNullOrWhiteSpace(model.Photo?.FileName)) // if photo is chosen then copy { string filePath = model.Id + "." + model.Photo.FileName.Substring(model.Photo.FileName.LastIndexOf(".") + 1); img = await blobService.UploadFile("tours", filePath, model.Photo); } if (img != null) { tour.Image = img; if (await tourDAL.AddTourAsync(tour)) { return(RedirectToAction(nameof(Details), new { tour.Id })); } else { ModelState.AddModelError("", "Add tour failed"); } } else { ModelState.AddModelError("", "Can't upload image"); } } model.DestinationItems = await InitDestinationItemsAsync(); model.GuideItems = await InitGuideItemsAsync(); return(View("Add", model)); } catch (Exception ex) { logger.Error(ex.Message); throw; } }