tsk-103: Confirmed functionality is working

This commit is contained in:
phoenix
2025-02-16 17:16:53 -05:00
parent 6bff36bc03
commit 63f3c955a1
28 changed files with 148 additions and 76 deletions
+4
View File
@@ -18,3 +18,7 @@ Icarus/bin
Icarus/obj Icarus/obj
Models/bin Models/bin
Models/obj Models/obj
Migrations
Icarus.txt
Storage
.DS_Store
@@ -116,6 +116,42 @@ public class DirectoryManager : BaseManager
} }
} }
public int DeleteEmptyDirectories(string? directory, int level)
{
var deleted = 0;
try
{
var curDir = directory;
for (var i = 0; i < level; i++)
{
if (!System.IO.Directory.Exists(curDir))
{
// return deleted;
continue;
}
if (this.IsDirectoryEmpty(curDir))
{
System.IO.Directory.Delete(curDir);
}
curDir = System.IO.Directory.GetParent(curDir).ToString();
}
}
catch (Exception ex)
{
var exMsg = ex.Message;
Console.WriteLine($"An error occurred {exMsg}");
}
return deleted;
}
public void DeleteEmptyDirectories(Song song) public void DeleteEmptyDirectories(Song song)
{ {
try try
@@ -187,7 +223,7 @@ public class DirectoryManager : BaseManager
private class DirEnt private class DirEnt
{ {
public string? Pre { get; set;} public string? Pre { get; set; }
public string? Path { get; set; } public string? Path { get; set; }
public string? Post { get; set; } public string? Post { get; set; }
} }
+10 -3
View File
@@ -110,11 +110,18 @@ public class SongManager : BaseManager
{ {
var songPath = songMetaData.SongPath(); var songPath = songMetaData.SongPath();
System.IO.File.Delete(songPath); System.IO.File.Delete(songPath);
successful = true; successful = !System.IO.File.Exists(songPath);
DirectoryManager dirMgr = new DirectoryManager(_config!, songMetaData); if (successful)
dirMgr.DeleteEmptyDirectories(); {
Console.WriteLine("Song successfully deleted"); Console.WriteLine("Song successfully deleted");
} }
DirectoryManager dirMgr = new DirectoryManager(_config!, songMetaData);
var deletedAmount = dirMgr.DeleteEmptyDirectories(songMetaData.SongDirectory, 1);
if (deletedAmount > 0)
{
Console.WriteLine($"{deletedAmount} directories deleted");
}
}
catch (Exception ex) catch (Exception ex)
{ {
var exMsg = ex.Message; var exMsg = ex.Message;
+10 -5
View File
@@ -74,7 +74,7 @@ public class TokenManager : BaseManager
public LoginResult LoginSymmetric(User user) public LoginResult LoginSymmetric(User user)
{ {
var tokenResult = new TokenTierOne{ TokenType = "JWT" }; var tokenResult = new TokenTierOne { TokenType = "JWT" };
var payload = Payload(); var payload = Payload();
payload.Add(new Claim("user_id", user.Id.ToString(), ClaimValueTypes.Integer)); payload.Add(new Claim("user_id", user.Id.ToString(), ClaimValueTypes.Integer));
@@ -112,8 +112,11 @@ public class TokenManager : BaseManager
{ {
return new LoginResult return new LoginResult
{ {
UserId = user.Id, Username = user.Username, Token = token.AccessToken, UserId = user.Id,
TokenType = token.TokenType, Expiration = token.Expiration, Username = user.Username,
Token = token.AccessToken,
TokenType = token.TokenType,
Expiration = token.Expiration,
Message = SUCCESSFUL_TOKEN_MESSAGE Message = SUCCESSFUL_TOKEN_MESSAGE
}; };
} }
@@ -224,8 +227,10 @@ public class TokenManager : BaseManager
return new TokenRequest return new TokenRequest
{ {
ClientId = _clientId, ClientSecret = _clientSecret, ClientId = _clientId,
Audience = _audience, GrantType = _grantType ClientSecret = _clientSecret,
Audience = _audience,
GrantType = _grantType
}; };
} }
@@ -9,8 +9,8 @@ public class MetadataRetriever
{ {
#region Fields #region Fields
private static NLog.Logger? _logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger(); private static NLog.Logger? _logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
private List<string>? _supportedAudioFileTypes = new List<string> {"wav", "flac"}; private List<string>? _supportedAudioFileTypes = new List<string> { "wav", "flac" };
private List<string>? _supportedImageFileTypes = new List<string> {"jpeg", "jpg", "png"}; private List<string>? _supportedImageFileTypes = new List<string> { "jpeg", "jpg", "png" };
private Song? _updatedSong; private Song? _updatedSong;
private string? _message; private string? _message;
private string? _title; private string? _title;
@@ -267,7 +267,7 @@ public class MetadataRetriever
break; break;
case "artists": case "artists":
_updatedSong!.Artist = artist; _updatedSong!.Artist = artist;
fileTag.Tag.Performers = new []{artist}; fileTag.Tag.Performers = new[] { artist };
break; break;
case "album": case "album":
_updatedSong!.AlbumTitle = album; _updatedSong!.AlbumTitle = album;
@@ -275,7 +275,7 @@ public class MetadataRetriever
break; break;
case "genre": case "genre":
_updatedSong!.Genre = genre; _updatedSong!.Genre = genre;
fileTag.Tag.Genres = new []{genre}; fileTag.Tag.Genres = new[] { genre };
break; break;
case "year": case "year":
_updatedSong!.Year = year; _updatedSong!.Year = year;
@@ -283,7 +283,7 @@ public class MetadataRetriever
break; break;
case "albumartist": case "albumartist":
_updatedSong!.AlbumArtist = albumArtist; _updatedSong!.AlbumArtist = albumArtist;
fileTag.Tag.AlbumArtists = new []{albumArtist}; fileTag.Tag.AlbumArtists = new[] { albumArtist };
break; break;
case "track": case "track":
_updatedSong!.Track = track; _updatedSong!.Track = track;
@@ -70,14 +70,14 @@ public class PasswordEncryption
password: password, salt: salt, password: password, salt: salt,
prf: KeyDerivationPrf.HMACSHA1, prf: KeyDerivationPrf.HMACSHA1,
iterationCount: 10000, iterationCount: 10000,
numBytesRequested: 256/8)); numBytesRequested: 256 / 8));
return hashed; return hashed;
} }
byte[] GenerateSalt() byte[] GenerateSalt()
{ {
byte[] salt = new byte[128/8]; byte[] salt = new byte[128 / 8];
using (var rng = RandomNumberGenerator.Create()) using (var rng = RandomNumberGenerator.Create())
rng.GetBytes(salt); rng.GetBytes(salt);
@@ -46,7 +46,7 @@ public class SongCompression
songData.Data = await System.IO.File.ReadAllBytesAsync(archivePath); songData.Data = await System.IO.File.ReadAllBytesAsync(archivePath);
} }
catch(Exception ex) catch (Exception ex)
{ {
var exMsg = ex.Message; var exMsg = ex.Message;
Console.WriteLine($"An error ocurred: \n{exMsg}"); Console.WriteLine($"An error ocurred: \n{exMsg}");
+1 -1
View File
@@ -48,7 +48,7 @@ public class AlbumController : BaseController
[HttpGet("{id}")] [HttpGet("{id}")]
public IActionResult GetAlbum(int id) public IActionResult GetAlbum(int id)
{ {
Album album = new Album{ Id = id }; Album album = new Album { Id = id };
var albumContext = new AlbumContext(_connectionString!); var albumContext = new AlbumContext(_connectionString!);
+1 -1
View File
@@ -79,7 +79,7 @@ public class CoverArtController : BaseController
var songContext = new SongContext(_connectionString!); var songContext = new SongContext(_connectionString!);
var covMgr = new CoverArtManager(this._config!); var covMgr = new CoverArtManager(this._config!);
var songMetaData = songContext.RetrieveRecord(new Song { Id = id}); var songMetaData = songContext.RetrieveRecord(new Song { Id = id });
var c = covMgr.GetCoverArt(songMetaData); var c = covMgr.GetCoverArt(songMetaData);
var filename = DirectoryManager.GenerateDownloadFilename(10, Constants.FileExtensions.JPG_EXTENSION, songMetaData.Title!, randomizeFilename); var filename = DirectoryManager.GenerateDownloadFilename(10, Constants.FileExtensions.JPG_EXTENSION, songMetaData.Title!, randomizeFilename);
@@ -46,7 +46,7 @@ public class SongCompressedDataController : BaseController
Console.WriteLine($"Archive directory root: {_archiveDir}"); Console.WriteLine($"Archive directory root: {_archiveDir}");
Console.WriteLine("Starting process of retrieving comrpessed song"); Console.WriteLine("Starting process of retrieving comrpessed song");
var sng = context.RetrieveRecord(new Song{ Id = id }); var sng = context.RetrieveRecord(new Song { Id = id });
SongData song = await cmp.RetrieveCompressedSong(sng); SongData song = await cmp.RetrieveCompressedSong(sng);
var filename = DirectoryManager.GenerateDownloadFilename(10, Constants.FileExtensions.ZIP_EXTENSION, sng.Title!, randomizeFilename); var filename = DirectoryManager.GenerateDownloadFilename(10, Constants.FileExtensions.ZIP_EXTENSION, sng.Title!, randomizeFilename);
+1 -1
View File
@@ -61,7 +61,7 @@ public class SongController : BaseController
{ {
var context = new SongContext(_connectionString!); var context = new SongContext(_connectionString!);
var song = context.RetrieveRecord(new Song{ Id = id }); var song = context.RetrieveRecord(new Song { Id = id });
Console.WriteLine("Here"); Console.WriteLine("Here");
+20 -3
View File
@@ -7,6 +7,8 @@ using Icarus.Database.Contexts;
namespace Icarus.Controllers.V1; namespace Icarus.Controllers.V1;
[Route("api/v1/song/data")] [Route("api/v1/song/data")]
[ApiController] [ApiController]
[Authorize] [Authorize]
@@ -151,10 +153,13 @@ public class SongDataController : BaseController
switch (song.AudioType) switch (song.AudioType)
{ {
case "wav": case "wav":
// song = _songMgr.SaveSongToFileSystem(up.SongData, up.CoverArtData, song);
// TODO: Make sure the tmp file gets deleted. Check
var _ = _songMgr.DeleteSongFromFileSystem(tmpSong); var _ = _songMgr.DeleteSongFromFileSystem(tmpSong);
return BadRequest("No support for .wav files"); return BadRequest(new UploadSongWithDataResponse
{
Subject = "No longer supported",
Message = "No support for .wav files",
Songs = new List<Song>()
});
case "flac": case "flac":
song = _songMgr.SaveFlacSongToFileSystem(up.SongData, up.CoverArtData, song); song = _songMgr.SaveFlacSongToFileSystem(up.SongData, up.CoverArtData, song);
break; break;
@@ -209,4 +214,16 @@ public class SongDataController : BaseController
[FromForm(Name = "metadata")] [FromForm(Name = "metadata")]
public string? SongFile { get; set; } public string? SongFile { get; set; }
} }
public class UploadSongWithDataResponse
{
#region Properties
[Newtonsoft.Json.JsonProperty("message")]
public string Message { get; set; }
[Newtonsoft.Json.JsonProperty("subject")]
public string Subject { get; set; }
[Newtonsoft.Json.JsonProperty("data")]
public List<Song> Songs { get; set; }
#endregion
}
} }
@@ -48,7 +48,8 @@ public class SongStreamController : BaseController
_logger!.LogInformation("Starting to stream song...>"); _logger!.LogInformation("Starting to stream song...>");
Console.WriteLine("Starting to streamsong..."); Console.WriteLine("Starting to streamsong...");
return await Task.Run(() => { return await Task.Run(() =>
{
return File(stream, "application/octet-stream", filename); return File(stream, "application/octet-stream", filename);
}); });
} }
+1 -1
View File
@@ -8,7 +8,7 @@ public class ArtistContext : DbContext
{ {
public DbSet<Artist> Artists { get; set; } public DbSet<Artist> Artists { get; set; }
public ArtistContext(DbContextOptions<ArtistContext> options) : base (options) { } public ArtistContext(DbContextOptions<ArtistContext> options) : base(options) { }
public ArtistContext(string connString) : base(new DbContextOptionsBuilder<ArtistContext>() public ArtistContext(string connString) : base(new DbContextOptionsBuilder<ArtistContext>()
.UseMySQL(connString).Options) .UseMySQL(connString).Options)
{ {
+2
View File
@@ -62,6 +62,8 @@ builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJw
{ {
options.RequireHttpsMetadata = false; options.RequireHttpsMetadata = false;
options.SaveToken = true; options.SaveToken = true;
var audience = Configuration["JWT:Audience"];
var issuer = Configuration["JWT:Issuer"];
options.TokenValidationParameters = new TokenValidationParameters() options.TokenValidationParameters = new TokenValidationParameters()
{ {
ValidateIssuer = true, ValidateIssuer = true,
+1 -1
View File
@@ -23,7 +23,7 @@ public class CoverArt
{ {
var fullPath = this.Directory; var fullPath = this.Directory;
if (fullPath![fullPath.Length -1] != '/') if (fullPath![fullPath.Length - 1] != '/')
{ {
fullPath += "/"; fullPath += "/";
} }