public bool ReloadData() { if (!HttpContext.User.Identity.IsAuthenticated) { throw new ApiException("You have to be logged in to modify data", 401); } string isSqLite = Configuration["data:useSqLite"]; try { if (isSqLite != "true") { context.Database.ExecuteSqlCommand(@" drop table Tracks; drop table Albums; drop table Artists; drop table Users; "); } else { // this is not reliable for mutliple connections context.Database.CloseConnection(); try { System.IO.File.Delete(Path.Combine(Directory.GetCurrentDirectory(), "AlbumViewerData.sqlite")); } catch { throw new ApiException("Can't reset data. Existing database is busy."); } } } catch { } CFSISDataImporter.EnsureAlbumData(context, Path.Combine(HostingEnv.ContentRootPath, "albums.js")); return(true); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, CFSISContext albumContext, IConfiguration configuration) { // Serilog config Log.Logger = new LoggerConfiguration() .WriteTo.RollingFile(pathFormat: "logs\\log-{Date}.log") .CreateLogger(); if (env.IsDevelopment()) { loggerFactory .AddDebug() .AddConsole() .AddSerilog(); app.UseDeveloperExceptionPage(); } else { loggerFactory .AddSerilog(); app.UseExceptionHandler(errorApp => // Application level exception handler here - this is just a place holder errorApp.Run(async(context) => { context.Response.StatusCode = 500; context.Response.ContentType = "text/html"; await context.Response.WriteAsync("<html><body>\r\n"); await context.Response.WriteAsync( "We're sorry, we encountered an un-expected issue with your application.<br>\r\n"); // Capture the exception var error = context.Features.Get <IExceptionHandlerFeature>(); if (error != null) { // This error would not normally be exposed to the client await context.Response.WriteAsync("<br>Error: " + HtmlEncoder.Default.Encode(error.Error.Message) + "<br>\r\n"); } await context.Response.WriteAsync("<br><a href=\"/\">Home</a><br>\r\n"); await context.Response.WriteAsync("</body></html>\r\n"); await context.Response.WriteAsync(new string(' ', 512)); // Padding for IE })); } //app.UseHttpsRedirection(); Console.WriteLine("\r\nPlatform: " + System.Runtime.InteropServices.RuntimeInformation.OSDescription); string useSqLite = Configuration["Data:useSqLite"]; Console.WriteLine(useSqLite == "true" ? "SqLite" : "Sql Server"); app.UseAuthentication(); app.UseDatabaseErrorPage(); app.UseStatusCodePages(); app.UseDefaultFiles(); // so index.html is not required app.UseStaticFiles(); // Handle Lets Encrypt Route (before MVC processing!) // alternately use an MVC Route (in ConfigurationController) //app.UseRouter(r => //{ // r.MapGet(".well-known/acme-challenge/{id}", async (request, response, routeData) => // { // var id = routeData.Values["id"] as string; // var file = Path.Combine(env.WebRootPath, ".well-known","acme-challenge", id); // await response.SendFileAsync(file); // }); //}); //// put last so header configs like CORS or Cookies etc can fire app.UseMvcWithDefaultRoute(); // catch-all handler for HTML5 client routes - serve index.html app.Run(async context => { // Make sure Angular output was created in wwwroot // Running Angular in dev mode nukes output folder! // so it could be missing. if (env.WebRootPath == null) { throw new InvalidOperationException("wwwroot folder doesn't exist. Please recompile your Angular Project before accessing index.html. API calls will work fine."); } context.Response.ContentType = "text/html"; await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html")); }); // Initialize Database if it doesn't exist CFSISDataImporter.EnsureAlbumData(albumContext, Path.Combine(env.ContentRootPath, "albums.js")); }