public ActionResult <ParcelUpdateExpectedResultsDto> PreviewParcelLayerGDBChangesViaGeoJsonFeatureCollectionAndUploadToStaging([FromBody] ParcelLayerUpdateDto model) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var waterYearDto = WaterYear.GetByWaterYearID(_dbContext, model.YearChangesToTakeEffect); if (waterYearDto == null) { return(BadRequest("Invalid water year selected")); } var gdbFileContents = UploadedGdb.GetUploadedGdbFileContents(_dbContext, model.UploadedGDBID); using var disposableTempFile = DisposableTempFile.MakeDisposableTempFileEndingIn(".gdb.zip"); var gdbFile = disposableTempFile.FileInfo; System.IO.File.WriteAllBytes(gdbFile.FullName, gdbFileContents); try { var ogr2OgrCommandLineRunner = new Ogr2OgrCommandLineRunner(_rioConfiguration.Ogr2OgrExecutable, Ogr2OgrCommandLineRunner.DefaultCoordinateSystemId, 250000000, false); var columns = model.ColumnMappings.Select( x => $"{x.MappedColumnName} as {x.RequiredColumnName}").ToList(); var geoJson = ogr2OgrCommandLineRunner.ImportFileGdbToGeoJson(gdbFile.FullName, model.ParcelLayerNameInGDB, columns, null, _logger, null, false); var featureCollection = GeoJsonHelpers.GetFeatureCollectionFromGeoJsonString(geoJson, 14); var expectedResults = ParcelUpdateStaging.AddFromFeatureCollection(_dbContext, featureCollection, _rioConfiguration.ValidParcelNumberRegexPattern, _rioConfiguration.ValidParcelNumberPatternAsStringForDisplay, waterYearDto); return(Ok(expectedResults)); } catch (System.ComponentModel.DataAnnotations.ValidationException e) { _logger.LogError(e.Message); return(BadRequest(e.Message)); } catch (Exception e) { _logger.LogError(e.Message); return(BadRequest("Error generating preview of changes!")); } }
public ActionResult EnactGDBChanges([FromBody] int waterYearID) { var waterYearDto = WaterYear.GetByWaterYearID(_dbContext, waterYearID); if (waterYearDto == null) { return(BadRequest( "There was an error applying these changes to the selected Water Year. Please try again, and if the problem persists contact support.")); } var currentWaterYearDto = WaterYear.GetDefaultYearToDisplay(_dbContext); if (currentWaterYearDto.Year - waterYearDto.Year > 1) { return(BadRequest( "Changes may only be applied to the current year or the previous year. Please update Water Year selection and try again.")); } if (waterYearDto.Year != currentWaterYearDto.Year && currentWaterYearDto.ParcelLayerUpdateDate != null) { return(BadRequest( "Because changes have been applied to the current year previously, you may only select the current year to apply these changes to. Please update Water Year selection and try again.")); } using var dbContextTransaction = _dbContext.Database.BeginTransaction(); try { var expectedResults = ParcelUpdateStaging.GetExpectedResultsDto(_dbContext, waterYearDto); if (expectedResults.NumAccountsToBeInactivated > 0 || expectedResults.NumAccountsToBeCreated > 0) { var currentDifferencesForAccounts = _dbContext.vParcelLayerUpdateDifferencesInParcelsAssociatedWithAccount.Where(x => !x.WaterYearID.HasValue || x.WaterYearID == waterYearDto.WaterYearID); var accountNamesToCreate = currentDifferencesForAccounts .Where( x => !x.AccountAlreadyExists.Value) .Select(x => x.AccountName) .ToList(); Account.BulkCreateWithListOfNames(_dbContext, _rioConfiguration.VerificationKeyChars, accountNamesToCreate); var accountNamesToInactivate = currentDifferencesForAccounts .Where(x => (x.AccountAlreadyExists.Value && !IsNullOrEmpty(x.ExistingParcels) && IsNullOrEmpty(x.UpdatedParcels)) || (!x.AccountAlreadyExists.Value && IsNullOrEmpty(x.UpdatedParcels))).Select(x => x.AccountName).ToList(); Account.BulkInactivate(_dbContext, _dbContext.Account .Where(x => accountNamesToInactivate.Contains(x.AccountName)) .ToList()); } _dbContext.Database.ExecuteSqlRaw( "EXECUTE dbo.pUpdateParcelLayerAddParcelsUpdateAccountParcelAndUpdateParcelGeometry {0}", waterYearDto.WaterYearID); WaterYear.UpdateParcelLayerUpdateDateForID(_dbContext, waterYearID); dbContextTransaction.Commit(); } catch (Exception ex) { _logger.LogError(ex, ex.Message); dbContextTransaction.Rollback(); return(StatusCode(StatusCodes.Status500InternalServerError, ex.Message)); } return(Ok()); }