From ee3347a0e2a2dcf653e7d21716efee0d7eded98b Mon Sep 17 00:00:00 2001 From: "Collin M. Barrett" Date: Mon, 22 Jan 2018 07:56:23 -0600 Subject: [PATCH] configure data directory via appsettings --- src/FilterLists.Api/Startup.cs | 5 +- src/FilterLists.Api/appsettings.json | 15 +++-- .../FilterListsDbContextExtensions.cs | 56 ++++++++++--------- 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/src/FilterLists.Api/Startup.cs b/src/FilterLists.Api/Startup.cs index 7d20b9352..36adb79e5 100644 --- a/src/FilterLists.Api/Startup.cs +++ b/src/FilterLists.Api/Startup.cs @@ -45,12 +45,13 @@ public void Configure(IApplicationBuilder app) MigrateAndSeedDatabase(app); } - private static void MigrateAndSeedDatabase(IApplicationBuilder app) + private void MigrateAndSeedDatabase(IApplicationBuilder app) { + var dataPath = Configuration.GetSection("DataDirectory").GetValue("Path"); using (var serviceScope = app.ApplicationServices.GetRequiredService().CreateScope()) { serviceScope.ServiceProvider.GetService().Database.Migrate(); - serviceScope.ServiceProvider.GetService().SeedOrUpdate(); + serviceScope.ServiceProvider.GetService().SeedOrUpdate(dataPath); } } } diff --git a/src/FilterLists.Api/appsettings.json b/src/FilterLists.Api/appsettings.json index 03926ef1f..d3f5ba20b 100644 --- a/src/FilterLists.Api/appsettings.json +++ b/src/FilterLists.Api/appsettings.json @@ -5,6 +5,15 @@ {env.EnvironmentName} values : development, staging, production */ { + "ApplicationInsights": { + "InstrumentationKey": "InstrumentationKeyValue" + }, + "ConnectionStrings": { + "FilterListsConnection": "FilterListsConnectionValue" + }, + "DataDirectory": { + "Path": "..\\..\\data" + }, "Logging": { "IncludeScopes": false, "LogLevel": { @@ -12,11 +21,5 @@ "System": "Information", "Microsoft": "Information" } - }, - "ConnectionStrings": { - "FilterListsConnection": "FilterListsConnectionValue" - }, - "ApplicationInsights": { - "InstrumentationKey": "InstrumentationKeyValue" } } \ No newline at end of file diff --git a/src/FilterLists.Data/FilterListsDbContextExtensions.cs b/src/FilterLists.Data/FilterListsDbContextExtensions.cs index 6b51aec86..148a15fd2 100644 --- a/src/FilterLists.Data/FilterListsDbContextExtensions.cs +++ b/src/FilterLists.Data/FilterListsDbContextExtensions.cs @@ -13,8 +13,6 @@ namespace FilterLists.Data { public static class FilterListsDbContextExtensions { - private const string DataDirectory = "data"; - public static bool AllMigrationsApplied(this FilterListsDbContext dbContext) { var appliedMigrationIds = dbContext.GetService().GetAppliedMigrations() @@ -25,28 +23,30 @@ public static bool AllMigrationsApplied(this FilterListsDbContext dbContext) //TODO: consider handling deleted entities on seed //TODO: read entities from model and iterate over - public static void SeedOrUpdate(this FilterListsDbContext dbContext) + public static void SeedOrUpdate(this FilterListsDbContext dbContext, string dataPath) { - dbContext.InsertOnDuplicateKeyUpdate(); - dbContext.InsertOnDuplicateKeyUpdate(); - dbContext.InsertOnDuplicateKeyUpdate(); - dbContext.InsertOnDuplicateKeyUpdate(); - dbContext.InsertOnDuplicateKeyUpdate(); - dbContext.InsertOnDuplicateKeyUpdate(); - dbContext.InsertOnDuplicateKeyUpdate(); - dbContext.InsertOnDuplicateKeyUpdate(); - dbContext.InsertOnDuplicateKeyUpdate(); - dbContext.InsertOnDuplicateKeyUpdate(); - dbContext.InsertOnDuplicateKeyUpdate(); + dbContext.InsertOnDuplicateKeyUpdate(dataPath); + dbContext.InsertOnDuplicateKeyUpdate(dataPath); + dbContext.InsertOnDuplicateKeyUpdate(dataPath); + dbContext.InsertOnDuplicateKeyUpdate(dataPath); + dbContext.InsertOnDuplicateKeyUpdate(dataPath); + dbContext.InsertOnDuplicateKeyUpdate(dataPath); + dbContext.InsertOnDuplicateKeyUpdate(dataPath); + dbContext.InsertOnDuplicateKeyUpdate(dataPath); + dbContext.InsertOnDuplicateKeyUpdate(dataPath); + dbContext.InsertOnDuplicateKeyUpdate(dataPath); + dbContext.InsertOnDuplicateKeyUpdate(dataPath); } //TODO: improve raw SQL against injection attacks - private static void InsertOnDuplicateKeyUpdate(this DbContext dbContext) where TEntityType : class + private static void InsertOnDuplicateKeyUpdate(this DbContext dbContext, string dataPath) + where TEntityType : class { var entityType = dbContext.Model.FindEntityType(typeof(TEntityType)); var properties = GetPropertiesLessValueGeneratedTimestamps(entityType); var columns = string.Join(", ", properties.Select(x => x.Name)); - var values = CreateValues(properties); + var values = CreateValues(properties, dataPath); + if (values == "") return; var updates = CreateUpdates(properties); var rawSqlString = "INSERT INTO " + entityType.Relational().TableName + " (" + columns + ") VALUES " + values + " ON DUPLICATE KEY UPDATE " + updates; @@ -60,22 +60,24 @@ private static List GetPropertiesLessValueGeneratedTimestamps(IEntity .Where(x => x.ClrType != typeof(DateTime) || x.ValueGenerated == ValueGenerated.Never).ToList(); } - private static string CreateValues(IReadOnlyCollection properties) + private static string CreateValues(IReadOnlyCollection properties, string dataPath) { - return GetSeedRows().Select(row => CreateRowValues(properties, row)).Aggregate("", + return GetSeedRows(dataPath).Select(row => CreateRowValues(properties, row)).Aggregate("", (current, rowValues) => current == "" ? rowValues : current + ", " + rowValues); } - //TODO: use Development and Production rather than Debug and Release - private static List GetSeedRows() + private static List GetSeedRows(string dataPath) { -#if DEBUG - var path = Path.GetFullPath(Path.Combine(@"..\..\", DataDirectory)); -#else - var path = Path.GetFullPath(DataDirectory); -#endif - return JsonConvert.DeserializeObject>( - File.ReadAllText(path + Path.DirectorySeparatorChar + typeof(TEntityType).Name + ".json")); + try + { + return JsonConvert.DeserializeObject>( + File.ReadAllText(dataPath + Path.DirectorySeparatorChar + typeof(TEntityType).Name + ".json")); + } + catch (FileNotFoundException e) + { + Console.WriteLine(e.Message); + return new List(); + } } private static string CreateRowValues(IEnumerable properties, TEntityType row)