using System.Linq; using Nancy; using Nancy.Authentication.Stateless; using Nancy.Bootstrapper; using Nancy.Bootstrappers.StructureMap; using Nancy.Json; using Nancy.LightningCache.Extensions; using Nancy.Routing; using Nancy.Security; using Newtonsoft.Json; using Sony.Filtr.AdminAPI.Modules; using Sony.Filtr.AdminAPI.ViewModels; using Sony.Filtr.Contracts.Entities; using Sony.Filtr.ErrorLogging; using System; using System.Globalization; using AutoMapper; using Sony.Filtr.AdminAPI.Modules.AppleMusic; using Sony.Filtr.AdminAPI.Modules.Buzz; using Sony.Filtr.AdminAPI.Modules.SpotifySpecific; using Sony.Filtr.AdminAPI.Modules.TrackPlaylistAdds.ViewModels; using Sony.Filtr.AdminAPI.ViewModels.AppleMusic; using Sony.Filtr.AdminAPI.ViewModels.AppleMusic.Chart; using Sony.Filtr.AdminAPI.ViewModels.Spotify.Browse; using Sony.Filtr.AppleMusic.Data; using Sony.Filtr.AppleMusic.Data.Streams; using Sony.Filtr.Contracts.Entities.Buzz; using Sony.Filtr.Core.SpotifyBrowse.Data; using Sony.Filtr.Playlists.Spotify; using Sony.Filtr.Playlists.Spotify.Model; using Sony.Filtr.SpotifyAnalytics.Data; using StructureMap; namespace Sony.Filtr.AdminAPI.Config { public class Bootstrapper : StructureMapNancyBootstrapper { protected override IContainer GetApplicationContainer() { var container = new Bootstrap.Bootstrapper().InitializeAsync().Result; container.Configure(config => config.For().Use()); return container; } protected override void ApplicationStartup(IContainer container, IPipelines pipelines) { JsonSettings.MaxJsonLength = Int32.MaxValue; InitializeAutoMapper(); InitializeAuthentication(pipelines); InitializeErrorLogging(container, pipelines); this.EnableLightningCache(container.GetInstance(), ApplicationPipelines, new UrlHashKeyGenerator(), container.GetInstance()); } private static void InitializeErrorLogging(IContainer container, IPipelines pipelines) { var errorLoggingManager = container.GetInstance(); pipelines.OnError.AddItemToEndOfPipeline((context, exception) => { var statusException = exception as NancyStatusException; if (statusException != null) { return new Response() { StatusCode = statusException.StatusCode, ReasonPhrase = statusException.Message }; } errorLoggingManager.LogError(exception); return null; }); } private static void InitializeAuthentication(IPipelines pipelines) { StatelessAuthentication.Enable(pipelines, new StatelessAuthenticationConfiguration(GetUserIdentity)); } private static IUserIdentity GetUserIdentity(NancyContext nancyContext) { if (nancyContext.Request.Headers.Keys.Contains("FiltrAuthentication")) { var filtrAuthenticationValue = nancyContext.Request.Headers["FiltrAuthentication"].FirstOrDefault(); if (IsValidFiltrApiKey(filtrAuthenticationValue)) { return new FiltrUserIdentity() { UserName = "Sony" }; } } return null; } private static bool IsValidFiltrApiKey(string apiKey) { return apiKey != null && apiKey == "C&R2{U9tja1F) { c.CreateMap(); c.CreateMap(); //AutoMapper.Mapper.CreateMap(); c.CreateMap(); c.CreateMap().ConvertUsing(link => link.Uri.ToString(CultureInfo.InvariantCulture)); c.CreateMap(); //c.CreateMap(); c.CreateMap(); c.CreateMap(); c.CreateMap(); c.CreateMap(); c.CreateMap(); c.CreateMap().ConvertUsing(artist => artist.Artist?.Name); c.CreateMap(); c.CreateMap(); c.CreateMap(); c.CreateMap(); c.CreateMap(); c.CreateMap(); c.CreateMap(); c.CreateMap().ForMember(p => p.CountryCode, opt => opt.MapFrom(pi => pi.Storefront)); c.CreateMap(); c.CreateMap(); c.CreateMap().ForMember(p => p.CountryCode, opt => opt.MapFrom(pi => pi.Storefront)); c.CreateMap(); c.CreateMap().ForMember(p => p.Country, opt => opt.MapFrom(pi => pi.Storefront)); c.CreateMap(); c.CreateMap(); c.CreateMap(); c.CreateMap(); c.CreateMap(); c.CreateMap(); }); } } }