public FolderPathHelperTests() { var settings = new RoadieSettings(); IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddJsonFile("appsettings.test.json"); IConfiguration configuration = configurationBuilder.Build(); configuration.GetSection("RoadieSettings").Bind(settings); this.Configuration = settings; }
public ArtistLookupEngineTests() { this.MessageLogger = new EventMessageLogger(); this.MessageLogger.Messages += MessageLogger_Messages; var settings = new RoadieSettings(); IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddJsonFile("appsettings.test.json"); IConfiguration configuration = configurationBuilder.Build(); configuration.GetSection("RoadieSettings").Bind(settings); this.Configuration = settings; this.CacheManager = new DictionaryCacheManager(this.Logger, new CachePolicy(TimeSpan.FromHours(4))); this.HttpEncoder = new Encoding.DummyHttpEncoder(); }
public ID3TagsHelperTests() { this.MessageLogger = new EventMessageLogger(); this.MessageLogger.Messages += MessageLogger_Messages; var settings = new RoadieSettings(); IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddJsonFile("appsettings.test.json"); IConfiguration configuration = configurationBuilder.Build(); configuration.GetSection("RoadieSettings").Bind(settings); settings.ConnectionString = configuration.GetConnectionString("RoadieDatabaseConnection"); this.Configuration = settings; this.CacheManager = new DictionaryCacheManager(this.Logger, new CachePolicy(TimeSpan.FromHours(4))); this.TagsHelper = new ID3TagsHelper(this.Configuration, this.CacheManager, this.Logger); }
public Inspector() { Console.WriteLine("Roadie Media Inspector"); MessageLogger = new EventMessageLogger(); MessageLogger.Messages += MessageLogger_Messages; var settings = new RoadieSettings(); IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddJsonFile("appsettings.json", false); IConfiguration configuration = configurationBuilder.Build(); configuration.GetSection("RoadieSettings").Bind(settings); settings.ConnectionString = configuration.GetConnectionString("RoadieDatabaseConnection"); Configuration = settings; CacheManager = new DictionaryCacheManager(Logger, new CachePolicy(TimeSpan.FromHours(4))); TagsHelper = new ID3TagsHelper(Configuration, CacheManager, Logger); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var settings = new RoadieSettings(); _configuration.GetSection("RoadieSettings").Bind(settings); services.AddSingleton <ITokenService, TokenService>(); services.AddSingleton <IHttpEncoder, HttpEncoder>(); services.AddSingleton <IEmailSender, EmailSenderService>(); services.AddSingleton <ICacheManager>(options => { var logger = options.GetService <ILogger <MemoryCacheManager> >(); return(new MemoryCacheManager(logger, new CachePolicy(TimeSpan.FromHours(4)))); }); var dbFolder = new DirectoryInfo(settings.FileDatabaseOptions.DatabaseFolder); switch (settings.DbContextToUse) { case DbContexts.MySQL: services.AddDbContextPool <ApplicationUserDbContext>( options => options.UseMySql(_configuration.GetConnectionString("RoadieDatabaseConnection"), mySqlOptions => { mySqlOptions.EnableRetryOnFailure( 10, TimeSpan.FromSeconds(30), null); } )); services.AddDbContextPool <IRoadieDbContext, MySQLRoadieDbContext>( options => options.UseMySql(_configuration.GetConnectionString("RoadieDatabaseConnection"), mySqlOptions => { mySqlOptions.EnableRetryOnFailure( 10, TimeSpan.FromSeconds(30), null); } )); break; case DbContexts.SQLite: if (!dbFolder.Exists) { dbFolder.Create(); } var builder = new SqliteConnectionStringBuilder() { DataSource = Path.Combine(settings.FileDatabaseOptions.DatabaseFolder, $"{ settings.FileDatabaseOptions.DatabaseName }.db"), Mode = SqliteOpenMode.ReadWriteCreate, Cache = SqliteCacheMode.Shared }; services.AddDbContext <ApplicationUserDbContext>( options => options.UseSqlite(builder.ConnectionString) ); services.AddDbContext <IRoadieDbContext, SQLiteRoadieDbContext>( options => options.UseSqlite(builder.ConnectionString) ); break; case DbContexts.File: if (!dbFolder.Exists) { dbFolder.Create(); } services.AddDbContext <ApplicationUserDbContext>( options => options.UseFileContextDatabase(settings.FileDatabaseOptions.DatabaseFormat.ToString().ToLower(), databaseName: settings.FileDatabaseOptions.DatabaseName, location: settings.FileDatabaseOptions.DatabaseFolder) ); services.AddDbContext <IRoadieDbContext, FileRoadieDbContext>( options => options.UseFileContextDatabase(settings.FileDatabaseOptions.DatabaseFormat.ToString().ToLower(), databaseName: settings.FileDatabaseOptions.DatabaseName, location: settings.FileDatabaseOptions.DatabaseFolder) ); break; default: throw new NotImplementedException("Unknown DbContext Type"); } services.AddIdentity <User, UserRole>() .AddRoles <UserRole>() .AddEntityFrameworkStores <ApplicationUserDbContext>() .AddDefaultTokenProviders(); services.AddAuthorization(options => { options.AddPolicy("Admin", policy => policy.RequireRole("Admin")); options.AddPolicy("Editor", policy => policy.RequireRole("Admin", "Editor")); }); services.Configure <IConfiguration>(_configuration); var corsOrigins = (_configuration["CORSOrigins"] ?? "http://localhost:8080").Split('|'); Trace.WriteLine($"Setting Up CORS Policy [{string.Join(", ", corsOrigins)}]"); services.AddCors(options => options.AddPolicy("CORSPolicy", builder => { builder .WithOrigins(corsOrigins) .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); })); services.AddSingleton <IRoadieSettings, RoadieSettings>(ctx => { var settings = new RoadieSettings(); var configuration = ctx.GetService <IConfiguration>(); configuration.GetSection("RoadieSettings").Bind(settings); var hostingEnvironment = ctx.GetService <IWebHostEnvironment>(); settings.ContentPath = hostingEnvironment.WebRootPath; settings.ConnectionString = _configuration.GetConnectionString("RoadieDatabaseConnection"); // This is so 'User Secrets' can be used in Debugging var integrationKeys = _configuration.GetSection("IntegrationKeys").Get <IntegrationKey>(); if (integrationKeys != null) { settings.Integrations.ApiKeys = new List <ApiKey> { new ApiKey { ApiName = "LastFMApiKey", Key = integrationKeys.LastFMApiKey, KeySecret = integrationKeys.LastFMSecret }, new ApiKey { ApiName = "DiscogsConsumerKey", Key = integrationKeys.DiscogsConsumerKey, KeySecret = integrationKeys.DiscogsConsumerSecret }, new ApiKey { ApiName = "BingImageSearch", Key = integrationKeys.BingImageSearch } } } ; return(settings); }); services.AddSingleton <IActionContextAccessor, ActionContextAccessor>(); services.AddSingleton <IDefaultNotFoundImages, DefaultNotFoundImages>(); services.AddSingleton <IImageSearchManager, ImageSearchManager>(); services.AddSingleton <IITunesSearchEngine, ITunesSearchEngine>(); services.AddSingleton <IBingImageSearchEngine, BingImageSearchEngine>(); services.AddSingleton <IMusicBrainzProvider, MusicBrainzProvider>(); services.AddSingleton <ISpotifyHelper, SpotifyHelper>(); services.AddSingleton <IDiscogsHelper, DiscogsHelper>(); services.AddSingleton <IWikipediaHelper, WikipediaHelper>(); services.AddSingleton <IFileNameHelper, FileNameHelper>(); services.AddSingleton <IID3TagsHelper, ID3TagsHelper>(); services.AddScoped <ILastFmHelper, LastFmHelper>(); services.AddScoped <IRoadieScrobbler, RoadieScrobbler>(); services.AddScoped <ILastFMScrobbler, LastFMScrobbler>(); services.AddScoped <IStatisticsService, StatisticsService>(); services.AddScoped <ICollectionService, CollectionService>(); services.AddScoped <IPlaylistService, PlaylistService>(); services.AddScoped <IBookmarkService, BookmarkService>(); services.AddScoped <IArtistLookupEngine, ArtistLookupEngine>(); services.AddScoped <IReleaseLookupEngine, ReleaseLookupEngine>(); services.AddScoped <ILabelLookupEngine, LabelLookupEngine>(); services.AddScoped <IAudioMetaDataHelper, AudioMetaDataHelper>(); services.AddScoped <IFileProcessor, FileProcessor>(); services.AddScoped <IFileDirectoryProcessorService, FileDirectoryProcessorService>(); services.AddScoped <IArtistService, ArtistService>(); services.AddScoped <IImageService, ImageService>(); services.AddScoped <IReleaseService, ReleaseService>(); services.AddScoped <ITrackService, TrackService>(); services.AddScoped <ILabelService, LabelService>(); services.AddScoped <IPlaylistService, PlaylistService>(); services.AddScoped <IPlayActivityService, PlayActivityService>(); services.AddScoped <IScrobbleHandler, ScrobbleHandler>(); services.AddScoped <IGenreService, GenreService>(); services.AddScoped <ISubsonicService, SubsonicService>(); services.AddScoped <IUserService, UserService>(); services.AddScoped <IAdminService, AdminService>(); services.AddScoped <ILookupService, LookupService>(); services.AddScoped <ICommentService, CommentService>(); services.AddSingleton <Microsoft.Extensions.Hosting.IHostedService, DlnaHostService>(); var securityKey = new SymmetricSecurityKey(Encoding.Default.GetBytes(_configuration["Tokens:PrivateKey"])); services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(config => { config.RequireHttpsMetadata = false; config.SaveToken = true; config.TokenValidationParameters = new TokenValidationParameters { IssuerSigningKey = securityKey, ValidateAudience = true, ValidAudience = _configuration["Tokens:Audience"], ValidateIssuer = true, ValidIssuer = _configuration["Tokens:Issuer"], ValidateLifetime = true, ValidateIssuerSigningKey = true }; }); //services.AddSwaggerGen(c => //{ // c.SwaggerDoc("v1", new Info // { // Title = "Roadie API", // Version = "v1" // }); //}); services.AddSignalR(); services.AddMvc(options => { options.RespectBrowserAcceptHeader = true; // false by default options.ModelBinderProviders.Insert(0, new SubsonicRequestBinderProvider()); }) .AddNewtonsoftJson(options => { options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; }) .AddXmlSerializerFormatters(); services.Configure <IdentityOptions>(options => { options.Password.RequireDigit = true; options.Password.RequireLowercase = true; options.Password.RequireNonAlphanumeric = true; options.Password.RequireUppercase = true; options.Password.RequiredLength = 6; options.Password.RequiredUniqueChars = 1; }); services.AddHttpContextAccessor(); services.AddScoped <IHttpContext>(factory => { var actionContext = factory.GetService <IActionContextAccessor>().ActionContext; if (actionContext == null) { return(null); } return(new HttpContext(factory.GetService <IRoadieSettings>(), new UrlHelper(actionContext))); }); var sp = services.BuildServiceProvider(); var adminService = sp.GetService <IAdminService>(); adminService.PerformStartUpTasks(); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddSingleton <ITokenService, TokenService>(); services.AddSingleton <IHttpEncoder, HttpEncoder>(); services.AddSingleton <IEmailSender, EmailSenderService>(); var cacheManager = new DictionaryCacheManager(this._loggerFactory.CreateLogger <DictionaryCacheManager>(), new CachePolicy(TimeSpan.FromHours(4))); services.AddSingleton <ICacheManager>(cacheManager); services.AddDbContextPool <ApplicationUserDbContext>( options => options.UseMySql(this._configuration.GetConnectionString("RoadieDatabaseConnection"), mySqlOptions => { mySqlOptions.ServerVersion(new Version(5, 5), Pomelo.EntityFrameworkCore.MySql.Infrastructure.ServerType.MariaDb); mySqlOptions.EnableRetryOnFailure( maxRetryCount: 10, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null); } )); services.AddDbContextPool <IRoadieDbContext, RoadieDbContext>( options => options.UseMySql(this._configuration.GetConnectionString("RoadieDatabaseConnection"), mySqlOptions => { mySqlOptions.ServerVersion(new Version(5, 5), Pomelo.EntityFrameworkCore.MySql.Infrastructure.ServerType.MariaDb); mySqlOptions.EnableRetryOnFailure( maxRetryCount: 10, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null); } )); services.AddIdentity <ApplicationUser, ApplicationRole>() .AddRoles <ApplicationRole>() .AddEntityFrameworkStores <ApplicationUserDbContext>() .AddDefaultTokenProviders(); services.AddAuthorization(options => { options.AddPolicy("Admin", policy => policy.RequireRole("Admin")); options.AddPolicy("Editor", policy => policy.RequireRole("Admin", "Editor")); }); services.Configure <IConfiguration>(this._configuration); var corsOrigins = (this._configuration["CORSOrigins"] ?? "http://localhost:8080").Split('|'); this.Logger.LogDebug("Setting Up CORS Policy [{0}]", string.Join(", ", corsOrigins)); services.AddCors(options => options.AddPolicy("CORSPolicy", builder => { builder .WithOrigins(corsOrigins) .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); })); services.AddSingleton <IRoadieSettings, RoadieSettings>(ctx => { var settings = new RoadieSettings(); var configuration = ctx.GetService <IConfiguration>(); configuration.GetSection("RoadieSettings").Bind(settings); var hostingEnvironment = ctx.GetService <IHostingEnvironment>(); settings.ContentPath = hostingEnvironment.WebRootPath; settings.ConnectionString = this._configuration.GetConnectionString("RoadieDatabaseConnection"); // This is so 'User Secrets' can be used in Debugging var integrationKeys = this._configuration.GetSection("IntegrationKeys") .Get <IntegrationKey>(); if (integrationKeys != null) { settings.Integrations.ApiKeys = new System.Collections.Generic.List <ApiKey> { new ApiKey { ApiName = "LastFMApiKey", Key = integrationKeys.LastFMApiKey, KeySecret = integrationKeys.LastFMSecret }, new ApiKey { ApiName = "DiscogsConsumerKey", Key = integrationKeys.DiscogsConsumerKey, KeySecret = integrationKeys.DiscogsConsumerSecret }, new ApiKey { ApiName = "BingImageSearch", Key = integrationKeys.BingImageSearch } }; } return(settings); }); services.AddSingleton <IActionContextAccessor, ActionContextAccessor>(); services.AddSingleton <IDefaultNotFoundImages, DefaultNotFoundImages>(); services.AddScoped <IStatisticsService, StatisticsService>(); services.AddScoped <ICollectionService, CollectionService>(); services.AddScoped <IPlaylistService, PlaylistService>(); services.AddScoped <IBookmarkService, BookmarkService>(); services.AddScoped <IArtistService, ArtistService>(); services.AddScoped <IImageService, ImageService>(); services.AddScoped <IReleaseService, ReleaseService>(); services.AddScoped <ITrackService, TrackService>(); services.AddScoped <ILabelService, LabelService>(); services.AddScoped <IPlaylistService, PlaylistService>(); services.AddScoped <IPlayActivityService, PlayActivityService>(); services.AddScoped <IGenreService, GenreService>(); services.AddScoped <ISubsonicService, SubsonicService>(); services.AddScoped <IUserService, UserService>(); services.AddScoped <IAdminService, AdminService>(); services.AddScoped <ILookupService, LookupService>(); var securityKey = new SymmetricSecurityKey(System.Text.Encoding.Default.GetBytes(this._configuration["Tokens:PrivateKey"])); services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(config => { config.RequireHttpsMetadata = false; config.SaveToken = true; config.TokenValidationParameters = new TokenValidationParameters() { IssuerSigningKey = securityKey, ValidateAudience = true, ValidAudience = this._configuration["Tokens:Audience"], ValidateIssuer = true, ValidIssuer = this._configuration["Tokens:Issuer"], ValidateLifetime = true, ValidateIssuerSigningKey = true }; }); //services.AddSwaggerGen(c => //{ // c.SwaggerDoc("v1", new Info // { // Title = "Roadie API", // Version = "v1" // }); //}); services.AddSignalR(); services.AddMvc(options => { options.RespectBrowserAcceptHeader = true; // false by default options.ModelBinderProviders.Insert(0, new SubsonicRequestBinderProvider()); }) .AddJsonOptions(options => { options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; }) .AddXmlSerializerFormatters() .SetCompatibilityVersion(CompatibilityVersion.Latest); services.Configure <IdentityOptions>(options => { options.Password.RequireDigit = true; options.Password.RequireLowercase = true; options.Password.RequireNonAlphanumeric = true; options.Password.RequireUppercase = true; options.Password.RequiredLength = 6; options.Password.RequiredUniqueChars = 1; }); services.AddHttpContextAccessor(); services.AddScoped <IHttpContext>(factory => { var actionContext = factory.GetService <IActionContextAccessor>() .ActionContext; return(new HttpContext(factory.GetService <IRoadieSettings>(), new UrlHelper(actionContext))); }); }