mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-12 16:22:55 -07:00
Updated to .net core 3.0
This commit is contained in:
parent
b07833e0e8
commit
379ffeddba
13 changed files with 66 additions and 163 deletions
|
@ -1,7 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
||||
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -120,8 +120,8 @@ namespace Ombi.DependencyInjection
|
|||
|
||||
public static void RegisterApi(this IServiceCollection services)
|
||||
{
|
||||
services.AddSingleton<IApi, Api.Api>();
|
||||
services.AddSingleton<IOmbiHttpClient, OmbiHttpClient>(); // https://blogs.msdn.microsoft.com/alazarev/2017/12/29/disposable-finalizers-and-httpclient/
|
||||
services.AddScoped<IApi, Api.Api>();
|
||||
services.AddScoped<IOmbiHttpClient, OmbiHttpClient>(); // https://blogs.msdn.microsoft.com/alazarev/2017/12/29/disposable-finalizers-and-httpclient/
|
||||
services.AddTransient<IMovieDbApi, Api.TheMovieDb.TheMovieDbApi>();
|
||||
services.AddTransient<IPlexApi, PlexApi>();
|
||||
services.AddTransient<IEmbyApi, EmbyApi>();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
||||
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
||||
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
||||
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -39,11 +39,11 @@ namespace Ombi.Schedule
|
|||
// .Build();
|
||||
//}
|
||||
|
||||
public static async Task UseQuartz(this IApplicationBuilder app)
|
||||
public static async Task UseQuartz(this IServiceProvider app)
|
||||
{
|
||||
// Job Factory through IOC container
|
||||
var jobFactory = (IJobFactory)app.ApplicationServices.GetService(typeof(IJobFactory));
|
||||
var service = (ISettingsService<JobSettings>)app.ApplicationServices.GetService(typeof(ISettingsService<JobSettings>));
|
||||
var jobFactory = (IJobFactory)app.GetService(typeof(IJobFactory));
|
||||
var service = (ISettingsService<JobSettings>)app.GetService(typeof(ISettingsService<JobSettings>));
|
||||
var s = service.GetSettings();
|
||||
// Set job factory
|
||||
OmbiQuartz.Instance.UseJobFactory(jobFactory);
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
||||
<PropertyGroup><TargetFramework>netcoreapp3.0</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
||||
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<Project ToolsVersion="15.0" Sdk="Microsoft.NET.Sdk.Web">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
||||
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||
<RuntimeIdentifiers>win10-x64;win10-x86;osx-x64;linux-x64;linux-arm;linux-arm64;</RuntimeIdentifiers>
|
||||
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
|
||||
<TypeScriptToolsVersion>Latest</TypeScriptToolsVersion>
|
||||
|
@ -58,14 +58,8 @@
|
|||
<PackageReference Include="AutoMapper" Version="6.1.1" />
|
||||
<PackageReference Include="CommandLineParser" Version="2.4.3" />
|
||||
<PackageReference Include="Hangfire.AspNetCore" Version="1.7.1" />
|
||||
<PackageReference Include="Hangfire.Console" Version="1.4.2" />
|
||||
<PackageReference Include="Hangfire.MemoryStorage.Core" Version="1.4.0" />
|
||||
<PackageReference Include="Hangfire.RecurringJobExtensions" Version="1.1.6" />
|
||||
<PackageReference Include="Hangfire.SQLite" Version="1.4.2" />
|
||||
|
||||
<PackageReference Include="Microsoft.AspNetCore.App" />
|
||||
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Api.Analyzers" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="2.2.0" />
|
||||
|
@ -75,8 +69,11 @@
|
|||
<PackageReference Include="Serilog.Sinks.File" Version="4.0.0" />
|
||||
<PackageReference Include="Serilog.Sinks.RollingFile" Version="3.3.1-dev-00771" />
|
||||
<PackageReference Include="Serilog.Sinks.SQLite" Version="4.0.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="4.0.1" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0-rc4" />
|
||||
<PackageReference Include="System.Security.Cryptography.Csp" Version="4.3.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="3.0.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="3.0.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -9,6 +9,7 @@ using CommandLine;
|
|||
using CommandLine.Text;
|
||||
using Microsoft.AspNetCore;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Ombi.Helpers;
|
||||
|
||||
namespace Ombi
|
||||
|
@ -115,7 +116,7 @@ namespace Ombi
|
|||
|
||||
Console.WriteLine($"We are running on {urlValue}");
|
||||
|
||||
CreateWebHostBuilder(args).Build().Run();
|
||||
CreateHostBuilder(args).Build().Run();
|
||||
}
|
||||
|
||||
private static void DeleteSchedules()
|
||||
|
@ -283,11 +284,18 @@ namespace Ombi
|
|||
}
|
||||
}
|
||||
|
||||
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
|
||||
WebHost.CreateDefaultBuilder(args)
|
||||
.UseStartup<Startup>()
|
||||
public static IHostBuilder CreateHostBuilder(string[] args) =>
|
||||
Host.CreateDefaultBuilder(args)
|
||||
.ConfigureWebHostDefaults(webBuilder =>
|
||||
{
|
||||
webBuilder.ConfigureKestrel(serverOptions =>
|
||||
{
|
||||
// Set properties and call methods on options
|
||||
});
|
||||
webBuilder.PreferHostingUrls(true)
|
||||
.UseUrls(UrlArgs)
|
||||
.PreferHostingUrls(true);
|
||||
.UseStartup<Startup>();
|
||||
});
|
||||
|
||||
private static string HelpOutput(ParserResult<Options> args)
|
||||
{
|
||||
|
|
|
@ -3,21 +3,17 @@ using AutoMapper.EquivalencyExpression;
|
|||
using Hangfire;
|
||||
using Hangfire.Dashboard;
|
||||
using Hangfire.MemoryStorage;
|
||||
using Hangfire.SQLite;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.HttpOverrides;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.SpaServices;
|
||||
using Microsoft.AspNetCore.SpaServices.ReactDevelopmentServer;
|
||||
using Microsoft.AspNetCore.StaticFiles;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Ombi.Core.Authentication;
|
||||
using Ombi.Core.Settings;
|
||||
using Ombi.DependencyInjection;
|
||||
|
@ -33,6 +29,8 @@ using Serilog;
|
|||
using SQLitePCL;
|
||||
using System;
|
||||
using System.IO;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Newtonsoft.Json;
|
||||
using ILogger = Serilog.ILogger;
|
||||
|
||||
namespace Ombi
|
||||
|
@ -41,7 +39,7 @@ namespace Ombi
|
|||
{
|
||||
public static StoragePathSingleton StoragePath => StoragePathSingleton.Instance;
|
||||
|
||||
public Startup(IHostingEnvironment env)
|
||||
public Startup(IWebHostEnvironment env)
|
||||
{
|
||||
Console.WriteLine(env.ContentRootPath);
|
||||
var builder = new ConfigurationBuilder()
|
||||
|
@ -62,7 +60,7 @@ namespace Ombi
|
|||
public IConfigurationRoot Configuration { get; }
|
||||
|
||||
// This method gets called by the runtime. Use this method to add services to the container.
|
||||
public IServiceProvider ConfigureServices(IServiceCollection services)
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
{
|
||||
services.AddIdentity<OmbiUser, IdentityRole>()
|
||||
.AddEntityFrameworkStores<OmbiContext>()
|
||||
|
@ -86,8 +84,7 @@ namespace Ombi
|
|||
services.AddJwtAuthentication(Configuration);
|
||||
|
||||
services.AddMvc()
|
||||
.AddJsonOptions(x =>
|
||||
x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
|
||||
.AddNewtonsoftJson(x => x.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);
|
||||
|
||||
services.AddOmbiMappingProfile();
|
||||
services.AddAutoMapper(expression => { expression.AddCollectionMappers(); });
|
||||
|
@ -99,7 +96,9 @@ namespace Ombi
|
|||
services.AddHangfire(x =>
|
||||
{
|
||||
x.UseMemoryStorage();
|
||||
#pragma warning disable ASP0000 // Do not call 'IServiceCollection.BuildServiceProvider' in 'ConfigureServices'
|
||||
x.UseActivator(new IoCJobActivator(services.BuildServiceProvider()));
|
||||
#pragma warning restore ASP0000 // Do not call 'IServiceCollection.BuildServiceProvider' in 'ConfigureServices'
|
||||
});
|
||||
|
||||
SQLitePCL.raw.sqlite3_config(raw.SQLITE_CONFIG_MULTITHREAD);
|
||||
|
@ -112,38 +111,32 @@ namespace Ombi
|
|||
.AllowCredentials();
|
||||
}));
|
||||
|
||||
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
|
||||
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);
|
||||
services.AddSignalR();
|
||||
services.AddSpaStaticFiles(configuration =>
|
||||
{
|
||||
configuration.RootPath = "ClientApp/dist";
|
||||
});
|
||||
|
||||
// Build the intermediate service provider
|
||||
return services.BuildServiceProvider();
|
||||
}
|
||||
|
||||
// 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,
|
||||
IMemoryCache cache, IServiceProvider serviceProvider)
|
||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
|
||||
{
|
||||
app.UseForwardedHeaders(new ForwardedHeadersOptions
|
||||
{
|
||||
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
|
||||
});
|
||||
|
||||
app.UseQuartz().GetAwaiter().GetResult();
|
||||
serviceProvider.UseQuartz().GetAwaiter().GetResult();
|
||||
|
||||
var ctx = serviceProvider.GetService<IOmbiContext>();
|
||||
loggerFactory.AddSerilog();
|
||||
|
||||
app.UseHealthChecks("/health");
|
||||
|
||||
app.UseSpaStaticFiles();
|
||||
|
||||
|
||||
var ombiService =
|
||||
app.ApplicationServices.GetService<ISettingsService<OmbiSettings>>();
|
||||
serviceProvider.GetService<ISettingsService<OmbiSettings>>();
|
||||
var settings = ombiService.GetSettings();
|
||||
if (settings.ApiKey.IsNullOrEmpty())
|
||||
{
|
||||
|
@ -180,20 +173,7 @@ namespace Ombi
|
|||
|
||||
app.UseHangfireServer(new BackgroundJobServerOptions
|
||||
{WorkerCount = 1, ServerTimeout = TimeSpan.FromDays(1), ShutdownTimeout = TimeSpan.FromDays(1)});
|
||||
if (env.IsDevelopment())
|
||||
{
|
||||
app.UseHangfireDashboard(settings.BaseUrl.HasValue() ? $"{settings.BaseUrl}/hangfire" : "/hangfire",
|
||||
new DashboardOptions
|
||||
{
|
||||
Authorization = new[] {new HangfireAuthorizationFilter()}
|
||||
});
|
||||
}
|
||||
|
||||
GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute {Attempts = 3});
|
||||
|
||||
// Setup the scheduler
|
||||
//var jobSetup = app.ApplicationServices.GetService<IJobSetup>();
|
||||
//jobSetup.Setup();
|
||||
ctx.Seed();
|
||||
var settingsctx = serviceProvider.GetService<ISettingsContext>();
|
||||
var externalctx = serviceProvider.GetService<IExternalContext>();
|
||||
|
@ -207,7 +187,10 @@ namespace Ombi
|
|||
ContentTypeProvider = provider,
|
||||
});
|
||||
|
||||
app.UseRouting();
|
||||
|
||||
app.UseAuthentication();
|
||||
app.UseAuthorization();
|
||||
|
||||
app.UseMiddleware<ErrorHandlingMiddleware>();
|
||||
app.UseMiddleware<ApiKeyMiddlewear>();
|
||||
|
@ -226,9 +209,12 @@ namespace Ombi
|
|||
}
|
||||
});
|
||||
|
||||
app.UseSignalR(routes => { routes.MapHub<NotificationHub>("/hubs/notification"); });
|
||||
|
||||
app.UseMvcWithDefaultRoute();
|
||||
app.UseEndpoints(endpoints =>
|
||||
{
|
||||
endpoints.MapControllers();
|
||||
endpoints.MapHub<NotificationHub>("/hubs/notification");
|
||||
endpoints.MapHealthChecks("/health");
|
||||
});
|
||||
|
||||
app.UseSpa(spa =>
|
||||
{
|
||||
|
@ -240,24 +226,5 @@ namespace Ombi
|
|||
});
|
||||
|
||||
}
|
||||
|
||||
private static bool IsSpaRoute(HttpContext context)
|
||||
{
|
||||
var path = context.Request.Path;
|
||||
// This should probably be a compiled regex
|
||||
return path.StartsWithSegments("/static")
|
||||
|| path.StartsWithSegments("/sockjs-node")
|
||||
|| path.StartsWithSegments("/socket.io")
|
||||
|| path.ToString().Contains(".hot-update.");
|
||||
}
|
||||
|
||||
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
|
||||
{
|
||||
public bool Authorize(DashboardContext context)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,11 +5,13 @@ using System.Reflection;
|
|||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||||
using Microsoft.AspNetCore.JsonPatch.Operations;
|
||||
using Microsoft.AspNetCore.Mvc.ApiExplorer;
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
using Microsoft.OpenApi.Models;
|
||||
using Ombi.Config;
|
||||
using Ombi.Helpers;
|
||||
using Ombi.Models.Identity;
|
||||
|
@ -18,65 +20,34 @@ using Swashbuckle.AspNetCore.SwaggerGen;
|
|||
|
||||
namespace Ombi
|
||||
{
|
||||
public class AddRequiredHeaderParameter : IOperationFilter
|
||||
{
|
||||
|
||||
public void Apply(Operation operation, OperationFilterContext context)
|
||||
{
|
||||
if (operation.Parameters == null)
|
||||
operation.Parameters = new List<IParameter>();
|
||||
|
||||
operation.Parameters.Add(new NonBodyParameter
|
||||
{
|
||||
Name = "ApiKey",
|
||||
In = "header",
|
||||
Type = "apiKey",
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
public static class StartupExtensions
|
||||
{
|
||||
public static void AddSwagger(this IServiceCollection services)
|
||||
{
|
||||
services.AddSwaggerGen(c =>
|
||||
{
|
||||
c.DescribeAllEnumsAsStrings();
|
||||
c.SwaggerDoc("v1", new Info
|
||||
c.SwaggerDoc("v1", new OpenApiInfo()
|
||||
{
|
||||
Version = "v1",
|
||||
Title = "Ombi Api V1",
|
||||
Contact = new Contact
|
||||
Contact = new OpenApiContact
|
||||
{
|
||||
Name = "Jamie Rees",
|
||||
Url = "https://www.ombi.io/"
|
||||
Url = new Uri("https://www.ombi.io/")
|
||||
}
|
||||
});
|
||||
|
||||
var security = new Dictionary<string, IEnumerable<string>>
|
||||
{
|
||||
//{"Bearer", new string[] { }},
|
||||
{"ApiKey", new string[] { }},
|
||||
};
|
||||
|
||||
//c.AddSecurityDefinition("Bearer", new ApiKeyScheme
|
||||
//{
|
||||
// Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
|
||||
// Name = "Authorization",
|
||||
// In = "header",
|
||||
// Type = "apiKey"
|
||||
//});
|
||||
|
||||
c.AddSecurityDefinition("ApiKey", new ApiKeyScheme
|
||||
|
||||
c.AddSecurityDefinition("ApiKey", new OpenApiSecurityScheme
|
||||
{
|
||||
Description = "API Key provided by Ombi. Example: \"ApiKey: {token}\"",
|
||||
Name = "ApiKey",
|
||||
In = "header",
|
||||
Type = "apiKey"
|
||||
In = ParameterLocation.Header,
|
||||
Type = SecuritySchemeType.ApiKey
|
||||
});
|
||||
c.AddSecurityRequirement(security);
|
||||
c.CustomSchemaIds(x => x.FullName);
|
||||
c.OperationFilter<AddRequiredHeaderParameter>();
|
||||
var basePath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
|
||||
var xmlPath = Path.Combine(basePath, "Swagger.xml");
|
||||
try
|
||||
|
@ -89,22 +60,11 @@ namespace Ombi
|
|||
}
|
||||
|
||||
|
||||
c.OperationFilter<SwaggerOperationFilter>();
|
||||
c.DescribeAllParametersInCamelCase();
|
||||
});
|
||||
}
|
||||
|
||||
public class JwtBearer : SecurityScheme
|
||||
{
|
||||
public string Name { get; set; }
|
||||
|
||||
public string In { get; set; }
|
||||
|
||||
public JwtBearer()
|
||||
{
|
||||
this.Type = "bearer";
|
||||
}
|
||||
}
|
||||
|
||||
public static void AddAppSettingsValues(this IServiceCollection services, IConfigurationRoot configuration)
|
||||
{
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection.Metadata;
|
||||
using Microsoft.AspNetCore.Mvc.ApiExplorer;
|
||||
using Microsoft.AspNetCore.Mvc.Authorization;
|
||||
using Swashbuckle.AspNetCore.Swagger;
|
||||
using Swashbuckle.AspNetCore.SwaggerGen;
|
||||
|
||||
namespace Ombi
|
||||
{
|
||||
public class SwaggerOperationFilter : IOperationFilter
|
||||
{
|
||||
public string Name { get; private set; }
|
||||
|
||||
public SwaggerOperationFilter()
|
||||
{
|
||||
Name = "Authorization";
|
||||
}
|
||||
|
||||
public void Apply(Operation operation, OperationFilterContext context)
|
||||
{
|
||||
if (operation.Parameters == null)
|
||||
operation.Parameters = new List<IParameter>();
|
||||
var tokenAuthDict = new Dictionary<string, IEnumerable<string>> {{Name, new List<string>()}};
|
||||
operation.Security = new IDictionary<string, IEnumerable<string>>[] { tokenAuthDict };
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue