using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.ServiceModel; using System.ServiceModel.Activation; using System.ServiceModel.Web; using System.Threading.Tasks; using Sony.Filtr.API.Service; using Sony.Filtr.API.ViewModels.v3; using Sony.Filtr.API.WCF; using Sony.Filtr.Contracts.Abstractions; using Sony.Filtr.Contracts.Entities; using Sony.Filtr.PlaylistGeneration; namespace Sony.Filtr.API { [ServiceContract(Namespace = "JsonpAjaxService")] [ErrorHandler(typeof(ErrorHandler))] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class FiltrApiWorkout3 { public FiltrApiWorkout3(SpotifyService3 apiLogic, IApplicationInstanceManager applicationInstanceManager) { _api = apiLogic; _applicationInstanceManager = applicationInstanceManager; } private readonly SpotifyService3 _api; private readonly IApplicationInstanceManager _applicationInstanceManager; private Application GetWorkoutApplication(string market) { if (!string.IsNullOrWhiteSpace(market)) { int applicationId; if (int.TryParse(market, out applicationId)) { var application = _applicationInstanceManager.GetApplication(applicationId); if (application != null) return application; } } return _applicationInstanceManager.GetWorkoutFallbackApplication(); } private string GetService(string service) { if (service != null && service.Equals("spotify", StringComparison.InvariantCultureIgnoreCase)) return "OK!"; throw new WebFaultException(HttpStatusCode.BadRequest); } [OperationContract] [AspNetCacheProfile("CacheLongTime")] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/{market}/{countryCode}/tracks?tag={tag}&artist={artist}")] public async Task> GetTracks(string service, string countryCode, string market, string tag, string artist) { var application = GetWorkoutApplication(market); var selectedService = GetService(service); return await _api.GetTracks(application, countryCode, tag, artist); } [OperationContract] [AspNetCacheProfile("CacheLongTime")] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/{market}/tags?artist={artists}&tag={tags}")] public async Task> GetTags(string service, string[] artists, string[] tags, string market) { var application = GetWorkoutApplication(market); var selectedService = GetService(service); return await _api.GetTagsAsync(application, artists, tags); } [OperationContract] [AspNetCacheProfile("CacheShortTime")] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/{market}/season")] public SeasonViewModel GetSeason(string service, string market) { var application = GetWorkoutApplication(market); var selectedService = GetService(service); return _api.GetSeason(application); } [OperationContract] [AspNetCacheProfile("CacheShortTime")] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/{market}/autocomplete/{*searchString}")] public async Task> SearchServiceAutocomplete(string service, string searchString, string market) { var application = GetWorkoutApplication(market); //var selectedService = GetService(service); return await _api.SearchAutocompleteAsync(application, searchString); } [OperationContract] [AspNetCacheProfile("CacheShortTime")] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/{market}/releases")] public async Task> GetNewReleases(string service, string market) { var application = GetWorkoutApplication(market); //var selectedService = GetService(service); return await _api.GetNewReleasesAsync(application, null); //No countryCode filtering } [OperationContract] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/{market}/playlists")] public async Task> GetPlaylists(string service, string market) { var application = GetWorkoutApplication(market); var selectedService = GetService(service); var playlists = await _api.GetPlaylistsAsync(application); return playlists.ToList(); } [OperationContract] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/{market}/categories")] public List GetCategories(string service, string market) { var application = GetWorkoutApplication(market); var selectedService = GetService(service); return _api.GetCategories(application); } [OperationContract] [AspNetCacheProfile("CacheLongTime")] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/playlists/{playlistId}")] public PlaylistViewModel GetPlaylist(string service, string playlistId) { var selectedService = GetService(service); var playlist = _api.GetPlaylistAsync(playlistId).Result; if (playlist == null) throw new WebFaultException(HttpStatusCode.NotFound); return playlist; } [OperationContract] [AspNetCacheProfile("CacheLongTime")] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/{market}/playlists/{playlistUri}")] public async Task GetPlaylistByUri(string service, string market, string playlistUri) { var selectedService = GetService(service); var application = GetWorkoutApplication(market); var playlists = await _api.GetPlaylistsAsync(application); var playlist = playlists.FirstOrDefault(p => p.Uri == playlistUri); if (playlist == null) throw new WebFaultException(HttpStatusCode.NotFound); return playlist; } [OperationContract] [AspNetCacheProfile("CacheShortTime")] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/{market}/promoted")] public async Task> GetPromotedTracks(string service, string market) { var selectedService = GetService(service); var application = GetWorkoutApplication(market); return await _api.GetPromotedTracksAsync(application); } [OperationContract] [AspNetCacheProfile("CacheShortTime")] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/globalization/{language}")] public Dictionary GetGlobalizationForLanguage(string service, string language) { var selectedService = GetService(service); return _api.GetGlobalizationForLanguage(language); } [OperationContract] [AspNetCacheProfile("CacheLongTime")] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/{countryCode}/bootstrap")] public BootstrapViewModel GetBootstrap(string service, string countryCode) { var selectedService = GetService(service); var app = _applicationInstanceManager.GetWorkoutApplicationByCountrySpecialFallback(countryCode); return _api.GetWorkoutBootstrap(app); } [OperationContract] [AspNetCacheProfile("CacheShortTime")] [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "{service}/{market}/{countryCode}/searchTracks?artist={artist}&tag={tag}&minTempo={minTempo}&maxTempo={maxTempo}&minDanceability={minDanceability}&maxDanceability={maxDanceability}&minEnergy={minEnergy}&maxEnergy={maxEnergy}&minHotness={minHotness}&maxHotness={maxHotness}&minDuration={minDuration}&maxDuration={maxDuration}")] public async Task> SearchTracks(string service, string market, string countryCode, string[] artist, string tag, int? minTempo = null, int? maxTempo = null, double? minDanceability = null, double? maxDanceability = null, double? minEnergy = null, double? maxEnergy = null, double? minHotness = null, double? maxHotness = null, int? minDuration = null, int? maxDuration = null) { var selectedService = GetService(service); var application = GetWorkoutApplication(market); var searchTrackParameters = new SearchTracksParameters() { Tag = tag, Artists = artist, MinTempo = minTempo, MaxTempo = maxTempo, MinDanceability = HandleChangedFormat(minDanceability), MaxDanceability = HandleChangedFormat(maxDanceability), MinEnergy = HandleChangedFormat(minEnergy), MaxEnergy = HandleChangedFormat(maxEnergy), MinHotness = HandleChangedFormat(minHotness), MaxHotness = HandleChangedFormat(maxHotness), MinDuration = minDuration, MaxDuration = maxDuration, }; return await _api.SearchTracksAsync(application, countryCode, searchTrackParameters); } private static double? HandleChangedFormat(double? filterParameter) { return filterParameter.HasValue ? (double?)filterParameter.Value / 100.0 : null; } } }