using System; using System.Drawing; using System.Linq; using Nancy; using Nancy.IO; using Nancy.ModelBinding; using Sony.Filtr.Applications; using Sony.Filtr.Contracts.Entities; using Sony.Filtr.Core.Factory; using Sony.Filtr.Core.Seasons; namespace Sony.Filtr.AdminAPI.Modules.PublicData { public class SeasonModule : BaseModule { private readonly ImageFactory _imageFactory; private readonly SeasonManager _seasonManager; public SeasonModule(SeasonManager seasonManager, ImageFactory imageFactory, ApplicationInstanceManager applicationInstanceManager) : base(applicationInstanceManager) { _imageFactory = imageFactory; _seasonManager = seasonManager; Get["GetSeasons", "{countryCode}/Seasons"] = parameters => { var seasons = seasonManager.GetSeasons(CurrentApplication); return Response.AsJson(seasons); }; Post["AddSeason", "{countryCode}/Seasons"] = parameters => { var season = this.Bind(GetExcludedFields()); season.ApplicationId = CurrentApplication.ID; season = seasonManager.AddSeason(season); return Response.AsJson(season); }; Get["GetSingleSeason", "{countryCode}/Seasons/{id}"] = parameters => { int id = int.Parse((string)parameters.id); var season = seasonManager.GetSeason(id); if (season == null) return HttpStatusCode.NotFound; return Response.AsJson(season); }; Put["UpdateSeason", "{countryCode}/Seasons/{id}"] = parameters => { int id = int.Parse((string) parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; var season = this.Bind(GetExcludedFields()); season.Id = id; season.ApplicationId = CurrentApplication.ID; seasonManager.UpdateSeason(season); return Response.AsJson(season); }; Delete["DeleteSeason", "{countryCode}/Seasons/{id}"] = parameters => { var id = int.Parse(parameters.id); var season = seasonManager.GetSeason(id); seasonManager.DeleteSeason(season); return HttpStatusCode.NoContent; }; Get["GetActiveSeason", "{countryCode}/ActiveSeason"] = parameters => { var season = seasonManager.GetActiveSeason(CurrentApplication); return Response.AsJson(season); }; Post["SetActiveSeason", "{countryCode}/ActiveSeason"] = parameters => { var incomingSeason = this.Bind(); var season = seasonManager.GetSeason(incomingSeason.Id); if (season == null) return HttpStatusCode.NotFound; //check belonging? seasonManager.SetActiveSeason(CurrentApplication, season); return Response.AsJson(season); }; Get["GetSeasonHeaderBackgroundImage", "{countryCode}/Seasons/{id}/HeaderBackgroundImage"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; return GetOriginalStream(imageFactory, existingSeason.HeaderBackgroundImage); }; Get["GetSeasonHeaderBackgroundImageThumbnail", "{countryCode}/Seasons/{id}/HeaderBackgroundImage/thumbnail"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; return GetThumbnailStream(imageFactory, existingSeason.HeaderBackgroundImage); }; Put["SetSeasonHeaderBackgroundImage", "{countryCode}/Seasons/{id}/HeaderBackgroundImage"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; if (!imageFactory.IsValidImageAndAllowedFormat(Request.Body)) return HttpStatusCode.BadRequest; var fileName = ReplaceImage(existingSeason.HeaderBackgroundImage, Request.Body); existingSeason.HeaderBackgroundImage = fileName; _seasonManager.UpdateSeason(existingSeason); return Response.AsJson(existingSeason); }; Get["GetSeasonHeaderStartBackgroundImage", "{countryCode}/Seasons/{id}/HeaderStartBackgroundImage"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; return GetOriginalStream(imageFactory, existingSeason.HeaderStartBackgroundImage); }; Get["GetSeasonHeaderStartBackgroundImageThumbnail", "{countryCode}/Seasons/{id}/HeaderStartBackgroundImage/thumbnail"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; return GetThumbnailStream(imageFactory, existingSeason.HeaderStartBackgroundImage); }; Put["SetSeasonHeaderStartBackgroundImage", "{countryCode}/Seasons/{id}/HeaderStartBackgroundImage"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; if (!imageFactory.IsValidImageAndAllowedFormat(Request.Body)) return HttpStatusCode.BadRequest; var fileName = ReplaceImage(existingSeason.HeaderStartBackgroundImage, Request.Body); existingSeason.HeaderStartBackgroundImage = fileName; _seasonManager.UpdateSeason(existingSeason); return Response.AsJson(existingSeason); }; Get["GetSeasonHeaderPlaylistBackgroundImage", "{countryCode}/Seasons/{id}/HeaderPlaylistsBackgroundImage"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; return GetOriginalStream(imageFactory, existingSeason.HeaderPlaylistsBackgroundImage); }; Get["GetSeasonHeaderPlaylistBackgroundImageThumbnail", "{countryCode}/Seasons/{id}/HeaderPlaylistsBackgroundImage/thumbnail"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; return GetThumbnailStream(imageFactory, existingSeason.HeaderPlaylistsBackgroundImage); }; Put["SetSeasonHeaderPlaylistBackgroundImage", "{countryCode}/Seasons/{id}/HeaderPlaylistsBackgroundImage"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; if (!imageFactory.IsValidImageAndAllowedFormat(Request.Body)) return HttpStatusCode.BadRequest; var fileName = ReplaceImage(existingSeason.HeaderPlaylistsBackgroundImage, Request.Body); existingSeason.HeaderPlaylistsBackgroundImage = fileName; _seasonManager.UpdateSeason(existingSeason); return Response.AsJson(existingSeason); }; Get["GetSeasonHeaderReleasesBackgroundImage", "{countryCode}/Seasons/{id}/HeaderReleasesBackgroundImage"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; return GetOriginalStream(imageFactory, existingSeason.HeaderReleasesBackgroundImage); }; Get["GetSeasonHeaderReleasesBackgroundImageThumbnail", "{countryCode}/Seasons/{id}/HeaderReleasesBackgroundImage/thumbnail"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; return GetThumbnailStream(imageFactory, existingSeason.HeaderReleasesBackgroundImage); }; Put["SetSeasonHeaderReleasesBackgroundImage", "{countryCode}/Seasons/{id}/HeaderReleasesBackgroundImage"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; if (!imageFactory.IsValidImageAndAllowedFormat(Request.Body)) return HttpStatusCode.BadRequest; var fileName = ReplaceImage(existingSeason.HeaderReleasesBackgroundImage, Request.Body); existingSeason.HeaderReleasesBackgroundImage = fileName; _seasonManager.UpdateSeason(existingSeason); return Response.AsJson(existingSeason); }; Get["GetSeasonHeaderHeaderPlaylistBackgroundImage", "{countryCode}/Seasons/{id}/HeaderPlaylistBackgroundImage"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; return GetOriginalStream(imageFactory, existingSeason.HeaderPlaylistBackgroundImage); }; Get["GetSeasonHeaderHeaderPlaylistBackgroundImageThumbnail", "{countryCode}/Seasons/{id}/HeaderPlaylistBackgroundImage/thumbnail"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; return GetThumbnailStream(imageFactory, existingSeason.HeaderPlaylistBackgroundImage); }; Put["SetSeasonHeaderHeaderPlaylistBackgroundImage", "{countryCode}/Seasons/{id}/HeaderPlaylistBackgroundImage"] = parameters => { int id = int.Parse((string)parameters.id); var existingSeason = seasonManager.GetSeason(id); if (existingSeason == null) return HttpStatusCode.NotFound; if (!imageFactory.IsValidImageAndAllowedFormat(Request.Body)) return HttpStatusCode.BadRequest; var fileName = ReplaceImage(existingSeason.HeaderPlaylistBackgroundImage, Request.Body); existingSeason.HeaderPlaylistBackgroundImage = fileName; _seasonManager.UpdateSeason(existingSeason); return Response.AsJson(existingSeason); }; } private dynamic GetOriginalStream(ImageFactory imageFactory, string filename) { var org = imageFactory.GetOriginal(filename); return Response.FromStream(org, "img/png"); } private dynamic GetThumbnailStream(ImageFactory imageFactory, string filename) { var org = imageFactory.GetOriginal(filename); var thumbnail = imageFactory.ResizeImage(org, new Size(100, 200)); return Response.FromStream(thumbnail, "img/png"); } private string[] GetExcludedFields() { return new[] { "id", "HeaderBackgroundImage", "HeaderStartBackgroundImage", "HeaderPlaylistsBackgroundImage", "HeaderPlaylistBackgroundImage", "HeaderReleasesBackgroundImage" }; } private string ReplaceImage(string existingFileName, RequestStream requestStream) { if (!string.IsNullOrWhiteSpace(existingFileName)) _imageFactory.DeleteImage(existingFileName); var fileName = GenerateFileName(); _imageFactory.SaveImageAsync(fileName, requestStream).Wait(); return fileName; } private string GenerateFileName() { return Guid.NewGuid() + ".png"; } } }