using System.Linq; using Nancy; using Nancy.ModelBinding; using Sony.Filtr.AdminAPI.BusinessLogic; using Sony.Filtr.Applications; using Sony.Filtr.Contracts.Entities; using Sony.Filtr.Core.EditorialPlaylists; using Sony.Filtr.DeezerAPI; using Sony.Filtr.Playlists; using Sony.Filtr.Playlists.Deezer; using Sony.Filtr.Playlists.Spotify; using Sony.Filtr.SpotifyWebAPI; namespace Sony.Filtr.AdminAPI.Modules.EditorialPlaylist { public class EditorialPlaylistModuleNew : BaseModule { private readonly EditorialPlaylistStatsManager _editorialPlaylistStatsManager; private readonly EditorialPlaylistManagerNew _editorialPlaylistManager; private readonly SpotifyWebApi _spotifyWebApi; private readonly SpotifyPlaylistManager _spotifyPlaylistManager; private readonly DeezerApi _deezerApi; private readonly DeezerPlaylistManager _deezerPlaylistManager; public EditorialPlaylistModuleNew(EditorialPlaylistBusinessLogic editorialPlaylistBusinessLogic, EditorialPlaylistStatsManager editorialPlaylistStatsManager, EditorialPlaylistManagerNew editorialPlaylistManagerNew, ApplicationInstanceManager applicationInstanceManager, SpotifyWebApi spotifyWebApi, SpotifyPlaylistManager spotifyPlaylistManager, DeezerApi deezerApi, DeezerPlaylistManager deezerPlaylistManager) : base(applicationInstanceManager) { _editorialPlaylistStatsManager = editorialPlaylistStatsManager; _editorialPlaylistManager = editorialPlaylistManagerNew; _spotifyWebApi = spotifyWebApi; _spotifyPlaylistManager = spotifyPlaylistManager; _deezerApi = deezerApi; _deezerPlaylistManager = deezerPlaylistManager; Get["/new/{countryCode?}/EditorialPlaylists", true] = async (parameters, cx) => { var playlists = await _editorialPlaylistManager.GetPlaylistsAsync(CurrentApplication); //var attributes = await _editorialPlaylistManager.LoadAttributesAsync(playlist.SpotifyLinkUri); //var viewModel = BuildPlaylistViewModel(playlist, attributes); return Response.AsJson(playlists); }; Post["/new/{countryCode}/editorialPlaylists", true] = async (o, token) => { var addViewModel = this.Bind(); var editorialPlaylist = new EditorialPlaylistNew() { ApplicationID = CurrentApplication.ID, DisplayName = addViewModel.DisplayName, }; _editorialPlaylistManager.AddPlaylist(editorialPlaylist); return Response.AsJson(editorialPlaylist); }; Delete["/new/{countryCode?}/editorialPlaylists/{id}", true] = async (parameters, token) => { var id = (int) parameters.id; var playlist = await _editorialPlaylistManager.GetPlaylistAsync(id); if (playlist == null) return HttpStatusCode.NotFound; _editorialPlaylistManager.DeletePlaylist(id); return HttpStatusCode.NoContent; }; Delete["/new/{countryCode?}/editorialplaylists/{id}/spotifyPlaylist", true] = async (parameters, token) => { var id = (int)parameters.id; var playlist = await _editorialPlaylistManager.GetPlaylistAsync(id); if (playlist == null) return HttpStatusCode.NotFound; _editorialPlaylistManager.DisconnectFromSpotifyPlaylist(playlist); return Response.AsJson(await _editorialPlaylistManager.GetPlaylistAsync(id)); }; Put["/new/{countryCode?}/editorialplaylists/{id}/spotifyPlaylist", true] = async (parameters, token) => { var id = (int)parameters.id; var spotifyAddViewModel = this.Bind(); var playlist = await _editorialPlaylistManager.GetPlaylistAsync(id); var spotifyLink = new SpotifyLink(spotifyAddViewModel.SpotifyUri); if (!spotifyLink.IsPlaylist()) return HttpStatusCode.BadRequest; var spotifyPlaylist = await _spotifyWebApi.GetPlaylistByIdAsync(spotifyLink.ExtractPlaylistID()); if (spotifyPlaylist == null) return HttpStatusCode.BadRequest; var spotifyPlaylistToStore = BuildSpotifyPlaylist(spotifyPlaylist); _spotifyPlaylistManager.AddOrUpdateSpotifyPlaylist(spotifyPlaylistToStore); _editorialPlaylistManager.ConnectToSpotifyPlaylist(playlist, spotifyAddViewModel.SpotifyUri); return Response.AsJson(await _editorialPlaylistManager.GetPlaylistAsync(id)); }; Delete["/new/{countryCode?}/editorialplaylists/{id}/deezerPlaylist", true] = async (parameters, token) => { var id = (int) parameters.id; var playlist = await _editorialPlaylistManager.GetPlaylistAsync(id); if (playlist == null) return HttpStatusCode.NotFound; _editorialPlaylistManager.DisconnectFromDeezerPlaylist(playlist); return Response.AsJson(await _editorialPlaylistManager.GetPlaylistAsync(id)); }; Put["/new/{countryCode?}/editorialplaylists/{id}/deezerPlaylist", true] = async (parameters, token) => { var id = (int)parameters.id; var deezerAddViewModel = this.Bind(); var playlist = await _editorialPlaylistManager.GetPlaylistAsync(id); var deezerPlaylist = await _deezerApi.GetPlaylistAsync(deezerAddViewModel.DeezerId); if (deezerPlaylist == null) return HttpStatusCode.BadRequest; var deezerPlaylistToStore = BuildDeezerPlaylist(deezerPlaylist); _deezerPlaylistManager.AddOrUpdateDeezerPlaylist(deezerPlaylistToStore); _editorialPlaylistManager.ConnectToDeezerPlaylist(playlist, deezerAddViewModel.DeezerId); return Response.AsJson(await _editorialPlaylistManager.GetPlaylistAsync(id)); }; } private DeezerPlaylist BuildDeezerPlaylist(DeezerAPI.Model.PlaylistResponse deezerPlaylist) { return new DeezerPlaylist() { DeezerId = deezerPlaylist.id, Title = deezerPlaylist.title, CreatorId = deezerPlaylist.creator.id, CreatorName = deezerPlaylist.creator.name, Description = deezerPlaylist.description, Duration = deezerPlaylist.duration, Link = deezerPlaylist.link, Picture = deezerPlaylist.picture, Rating = deezerPlaylist.rating, TrackCount = deezerPlaylist.tracks.data.Count, }; } private SpotifyPlaylist BuildSpotifyPlaylist(SpotifyWebAPI.Model.PlaylistResponse spotifyPlaylist) { return new SpotifyPlaylist() { PlaylistUri = spotifyPlaylist.uri, Name = spotifyPlaylist.name, Description = spotifyPlaylist.description, User = spotifyPlaylist.owner.id, TrackCount = spotifyPlaylist.Tracks.total, //TODO: Image = //TODO: CountryCode = , //TODO: Duration = , //TODO: Image = }; } } public class EditorialPlaylistAddSpotifyViewModel { public string SpotifyUri { get; set; } } public class EditorialPlaylistAddDeezerViewModel { public int DeezerId { get; set; } } public class EditorialPlaylistAddViewModel { public string DisplayName { get; set; } public int? ThemeId { get; set; } } }