Continuing work on providing functionality for the Album HTTP Endpoints. Added TODO's to picket up where I left off #22, #25
This commit is contained in:
@@ -229,7 +229,7 @@ namespace Icarus.Controllers.Managers
|
|||||||
Console.WriteLine($"An error occurred: {exMsg}");
|
Console.WriteLine($"An error occurred: {exMsg}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public async Task SaveSongToFileSystem(IFormFile song, MusicStoreContext sStoreContext,
|
public async Task SaveSongToFileSystem(IFormFile songFile, MusicStoreContext sStoreContext,
|
||||||
AlbumStoreContext alStoreContext,
|
AlbumStoreContext alStoreContext,
|
||||||
ArtistStoreContext arStoreContext)
|
ArtistStoreContext arStoreContext)
|
||||||
{
|
{
|
||||||
@@ -238,6 +238,30 @@ namespace Icarus.Controllers.Managers
|
|||||||
// TODO: Define and implement method that will take care of the
|
// TODO: Define and implement method that will take care of the
|
||||||
// song and album records, eventually will address the artist
|
// song and album records, eventually will address the artist
|
||||||
// records. Make use of helper functions
|
// records. Make use of helper functions
|
||||||
|
_logger.Info("Starting process to save song to the filesystem");
|
||||||
|
var fileTempPath = Path.Combine(_tempDirectoryRoot, songFile.FileName);
|
||||||
|
//await SaveSongToFileSystemTemp(song, fileTempPath);
|
||||||
|
var song = await SaveSongTemp(songFile, fileTempPath);
|
||||||
|
System.IO.File.Delete(fileTempPath);
|
||||||
|
|
||||||
|
DirectoryManager dirMgr = new DirectoryManager(_config, song);
|
||||||
|
dirMgr.CreateDirectory();
|
||||||
|
var filePath = dirMgr.SongDirectory;
|
||||||
|
if (!songFile.FileName.EndsWith(".mp3"))
|
||||||
|
filePath += $"{songFile.FileName}.mp3";
|
||||||
|
else
|
||||||
|
filePath += $"{songFile.FileName}";
|
||||||
|
|
||||||
|
_logger.Info($"Absolute song path: {filePath}");
|
||||||
|
|
||||||
|
using (var fileStream = new FileStream(filePath, FileMode.Create))
|
||||||
|
{
|
||||||
|
await (songFile.CopyToAsync(fileStream));
|
||||||
|
song.SongPath = filePath;
|
||||||
|
|
||||||
|
_logger.Info("Song Successfully saved");
|
||||||
|
}
|
||||||
|
SaveSongToDatabase(song, sStoreContext, alStoreContext, arStoreContext);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -413,15 +437,34 @@ namespace Icarus.Controllers.Managers
|
|||||||
Data = uncompressedSong
|
Data = uncompressedSong
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
private async Task<Song> SaveSongTemp(IFormFile songFile, string filePath)
|
||||||
|
{
|
||||||
|
var song = new Song();
|
||||||
|
|
||||||
|
|
||||||
async Task SaveSongToFileSystemTemp(IFormFile song, string filePath)
|
using (var filestream = new FileStream(filePath, FileMode.Create))
|
||||||
|
{
|
||||||
|
_logger.Info("Saving song to temporary directory");
|
||||||
|
await songFile.CopyToAsync(filestream);
|
||||||
|
MetadataRetriever meta = new MetadataRetriever();
|
||||||
|
song = meta.RetrieveMetaData(filePath);
|
||||||
|
|
||||||
|
_logger.Info("Assigning song filename");
|
||||||
|
song.Filename = songFile.FileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
return song;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SaveSongToFileSystemTemp(IFormFile song, string filePath)
|
||||||
{
|
{
|
||||||
using (var fileStream = new FileStream(filePath, FileMode.Create))
|
using (var fileStream = new FileStream(filePath, FileMode.Create))
|
||||||
{
|
{
|
||||||
Console.WriteLine("Retrieving song and storing it in memory");
|
Console.WriteLine("Retrieving song and storing it in memory");
|
||||||
|
_logger.Info("Retrieving song and storing it in memory");
|
||||||
await song.CopyToAsync(fileStream);
|
await song.CopyToAsync(fileStream);
|
||||||
Console.WriteLine($"Retrieving metadata of song from filepath {filePath}");
|
Console.WriteLine($"Retrieving metadata of song from filepath {filePath}");
|
||||||
|
_logger.Info($"Retrieving metadata of song from filepath {filePath}");
|
||||||
MetadataRetriever meta = new MetadataRetriever();
|
MetadataRetriever meta = new MetadataRetriever();
|
||||||
_song = meta.RetrieveMetaData(filePath);
|
_song = meta.RetrieveMetaData(filePath);
|
||||||
|
|
||||||
@@ -431,7 +474,7 @@ namespace Icarus.Controllers.Managers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Initialize()
|
private void Initialize()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -443,15 +486,45 @@ namespace Icarus.Controllers.Managers
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
void InitializeConnection()
|
private void InitializeConnection()
|
||||||
{
|
{
|
||||||
_conn = new MySqlConnection(_connectionString);
|
_conn = new MySqlConnection(_connectionString);
|
||||||
}
|
}
|
||||||
void InitializeResults()
|
private void InitializeResults()
|
||||||
{
|
{
|
||||||
_results = new DataTable();
|
_results = new DataTable();
|
||||||
}
|
}
|
||||||
async Task PopulateSongDetails()
|
private void SaveSongToDatabase(Song song, MusicStoreContext songStore, AlbumStoreContext albumStore,
|
||||||
|
ArtistStoreContext artistStore)
|
||||||
|
{
|
||||||
|
// TODO: Not finished and have not been tested
|
||||||
|
var album = new Album();
|
||||||
|
album.Title = song.Album;
|
||||||
|
album.AlbumArtist = song.Artist;
|
||||||
|
if (!albumStore.DoesAlbumExist(song))
|
||||||
|
{
|
||||||
|
album.SongCount = 1;
|
||||||
|
_logger.Info("Saving album to database");
|
||||||
|
albumStore.SaveAlbum(album);
|
||||||
|
_logger.Info("Album suuccessfully saved to database");
|
||||||
|
album = albumStore.GetAlbum(album);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var albumRetrieved = albumStore.GetAlbum(song);
|
||||||
|
album.Id = albumRetrieved.Id;
|
||||||
|
album.SongCount = albumRetrieved.SongCount + 1;
|
||||||
|
|
||||||
|
// TODO: Add functionality to the method below
|
||||||
|
albumStore.UpdateAlbum(album);
|
||||||
|
}
|
||||||
|
|
||||||
|
song.AlbumId = album.Id;
|
||||||
|
// TODO: Update the method below to save the newly added AlbumId value
|
||||||
|
songStore.SaveSong(song);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task PopulateSongDetails()
|
||||||
{
|
{
|
||||||
foreach (DataRow row in _results.Rows)
|
foreach (DataRow row in _results.Rows)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -70,10 +70,148 @@ namespace Icarus.Models.Context
|
|||||||
return albums;
|
return albums;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Album GetAlbum(Album album)
|
||||||
|
{
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (MySqlConnection conn = GetConnection())
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
var query = "SELECT * FROM Album WHERE Id=@Id";
|
||||||
|
using (MySqlCommand cmd = new MySqlCommand(query, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("@Id", album.Id);
|
||||||
|
|
||||||
|
using (var reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
var id = Convert.ToInt32(reader["Id"]);
|
||||||
|
var title = reader["Title"].ToString();
|
||||||
|
var albumArtist = reader["AlbumArtist"].ToString();
|
||||||
|
var songCount = Convert.ToInt32(reader["SongCount"]);
|
||||||
|
album =new Album
|
||||||
|
{
|
||||||
|
Id = id,
|
||||||
|
Title = title,
|
||||||
|
AlbumArtist = albumArtist,
|
||||||
|
SongCount = songCount
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
var msg = ex.Message;
|
||||||
|
_logger.Error(msg, "An error occurred");
|
||||||
|
}
|
||||||
|
|
||||||
|
return album;
|
||||||
|
}
|
||||||
|
public Album GetAlbum(Song song)
|
||||||
|
{
|
||||||
|
var album = new Album();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (MySqlConnection conn = GetConnection())
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
var query = "SELECT * FROM Album WHERE Title=@Title";
|
||||||
|
using (MySqlCommand cmd = new MySqlCommand(query, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("@Title", song.Album);
|
||||||
|
|
||||||
|
using (var reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
var id = Convert.ToInt32(reader["Id"]);
|
||||||
|
var title = reader["Title"].ToString();
|
||||||
|
var albumArtist = reader["AlbumArtist"].ToString();
|
||||||
|
var songCount = Convert.ToInt32(reader["SongCount"]);
|
||||||
|
album = new Album
|
||||||
|
{
|
||||||
|
Id = id,
|
||||||
|
Title = title,
|
||||||
|
AlbumArtist = albumArtist,
|
||||||
|
SongCount = songCount
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
var msg = ex.Message;
|
||||||
|
_logger.Error(msg, "An error occurred");
|
||||||
|
}
|
||||||
|
|
||||||
|
return album;
|
||||||
|
}
|
||||||
|
|
||||||
public bool DoesAlbumExist(Album album)
|
public bool DoesAlbumExist(Album album)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
using (MySqlConnection conn = GetConnection())
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
|
||||||
|
var query = "SELECT * FROM Album WHERE Id=@Id";
|
||||||
|
using (MySqlCommand cmd = new MySqlCommand(query, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("@Id", album.Id);
|
||||||
|
|
||||||
|
using (var reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
album = ParseSingleData(reader);
|
||||||
|
|
||||||
|
if (album != null)
|
||||||
|
{
|
||||||
|
_logger.Info($"Album {album.Title} exists");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
var msg = ex.Message;
|
||||||
|
_logger.Error(msg, "An error occurred");
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public bool DoesAlbumExist(Song song)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (MySqlConnection conn = GetConnection())
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
|
||||||
|
var query = "SELECT * FROM Album WHERE Title=@Title";
|
||||||
|
using (MySqlCommand cmd = new MySqlCommand(query, conn))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("@Title", song.Album);
|
||||||
|
|
||||||
|
using (var reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
var album = ParseSingleData(reader);
|
||||||
|
|
||||||
|
if (!String.IsNullOrEmpty(album.Title))
|
||||||
|
{
|
||||||
|
_logger.Info($"Album {album.Title} exists");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -109,6 +247,17 @@ namespace Icarus.Models.Context
|
|||||||
_logger.Error(msg, "An error occurred");
|
_logger.Error(msg, "An error occurred");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public void UpdateAlbum(Album album)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
var msg = ex.Message;
|
||||||
|
_logger.Error(msg, "An error occurred");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private List<Album> ParseData(MySqlDataReader reader)
|
private List<Album> ParseData(MySqlDataReader reader)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user