Compare commits

..

5 Commits

Author SHA1 Message Date
KD 00dcb93257 Version bump (#115) 2025-04-03 21:15:57 -04:00
KD 8abb196e1d Change id types (#114)
* Change id types

* Updated more models

* Saving changes

* Should be it
2025-04-03 21:13:05 -04:00
KD 12c4f56a22 Merge pull request #112 from kdeng00/version_bump
Version bump
2025-03-28 18:50:37 -04:00
KD 6d650b7962 Delete song endpoint Bug fix (#111)
* Bug fix

* Removed some code

* Simplifying method
2025-03-28 18:49:34 -04:00
KD 73bb417bde Version bump 2025-03-28 18:48:02 -04:00
31 changed files with 152 additions and 130 deletions
+19
View File
@@ -0,0 +1,19 @@
# Top-most EditorConfig file
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.cs]
# Use 'var' when possible
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion
# Use expression body for methods
csharp_style_expression_bodied_methods = true:silent
@@ -92,29 +92,6 @@ public class DirectoryManager : BaseManager
}
}
public void DeleteEmptyDirectories()
{
try
{
var albumDirectory = AlbumDirectory();
var artistDirectory = ArtistDirectory();
if (IsDirectoryEmpty(albumDirectory))
{
Directory.Delete(albumDirectory);
Console.WriteLine($"directory {albumDirectory} deleted");
}
if (IsDirectoryEmpty(artistDirectory))
{
Directory.Delete(artistDirectory);
Console.WriteLine($"directory {artistDirectory} deleted");
}
}
catch (Exception ex)
{
var exMsg = ex.Message;
Console.WriteLine($"An error occurred {exMsg}");
}
}
public int DeleteEmptyDirectories(string? directory, int level)
{
@@ -157,12 +134,12 @@ public class DirectoryManager : BaseManager
var albumDirectory = AlbumDirectory(song);
var artistDirectory = ArtistDirectory(song);
if (IsDirectoryEmpty(albumDirectory))
if (Directory.Exists(albumDirectory) && IsDirectoryEmpty(albumDirectory))
{
Directory.Delete(albumDirectory);
_logger.Info("Album directory deleted");
}
if (IsDirectoryEmpty(artistDirectory))
if (Directory.Exists(artistDirectory) && IsDirectoryEmpty(artistDirectory))
{
Directory.Delete(artistDirectory);
_logger.Info("Artist directory deleted");
@@ -175,66 +152,7 @@ public class DirectoryManager : BaseManager
}
}
public string RetrieveAlbumPath(Song song)
{
_logger.Info("Retrieving album song path");
var albumPath = string.Empty;
albumPath = AlbumDirectory(song);
return albumPath;
}
public string RetrieveArtistPath(Song song)
{
_logger.Info("Retrieving artist path");
var artistPath = string.Empty;
artistPath = ArtistDirectory(song);
return artistPath;
}
public string GenerateSongPath(Song song)
{
_logger.Info("Generating song path");
var artistPath = ArtistDirectory(song);
var albumPath = AlbumDirectory(song);
GenerateDirectories(new List<DirEnt>{
new DirEnt
{
Pre = "Artist path does not exist",
Path = artistPath,
Post = "Creating artist path"
},
new DirEnt
{
Pre = "Album path does not exist",
Path = albumPath,
Post = "Created album path"
}
});
return albumPath;
}
private class DirEnt
{
public string? Pre { get; set; }
public string? Path { get; set; }
public string? Post { get; set; }
}
private void GenerateDirectories(List<DirEnt> dirs)
{
foreach (var di in dirs)
{
_logger.Info(di.Pre);
Directory.CreateDirectory(di.Path!);
_logger.Info(di.Post);
}
}
private void Initialize(DirectoryType dirTypes = DirectoryType.Music)
{
@@ -249,10 +167,8 @@ public class DirectoryManager : BaseManager
}
}
private bool IsDirectoryEmpty(string path)
{
return !Directory.EnumerateFileSystemEntries(path).Any();
}
private bool IsDirectoryEmpty(string path) =>
!(Directory.EnumerateFileSystemEntries(path).Any());
private string AlbumDirectory()
{
@@ -267,10 +183,6 @@ public class DirectoryManager : BaseManager
return directory;
}
private string ArtistDirectory()
{
return ArtistDirectory(_song!);
}
private string ArtistDirectory(Song song)
{
var directory = _rootSongDirectory;
+10 -2
View File
@@ -149,7 +149,7 @@ public class TokenManager : BaseManager
return null;
}
public int? RetrieveUserIdFromToken(string token)
public Guid? RetrieveUserIdFromToken(string token)
{
var parsedToken = this.ContainsBearer(token) ? this.StripBearer(token) : token;
var tokenHandler = new JwtSecurityTokenHandler();
@@ -159,7 +159,15 @@ public class TokenManager : BaseManager
{
if (item.Key == "user_id")
{
return Convert.ToInt32(item.Value);
if (item.Value != null)
{
var id = item.Value.ToString();
return Guid.Parse(id!);
}
else
{
return null;
}
}
}
@@ -27,9 +27,9 @@ public class AccessLevelController : BaseController
#region HTTP Routes
[HttpGet]
public IActionResult GetAccessLevels(int? id, int? songId)
public IActionResult GetAccessLevels(Guid? id, Guid? songId)
{
var accLevel = new Models.AccessLevel { Id = 0 };
var accLevel = new Models.AccessLevel { };
var accessLevelContext = new Database.Contexts.AccessLevelContext(_connectionString!);
if (id != null)
@@ -43,7 +43,7 @@ public class AccessLevelController : BaseController
var response = new GetAccessLevelsResponse { Data = new List<Models.AccessLevel>() };
if (accLevel?.Id > 0)
if (accLevel?.Id.ToString().Length > 0)
{
response.Subject = "Successful";
response.Data.Add(accLevel);
@@ -57,7 +57,7 @@ public class AccessLevelController : BaseController
}
[HttpPatch("{id}")]
public IActionResult UpdateAccessLevel(int id, [FromBody] Models.AccessLevel accessLevel)
public IActionResult UpdateAccessLevel(Guid id, [FromBody] Models.AccessLevel accessLevel)
{
var response = new UpdateAccessLevelResponse { Data = new List<Models.AccessLevel>() };
var targetLevel = accessLevel.Level;
+1 -1
View File
@@ -46,7 +46,7 @@ public class AlbumController : BaseController
}
[HttpGet("{id}")]
public IActionResult GetAlbum(int id)
public IActionResult GetAlbum(Guid id)
{
Album album = new Album { Id = id };
+1 -1
View File
@@ -46,7 +46,7 @@ public class ArtistController : BaseController
}
[HttpGet("{id}")]
public IActionResult GetArtist(int id)
public IActionResult GetArtist(Guid id)
{
Artist artist = new Artist { Id = id };
+2 -2
View File
@@ -49,7 +49,7 @@ public class CoverArtController : BaseController
}
[HttpGet("{id}")]
public IActionResult GetCoverArt(int id)
public IActionResult GetCoverArt(Guid id)
{
var coverArt = new CoverArt { Id = id };
@@ -74,7 +74,7 @@ public class CoverArtController : BaseController
}
[HttpGet("data/download/{id}")]
public async Task<IActionResult> Download(int id, [FromQuery] bool? randomizeFilename)
public async Task<IActionResult> Download(Guid id, [FromQuery] bool? randomizeFilename)
{
var songContext = new SongContext(_connectionString!);
var covMgr = new CoverArtManager(this._config!);
+1 -1
View File
@@ -50,7 +50,7 @@ public class GenreController : BaseController
}
[HttpGet("{id}")]
public IActionResult GetGenre(int id)
public IActionResult GetGenre(Guid id)
{
var genre = new Genre { Id = id };
@@ -37,7 +37,7 @@ public class SongCompressedDataController : BaseController
#region API Routes
[HttpGet("{id}")]
public async Task<IActionResult> DownloadCompressedSong(int id, [FromQuery] bool? randomizeFilename)
public async Task<IActionResult> DownloadCompressedSong(Guid id, [FromQuery] bool? randomizeFilename)
{
var context = new SongContext(_connectionString!);
+3 -3
View File
@@ -57,7 +57,7 @@ public class SongController : BaseController
}
[HttpGet("{id}")]
public IActionResult GetSong(int id)
public IActionResult GetSong(Guid id)
{
var context = new SongContext(_connectionString!);
@@ -65,14 +65,14 @@ public class SongController : BaseController
Console.WriteLine("Here");
if (song.Id != 0)
if (song.Id.ToString().Length != 0)
return Ok(song);
else
return NotFound();
}
[HttpPut("{id}")]
public IActionResult UpdateSong(int id, [FromBody] Song song)
public IActionResult UpdateSong(Guid id, [FromBody] Song song)
{
song.Id = id;
Console.WriteLine("Retrieving filepath of song");
+2 -2
View File
@@ -40,7 +40,7 @@ public class SongDataController : BaseController
[HttpGet("download/{id}")]
public IActionResult Download(int id, [FromQuery] bool? randomizeFilename)
public IActionResult Download(Guid id, [FromQuery] bool? randomizeFilename)
{
var tokenManager = new TokenManager(this._config!);
var songContext = new SongContext(this._connectionString!);
@@ -172,7 +172,7 @@ public class SongDataController : BaseController
}
[HttpDelete("delete/{id}")]
public IActionResult DeleteSong(int id)
public IActionResult DeleteSong(Guid id)
{
var songContext = new SongContext(_connectionString!);
var songMetaData = songContext.RetrieveRecord(new Song { Id = id });
@@ -32,7 +32,7 @@ public class SongStreamController : BaseController
#region HTTP endpoints
[HttpGet("{id}")]
public async Task<IActionResult> StreamSong(int id)
public async Task<IActionResult> StreamSong(Guid id)
{
var context = new SongContext(_config!.GetConnectionString("DefaultConnection")!);
@@ -20,7 +20,7 @@ public class AccessLevelContext : DbContext
#endregion
#region Methods
public Models.AccessLevel? GetAccessLevel(int songId)
public Models.AccessLevel? GetAccessLevel(Guid songId)
{
var accessLevel = this.AccessLevels!.FirstOrDefault(acc => acc.SongId == songId);
return accessLevel;
@@ -30,6 +30,14 @@ public class AccessLevelContext : DbContext
{
modelBuilder.Entity<Models.AccessLevel>().ToTable("AccessLevel");
modelBuilder.Entity<Models.AccessLevel>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Id)
.HasColumnType("binary(16)");
});
modelBuilder.Entity<Models.AccessLevel>().Property(m => m.Level).IsRequired(true);
}
#endregion
+8
View File
@@ -18,6 +18,14 @@ public class AlbumContext : DbContext
{
modelBuilder.Entity<Album>()
.ToTable("Album");
modelBuilder.Entity<Album>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Id)
.HasColumnType("binary(16)");
});
}
public Album RetrieveRecord(Album album)
@@ -18,6 +18,14 @@ public class ArtistContext : DbContext
{
modelBuilder.Entity<Artist>()
.ToTable("Artist");
modelBuilder.Entity<Artist>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Id)
.HasColumnType("binary(16)");
});
}
public Artist RetrieveRecord(Artist artist)
@@ -20,6 +20,13 @@ public class CoverArtContext : DbContext
{
modelBuilder.Entity<CoverArt>()
.ToTable("CoverArt");
modelBuilder.Entity<CoverArt>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Id)
.HasColumnType("binary(16)");
});
}
public CoverArt RetrieveRecord(CoverArt cover)
+8
View File
@@ -20,6 +20,14 @@ public class GenreContext : DbContext
{
modelBuilder.Entity<Genre>()
.ToTable("Genre");
modelBuilder.Entity<Genre>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Id)
.HasColumnType("binary(16)");
});
}
+8
View File
@@ -21,6 +21,14 @@ public class SongContext : DbContext
modelBuilder.Entity<Song>()
.ToTable("Song");
modelBuilder.Entity<Song>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Id)
.HasColumnType("binary(16)");
});
modelBuilder.Entity<Song>()
.Property(s => s.Year)
.IsRequired(false);
+8
View File
@@ -23,6 +23,14 @@ public class UserContext : DbContext
{
modelBuilder.Entity<User>()
.ToTable("User");
modelBuilder.Entity<User>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Id)
.HasColumnType("binary(16)"); // **** Map Guid to BINARY(16) ****
});
modelBuilder.Entity<User>()
.Property(u => u.LastLogin).IsRequired(false);
modelBuilder.Entity<User>()
+1 -1
View File
@@ -5,7 +5,7 @@
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
<Version>0.1.22</Version>
<Version>0.1.40</Version>
</PropertyGroup>
<ItemGroup>
+19
View File
@@ -0,0 +1,19 @@
# Top-most EditorConfig file
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.cs]
# Use 'var' when possible
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion
# Use expression body for methods
csharp_style_expression_bodied_methods = true:silent
+4 -2
View File
@@ -1,3 +1,4 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Icarus.Models;
@@ -6,11 +7,12 @@ public class AccessLevel
{
#region Properties
[Newtonsoft.Json.JsonProperty("id")]
public int Id { get; set; }
[Key]
public Guid Id { get; set; }
[Newtonsoft.Json.JsonProperty("level")]
public string? Level { get; set; }
[Newtonsoft.Json.JsonProperty("song_id")]
public int SongId { get; set; }
public Guid SongId { get; set; }
#endregion
#region Methods
+3 -1
View File
@@ -1,3 +1,4 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Newtonsoft.Json;
@@ -8,7 +9,8 @@ public class Album
{
#region Properties
[JsonProperty("id")]
public int Id { get; set; }
[Key]
public Guid Id { get; set; }
[JsonProperty("title")]
public string? Title { get; set; }
[JsonProperty("album_artist")]
+3 -1
View File
@@ -1,3 +1,4 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Newtonsoft.Json;
@@ -8,7 +9,8 @@ public class Artist
{
#region Properties
[JsonProperty("id")]
public int Id { get; set; }
[Key]
public Guid Id { get; set; }
[JsonProperty("name")]
[Column("Artist")]
public string? Name { get; set; }
+4 -1
View File
@@ -1,3 +1,5 @@
using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json;
namespace Icarus.Models;
@@ -6,7 +8,8 @@ public class CoverArt
{
#region Properties
[JsonProperty("id")]
public int Id { get; set; }
[Key]
public Guid Id { get; set; }
[JsonProperty("title")]
public string? SongTitle { get; set; }
[JsonIgnore]
-3
View File
@@ -1,6 +1,3 @@
namespace Icarus.Models;
public enum CreateFileResult
+2 -1
View File
@@ -1,3 +1,4 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Newtonsoft.Json;
@@ -8,7 +9,7 @@ public class Genre
{
#region Properties
[JsonProperty("id")]
public int Id { get; set; }
public Guid Id { get; set; }
[JsonProperty("genre")]
[Column("Category")]
public string? GenreName { get; set; }
+1 -1
View File
@@ -6,7 +6,7 @@ public class LoginResult : BaseResult
{
#region Properties
[JsonProperty("user_id")]
public int UserId { get; set; }
public Guid UserId { get; set; }
[JsonProperty("username")]
public string? Username { get; set; }
[JsonProperty("token")]
+8 -6
View File
@@ -1,3 +1,4 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Newtonsoft.Json;
@@ -8,7 +9,8 @@ public class Song
{
#region Properties
[JsonProperty("id")]
public int Id { get; set; }
[Key]
public Guid Id { get; set; }
[JsonProperty("title")]
public string? Title { get; set; }
[JsonProperty("album")]
@@ -39,17 +41,17 @@ public class Song
[JsonProperty("disc_count")]
public int DiscCount { get; set; } = 0;
[JsonIgnore]
public int? AlbumId { get; set; }
public Guid? AlbumId { get; set; }
[JsonIgnore]
public int? ArtistId { get; set; }
public Guid? ArtistId { get; set; }
[JsonIgnore]
public int? GenreId { get; set; }
public Guid? GenreId { get; set; }
[JsonIgnore]
public int? CoverArtId { get; set; }
public Guid? CoverArtId { get; set; }
[JsonProperty("date_created")]
public DateTime DateCreated { get; set; }
[JsonProperty("user_id")]
public int UserId { get; set; }
public Guid UserId { get; set; }
#endregion
+1 -1
View File
@@ -3,7 +3,7 @@ namespace Icarus.Models;
public class SongData
{
#region Properties
public int ID { get; set; }
public Guid ID { get; set; }
public byte[]? Data { get; set; }
public int SongID { get; set; }
#endregion
+1 -1
View File
@@ -12,7 +12,7 @@ public class User
[JsonProperty("id")]
[Column("Id")]
[Key]
public int Id { get; set; }
public Guid Id { get; set; }
[JsonProperty("username")]
public string? Username { get; set; }
[JsonProperty("password")]