using System; using System.Collections.Generic; using System.Linq; using Nancy; using Sony.Filtr.AdminAPI.ViewModels.Graph; using Sony.Filtr.Buzz; using Sony.Filtr.Contracts.Abstractions; using Sony.Filtr.Contracts.Entities; using Sony.Filtr.Utility.Extensions; using Sony.Filtr.Core.Buzz; using Sony.Filtr.Core.SpotifyUserFollowers; using Sony.Filtr.Utility; namespace Sony.Filtr.AdminAPI.Modules { public class UserGraphModule : BaseModule { private readonly BuzzAccountManager _buzzAccountManager; private readonly SpotifyUserFollowersManager _spotifyUserFollowersManager; public UserGraphModule(IApplicationInstanceManager applicationInstanceManager, BuzzAccountManager buzzAccountManager, SpotifyUserFollowersManager spotifyUserFollowersManager) : base(applicationInstanceManager) { _buzzAccountManager = buzzAccountManager; _spotifyUserFollowersManager = spotifyUserFollowersManager; Get["UserFollowersGraph", "/userGraph/followers", true] = async (parameters, cx) => { string userUri = (string)Request.Query.userUri; DateTime startDate = Maybe.ToDateTimeOrFallback((string)Request.Query.startDate, DateTime.Today.AddDays(-30)); DateTime endDate = Maybe.ToDateTimeOrFallback((string)Request.Query.endDate, DateTime.Today); if (string.IsNullOrWhiteSpace(userUri)) return HttpStatusCode.BadRequest; var username = new SpotifyLink(userUri).ExtractSpotifyUserName(); if (string.IsNullOrWhiteSpace(username)) return HttpStatusCode.BadRequest; var artistFollowers = await spotifyUserFollowersManager.GetFollowerDataAsync(username, startDate.AddDays(-1), endDate); var total = artistFollowers.Skip(1).Select(s => new GraphEntry() { Date = s.Date, Value = s.Followers }).OrderBy(e => e.Date).ToList(); var change = GraphViewModelHelper.BuildDailyChange(total).ToList(); List series = new List(); series.Add(new FollowerSeriesViewModel { FollowerType = FollowerStatType.Total.ToString(), Entries = total }); series.Add(new FollowerSeriesViewModel { FollowerType = FollowerStatType.DailyChange.ToString(), Entries = change }); var viewModel = new FollowersGraphViewModel { Series = series, Filter = new FollowersFilter() { StartDate = startDate, EndDate = endDate, UserUri = userUri, } }; return Response.AsJson(viewModel); }; } } }