From 59895af3b4d0f4da062a8a06aa3f446f1d660781 Mon Sep 17 00:00:00 2001 From: amazing-username Date: Sat, 13 Jul 2019 16:04:39 -0400 Subject: [PATCH] Can download a cover art via the cover art's id. Just need to have a stock cover art for songs without any and update the documentation. #50 --- Controllers/Managers/CoverArtManager.cs | 1 + Controllers/v1/CoverArtController.cs | 46 ++++++-- Startup.cs | 136 ++++++++++++------------ 3 files changed, 107 insertions(+), 76 deletions(-) diff --git a/Controllers/Managers/CoverArtManager.cs b/Controllers/Managers/CoverArtManager.cs index 2e02024..79f5f9e 100644 --- a/Controllers/Managers/CoverArtManager.cs +++ b/Controllers/Managers/CoverArtManager.cs @@ -35,6 +35,7 @@ namespace Icarus.Controllers.Managers song.CoverArtId = coverArt.CoverArtId; } + public CoverArt SaveCoverArt(Song song) { try diff --git a/Controllers/v1/CoverArtController.cs b/Controllers/v1/CoverArtController.cs index 10289bc..a9dab75 100644 --- a/Controllers/v1/CoverArtController.cs +++ b/Controllers/v1/CoverArtController.cs @@ -1,14 +1,19 @@ using System; using System.Collections.Generic; +using System.IO; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; +using Icarus.Controllers.Managers; +using Icarus.Database.Repositories; +using Icarus.Models; + namespace Icarus.Controllers.V1 { - [Route("api/v1/coverart/song")] + [Route("api/v1/coverart")] [ApiController] public class CoverArtController : ControllerBase { @@ -19,18 +24,39 @@ namespace Icarus.Controllers.V1 #region Constructors public CoverArtController(ILogger logger) - { - _logger = logger; - } - #endregion + { + _logger = logger; + } + #endregion #region HTTP Routes - [HttpGet("{id}")] - public IActionResult Get(int id) - { - return NotFound(); - } + [HttpGet("{id}")] + [Authorize("download:cover_art")] + public IActionResult Get(int id) + { + var coverArt = new CoverArt + { + CoverArtId = id + }; + + var coverArtRepository = HttpContext + .RequestServices + .GetService( + typeof(CoverArtRepository)) as CoverArtRepository; + + coverArt = coverArtRepository.GetCoverArt(coverArt); + + if (coverArt != null) + { + var coverArtBytes = System.IO.File.ReadAllBytes( + coverArt.ImagePath); + return File(coverArtBytes, "application/x-msdownload", + coverArt.SongTitle); + } + else + return NotFound(); + } #endregion } } diff --git a/Startup.cs b/Startup.cs index 056a957..5d0ddbf 100644 --- a/Startup.cs +++ b/Startup.cs @@ -41,62 +41,66 @@ namespace Icarus // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { - services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); - services.AddSingleton(Configuration); + services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); + services.AddSingleton(Configuration); - string domain = $"https://{Configuration["Auth0:Domain"]}/"; + string domain = $"https://{Configuration["Auth0:Domain"]}/"; - services.AddAuthentication(options => - { - options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - }).AddJwtBearer(options => - { - options.Authority = domain; - options.Audience = Configuration["Auth0:ApiIdentifier"]; - }); + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + }).AddJwtBearer(options => + { + options.Authority = domain; + options.Audience = Configuration["Auth0:ApiIdentifier"]; + }); - services.AddAuthorization(options => - { - options.AddPolicy("download:songs", policy => - policy.Requirements - .Add(new HasScopeRequirement("download:songs", domain))); + services.AddAuthorization(options => + { + options.AddPolicy("download:songs", policy => + policy.Requirements + .Add(new HasScopeRequirement("download:songs", domain))); - options.AddPolicy("upload:songs", policy => - policy.Requirements - .Add(new HasScopeRequirement("upload:songs", domain))); + options.AddPolicy("download:cover_art", policy => + policy.Requirements + .Add(new HasScopeRequirement("download:cover_art", domain))); - options.AddPolicy("delete:songs", policy => - policy.Requirements - .Add(new HasScopeRequirement("delete:songs", domain))); + options.AddPolicy("upload:songs", policy => + policy.Requirements + .Add(new HasScopeRequirement("upload:songs", domain))); - options.AddPolicy("read:song_details", policy => - policy.Requirements - .Add(new HasScopeRequirement("read:song_details", domain))); + options.AddPolicy("delete:songs", policy => + policy.Requirements + .Add(new HasScopeRequirement("delete:songs", domain))); - options.AddPolicy("update:songs", policy => - policy.Requirements - .Add(new HasScopeRequirement("update:songs", domain))); + options.AddPolicy("read:song_details", policy => + policy.Requirements + .Add(new HasScopeRequirement("read:song_details", domain))); - options.AddPolicy("read:artists", policy => - policy.Requirements - .Add(new HasScopeRequirement("read:artists", domain))); + options.AddPolicy("update:songs", policy => + policy.Requirements + .Add(new HasScopeRequirement("update:songs", domain))); - options.AddPolicy("read:albums", policy => - policy.Requirements - .Add(new HasScopeRequirement("read:albums", domain))); + options.AddPolicy("read:artists", policy => + policy.Requirements + .Add(new HasScopeRequirement("read:artists", domain))); - options.AddPolicy("read:genre", policy => - policy.Requirements - .Add(new HasScopeRequirement("read:genre", domain))); + options.AddPolicy("read:albums", policy => + policy.Requirements + .Add(new HasScopeRequirement("read:albums", domain))); - options.AddPolicy("read:year", policy => - policy.Requirements - .Add(new HasScopeRequirement("read:year", domain))); + options.AddPolicy("read:genre", policy => + policy.Requirements + .Add(new HasScopeRequirement("read:genre", domain))); - options.AddPolicy("stream:songs", policy => - policy.Requirements - .Add(new HasScopeRequirement("stream:songs", domain))); + options.AddPolicy("read:year", policy => + policy.Requirements + .Add(new HasScopeRequirement("read:year", domain))); + + options.AddPolicy("stream:songs", policy => + policy.Requirements + .Add(new HasScopeRequirement("stream:songs", domain))); }); @@ -104,34 +108,34 @@ namespace Icarus var connString = Configuration.GetConnectionString("DefaultConnection"); - services.Add(new ServiceDescriptor(typeof(SongRepository), - new SongRepository(Configuration.GetConnectionString("DefaultConnection")))); + services.Add(new ServiceDescriptor(typeof(SongRepository), + new SongRepository(Configuration.GetConnectionString("DefaultConnection")))); services.Add(new ServiceDescriptor(typeof(AlbumRepository), - new AlbumRepository(Configuration.GetConnectionString("DefaultConnection")))); + new AlbumRepository(Configuration.GetConnectionString("DefaultConnection")))); - services.Add(new ServiceDescriptor(typeof(ArtistRepository), - new ArtistRepository(Configuration.GetConnectionString("DefaultConnection")))); + services.Add(new ServiceDescriptor(typeof(ArtistRepository), + new ArtistRepository(Configuration.GetConnectionString("DefaultConnection")))); - services.Add(new ServiceDescriptor(typeof(GenreRepository), - new GenreRepository(Configuration.GetConnectionString("DefaultConnection")))); + services.Add(new ServiceDescriptor(typeof(GenreRepository), + new GenreRepository(Configuration.GetConnectionString("DefaultConnection")))); - services.Add(new ServiceDescriptor(typeof(YearRepository), - new YearRepository(Configuration.GetConnectionString("DefaultConnection")))); + services.Add(new ServiceDescriptor(typeof(YearRepository), + new YearRepository(Configuration.GetConnectionString("DefaultConnection")))); - services.Add(new ServiceDescriptor(typeof(CoverArtRepository), - new CoverArtRepository(Configuration.GetConnectionString("DefaultConnection")))); + services.Add(new ServiceDescriptor(typeof(CoverArtRepository), + new CoverArtRepository(Configuration.GetConnectionString("DefaultConnection")))); - services.Add(new ServiceDescriptor(typeof(UserRepository), - new UserRepository(Configuration.GetConnectionString("DefaultConnection")))); + services.Add(new ServiceDescriptor(typeof(UserRepository), + new UserRepository(Configuration.GetConnectionString("DefaultConnection")))); - services.AddDbContext(options => options.UseMySQL(connString)); - services.AddDbContext(options => options.UseMySQL(connString)); - services.AddDbContext(options => options.UseMySQL(connString)); - services.AddDbContext(options => options.UseMySQL(connString)); - services.AddDbContext(options => options.UseMySQL(connString)); - services.AddDbContext(options => options.UseMySQL(connString)); - services.AddDbContext(options => options.UseMySQL(connString)); + services.AddDbContext(options => options.UseMySQL(connString)); + services.AddDbContext(options => options.UseMySQL(connString)); + services.AddDbContext(options => options.UseMySQL(connString)); + services.AddDbContext(options => options.UseMySQL(connString)); + services.AddDbContext(options => options.UseMySQL(connString)); + services.AddDbContext(options => options.UseMySQL(connString)); + services.AddDbContext(options => options.UseMySQL(connString)); } // Called by the runtime. Use this method to configure the HTTP request pipeline. @@ -141,10 +145,10 @@ namespace Icarus app.UseDeveloperExceptionPage(); else // The default HSTS value is 30 days. - // You may want to change this for production scenarios + // You may want to change this for production scenarios app.UseHsts(); - app.UseAuthentication(); + app.UseAuthentication(); app.UseHttpsRedirection(); app.UseMvc();