public async Task <IActionResult> Index(EditCourseRunSaveViewModel model) { if (!model.CourseId.HasValue) { return(BadRequest()); } var courseId = model.CourseId.Value; var allRegions = await _regionCache.GetAllRegions(); var allSubRegionIds = allRegions.SelectMany(r => r.SubRegions).Select(sr => sr.Id).ToHashSet(); bool flexibleStartDate = true; DateTime?specifiedStartDate = null; if (model.StartDateType.Equals("SpecifiedStartDate", StringComparison.InvariantCultureIgnoreCase)) { string day = model.Day.Length == 1 ? string.Concat("0", model.Day) : model.Day; string month = model.Month.Length == 1 ? string.Concat("0", model.Month) : model.Month; string startDate = string.Format("{0}-{1}-{2}", day, month, model.Year); specifiedStartDate = DateTime.ParseExact(startDate, "dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture); model.StartDate = specifiedStartDate.Value; flexibleStartDate = false; } if (model.National == true) { model.SelectedRegions = null; } model.FlexibleStartDate = flexibleStartDate; var validationResult = new EditCourseRunSaveViewModelValidator(allRegions, _clock).Validate(model); if (!validationResult.IsValid) { return(BadRequest()); } var updateCommand = new UpdateCourseRun() { CourseRunId = model.CourseRunId, DurationUnit = model.DurationUnit, DeliveryMode = model.DeliveryMode, Cost = !string.IsNullOrEmpty(model.Cost) ? Convert.ToDecimal(model.Cost) : (decimal?)null, CostDescription = model.CostDescription ?? "", CourseName = model.CourseName, CourseUrl = model.Url, DurationValue = Convert.ToInt32(model.DurationLength), ProviderCourseId = model.CourseProviderReference ?? "", FlexibleStartDate = flexibleStartDate, StartDate = specifiedStartDate, UpdatedBy = _currentUserProvider.GetCurrentUser(), UpdatedOn = _clock.UtcNow }; updateCommand.National = null; switch (model.DeliveryMode) { case CourseDeliveryMode.ClassroomBased: updateCommand.National = null; updateCommand.SubRegionIds = null; updateCommand.VenueId = model.VenueId; updateCommand.AttendancePattern = model.AttendanceMode; updateCommand.StudyMode = model.StudyMode; break; case CourseDeliveryMode.WorkBased: updateCommand.VenueId = null; var availableRegions = new SelectRegionModel(); if (model.National.Value) { updateCommand.National = true; updateCommand.SubRegionIds = null; } else { updateCommand.National = false; updateCommand.SubRegionIds = model.SelectedRegions.Where(id => allSubRegionIds.Contains(id)); updateCommand.AttendancePattern = null; updateCommand.StudyMode = null; } break; case CourseDeliveryMode.Online: updateCommand.SubRegionIds = null; updateCommand.VenueId = null; updateCommand.National = null; updateCommand.AttendancePattern = null; updateCommand.StudyMode = null; break; } var updateResult = await _sqlQueryDispatcher.ExecuteQuery(updateCommand); if (!(updateResult.Value is Success)) { return(BadRequest()); } Session.Remove("NewAddedVenue"); Session.Remove("Option"); switch (model.Mode) { case PublishMode.DataQualityIndicator: TempData[TempDataKeys.ExpiredCoursesNotification] = model.CourseName + " has been updated"; return(RedirectToAction("Index", "ExpiredCourseRuns") .WithProviderContext(_providerContextProvider.GetProviderContext(withLegacyFallback: true))); default: TempData[TempDataKeys.ShowCourseUpdatedNotification] = true; return(RedirectToAction("Index", "CourseSummary", new { courseId = model.CourseId, courseRunId = model.CourseRunId })); } }
public async Task <OneOf <NotFound, Success> > Execute(SqlTransaction transaction, UpdateCourseRun query) { var sql = $@" UPDATE Pttcd.CourseRuns SET CourseName = @CourseName, DeliveryMode = @DeliveryMode, FlexibleStartDate = @FlexibleStartDate, StartDate = @StartDate, CourseWebsite = @CourseUrl, Cost = @Cost, CostDescription = @CostDescription, DurationUnit = @DurationUnit, DurationValue = @DurationValue, ProviderCourseId = @ProviderCourseId, [National] = @National, VenueId = @VenueId, AttendancePattern = @AttendancePattern, StudyMode = @StudyMode, UpdatedBy = @UpdatedByUserId, UpdatedOn = @UpdatedOn, DataIsHtmlEncoded = 0 WHERE CourseRunId = @CourseRunId AND CourseRunStatus = {(int)CourseStatus.Live} IF @@ROWCOUNT = 0 BEGIN SELECT 1 AS Result RETURN END MERGE Pttcd.CourseRunSubRegions AS target USING (SELECT Value FROM @SubRegionIds) AS source ON target.CourseRunId = @CourseRunId AND target.RegionId = source.Value WHEN NOT MATCHED THEN INSERT (CourseRunId, RegionId) VALUES (@CourseRunId, source.Value) WHEN NOT MATCHED BY SOURCE AND target.CourseRunId = @CourseRunId THEN DELETE; DECLARE @CourseRunIds Pttcd.GuidIdTable INSERT INTO @CourseRunIds VALUES (@CourseRunId) EXEC Pttcd.RefreshFindACourseIndex @CourseRunIds = @CourseRunIds, @Now = @UpdatedOn SELECT 0 AS Result"; var paramz = new { query.CourseRunId, query.CourseName, query.DeliveryMode, query.FlexibleStartDate, query.StartDate, query.CourseUrl, query.Cost, query.CostDescription, query.DurationUnit, query.DurationValue, query.ProviderCourseId, query.National, SubRegionIds = TvpHelper.CreateStringTable(query.SubRegionIds ?? Array.Empty <string>()), query.VenueId, query.AttendancePattern, query.StudyMode, UpdatedByUserId = query.UpdatedBy.UserId, query.UpdatedOn }; var result = await transaction.Connection.QuerySingleAsync <Result>(sql, paramz, transaction); if (result == Result.Success) { return(new Success()); } else { return(new NotFound()); } }