using System; using System.Collections.Generic; using System.Linq; using Nancy; using Nancy.ModelBinding; using Sony.Filtr.Applications; using Sony.Filtr.Contracts.Entities; using Sony.Filtr.Core.Buzz; using Sony.Filtr.Core.EditorialPlaylists; using Sony.Filtr.Playlists.Spotify; using Sony.Filtr.SpotifyWebAPI; namespace Sony.Filtr.AdminAPI.Modules.Buzz { public class BuzzArtistModule : BaseModule { public BuzzArtistModule(BuzzArtistManager buzzArtistManager, ApplicationInstanceManager applicationInstanceManager, SpotifyPlaylistManager spotifyPlaylistManager, EditorialPlaylistManager editorialPlaylistManager, SpotifyWebApi spotifyWebApi) : base(applicationInstanceManager) { Get["GetBuzzArtists", "/buzz/artists"] = parameters => { var buzzArtists = buzzArtistManager.GetBuzzArtists(); return Response.AsJson(buzzArtists); }; Post["AddBuzzArtist", "/buzz/artists", true] = async (parameters,cx) => { var buzzArtistAdd = this.Bind(); if (buzzArtistAdd == null) return HttpStatusCode.BadRequest; var artistUri = new SpotifyLink(buzzArtistAdd.ArtistUri); if (!artistUri.IsArtist()) return HttpStatusCode.BadRequest; var artistId = artistUri.ExtractArtistID(); var existingBuzzArtist = buzzArtistManager.GetBuzzArtistBySpotifyId(artistId); if (existingBuzzArtist != null) return HttpStatusCode.Conflict; var spotifyArtists = await spotifyWebApi.GetAllArtistsAsync(new List {artistId}); if (spotifyArtists == null || !spotifyArtists.Any()) return HttpStatusCode.BadRequest; var spotifyArtist = spotifyArtists.First(); var addedArtist = buzzArtistManager.AddBuzzArtist(new BuzzArtist() { ArtistName = spotifyArtist.name, //ArtistSpotifyUserName = //TODO: Implement when we can get the connection between artist and profile SpotifyArtistId = spotifyArtist.id }); return Response.AsJson(addedArtist); }; Put["UpdateBuzzArtist", "/buzz/artists/{id}", true] = async (parameters, cx) => { int id; if (!int.TryParse((string)parameters.id, out id)) return HttpStatusCode.BadRequest; var existing = buzzArtistManager.GetBuzzArtist(id); if (existing == null) return HttpStatusCode.NotFound; var buzzArtist = this.Bind(); existing.ArtistSpotifyUserName = buzzArtist.ArtistSpotifyUserName; //We only update profile info. buzzArtistManager.UpdateBuzzArtist(existing); return Response.AsJson(existing); }; Delete["DeleteBuzzArtist", "/buzz/artists/{id}"] = parameters => { int id; if (!int.TryParse((string)parameters.id, out id)) return HttpStatusCode.BadRequest; var existing = buzzArtistManager.GetBuzzArtist(id); if (existing == null) return HttpStatusCode.NotFound; buzzArtistManager.DeleteBuzzArtist(existing); return HttpStatusCode.NoContent; }; Get["GetBuzzArtistPlaylist", "/buzz/artists/{artistId}/playlists", true] = async (parameters,cx) => { int id; if (!int.TryParse((string)parameters.id, out id)) return HttpStatusCode.BadRequest; var buzzArtist = buzzArtistManager.GetBuzzArtist(id); var playlists = spotifyPlaylistManager.GetPlaylistsForUser(buzzArtist.ArtistSpotifyUserName); var playlistAttributes = await editorialPlaylistManager.GetPlaylistAttributesAsync(playlists.Select(p => p.PlaylistUri)); var viewModels = playlists.Select(p => new BuzzArtistPlaylistViewModel() { Artist = buzzArtist.ArtistName, Followers = playlistAttributes.ContainsKey(p.PlaylistUri) ? playlistAttributes[p.PlaylistUri].Followers : null, SpotifyPlaylist = p, }).ToList(); return Response.AsJson(viewModels); }; Get["GetBuzzArtistSpotifyFollowers", "/buzz/artists/{artistId}/spotifyfollowerlog", true] = async (parameters, cx) => { int id; if (!int.TryParse((string)parameters.artistId, out id)) return HttpStatusCode.BadRequest; var buzzArtist = buzzArtistManager.GetBuzzArtist(id); if (buzzArtist == null) return HttpStatusCode.BadRequest; var startDate = DateTime.Today.AddDays(-30); var endDate = DateTime.Today; if (Request.Query.startDate != null) { startDate = DateTime.TryParse(Request.Query.startDate, out startDate); } if (Request.Query.endDate != null) { endDate = DateTime.TryParse(Request.Query.endDate, out endDate); } var logs = await buzzArtistManager.GetSpotifyArtistFollowerLogAsync(buzzArtist.SpotifyArtistId, startDate, endDate); return Response.AsJson(logs); }; } public class BuzzArtistAddObject { public string ArtistUri { get; set; } } public class BuzzArtistPlaylistViewModel { public string Artist { get; set; } public long? Followers { get; set; } public SpotifyPlaylist SpotifyPlaylist { get; set; } } } }