Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 01faa60699 | |||
| 8714d76a2a | |||
| e764bc45de | |||
| 5fefc451d5 |
@@ -130,6 +130,7 @@ The only requirement of the User is that the user should have full permissions t
|
||||
|
||||
Prior to starting the API, the database must be created. The following tables are required:
|
||||
* User
|
||||
* Salt
|
||||
* Song
|
||||
* Album
|
||||
* Artist
|
||||
@@ -156,7 +157,7 @@ cd ../..
|
||||
mkdir build
|
||||
cd build
|
||||
conan install ..
|
||||
cmake ..
|
||||
cmake .. -DCMAKE_BUILD_TYPE=RELEASE -DUSE_SYSTEM_CURL=ON -DBUILD_CPR_TESTS=OFF -DOATPP_BUILD_TESTS=OFF
|
||||
make
|
||||
bin/icarus
|
||||
```
|
||||
@@ -166,16 +167,10 @@ Runs the server on localhost port 5002
|
||||
|
||||
Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on the code of conduct, and the process for submitting pull requests to the project.
|
||||
|
||||
## Versioning
|
||||
|
||||
* [v0.1](https://github.com/amazing-username/Icarus/releases/tag/v0.1)
|
||||
|
||||
## Authors
|
||||
|
||||
* **Kun Deng** - [amazing-username](https://github.com/amazing-username)
|
||||
|
||||
See also the list of [contributors](https://github.com/amazing-username/Icarus/graphs/contributors) who participated in this project.
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "callback/StreamCallback.h"
|
||||
#include "database/SongRepository.h"
|
||||
#include "dto/SongDto.hpp"
|
||||
#include "dto/conversion/DtoConversions.h"
|
||||
#include "manager/SongManager.h"
|
||||
#include "manager/TokenManager.h"
|
||||
#include "model/Models.h"
|
||||
@@ -74,8 +75,9 @@ public:
|
||||
|
||||
manager::SongManager songMgr(m_bConf);
|
||||
songMgr.saveSong(sng);
|
||||
auto songDto = dto::conversion::DtoConversions::toSongDto(sng);
|
||||
|
||||
return createResponse(Status::CODE_200, "OK");
|
||||
return createDtoResponse(Status::CODE_200, songDto);
|
||||
}
|
||||
|
||||
// endpoint for retrieving all song records in json format
|
||||
@@ -95,16 +97,7 @@ public:
|
||||
|
||||
std::cout << "creating object to send" << std::endl;
|
||||
for (auto& songDb : songsDb) {
|
||||
auto song = dto::SongDto::createShared();
|
||||
song->id = songDb.id;
|
||||
song->title = songDb.title.c_str();
|
||||
song->artist = songDb.artist.c_str();
|
||||
song->album = songDb.album.c_str();
|
||||
song->genre = songDb.genre.c_str();
|
||||
song->year = songDb.year;
|
||||
song->duration = songDb.duration;
|
||||
song->track = songDb.track;
|
||||
song->disc = songDb.disc;
|
||||
auto song = dto::conversion::DtoConversions::toSongDto(songDb);
|
||||
|
||||
songs->pushBack(song);
|
||||
}
|
||||
@@ -124,22 +117,14 @@ public:
|
||||
database::SongRepository songRepo(m_bConf);
|
||||
model::Song songDb(id);
|
||||
|
||||
OATPP_ASSERT_HTTP(songRepo.doesSongExist(songDb, type::SongFilter::id) , Status::CODE_403,
|
||||
"song does not exist");
|
||||
if (!songRepo.doesSongExist(songDb, type::SongFilter::id)) {
|
||||
return songDoesNotExist();
|
||||
}
|
||||
|
||||
std::cout << "song exists" << std::endl;
|
||||
songDb = songRepo.retrieveRecord(songDb, type::SongFilter::id);
|
||||
|
||||
auto song = dto::SongDto::createShared();
|
||||
song->id = songDb.id;
|
||||
song->title = songDb.title.c_str();
|
||||
song->artist = songDb.artist.c_str();
|
||||
song->album = songDb.album.c_str();
|
||||
song->genre = songDb.genre.c_str();
|
||||
song->year = songDb.year;
|
||||
song->duration = songDb.duration;
|
||||
song->track = songDb.track;
|
||||
song->disc = songDb.disc;
|
||||
auto song = dto::conversion::DtoConversions::toSongDto(songDb);
|
||||
|
||||
return createDtoResponse(Status::CODE_200, song);
|
||||
}
|
||||
@@ -154,6 +139,10 @@ public:
|
||||
|
||||
database::SongRepository songRepo(m_bConf);
|
||||
model::Song songDb(id);
|
||||
if (!songRepo.doesSongExist(songDb, type::SongFilter::id)) {
|
||||
return songDoesNotExist();
|
||||
}
|
||||
|
||||
songDb = songRepo.retrieveRecord(songDb, type::SongFilter::id);
|
||||
|
||||
auto rawSong = oatpp::base::StrBuffer::loadFromFile(songDb.songPath.c_str());
|
||||
@@ -174,9 +163,12 @@ public:
|
||||
manager::TokenManager tok;
|
||||
OATPP_ASSERT_HTTP(tok.isTokenValid(auth, type::Scope::updateSong), Status::CODE_403, "Not allowed");
|
||||
|
||||
auto updatedSong = manager::SongManager::songDtoConv(songDto);
|
||||
auto updatedSong = dto::conversion::DtoConversions::toSong(songDto);
|
||||
manager::SongManager songMgr(m_bConf);
|
||||
songMgr.updateSong(updatedSong);
|
||||
auto result = songMgr.updateSong(updatedSong);
|
||||
if (!result) {
|
||||
return songDoesNotExist();
|
||||
}
|
||||
|
||||
return createResponse(Status::CODE_200, "OK");
|
||||
}
|
||||
@@ -193,7 +185,10 @@ public:
|
||||
model::Song song(id);
|
||||
|
||||
manager::SongManager sngMgr(m_bConf);
|
||||
sngMgr.deleteSong(song);
|
||||
auto result = sngMgr.deleteSong(song);
|
||||
if (!result) {
|
||||
return songDoesNotExist();
|
||||
}
|
||||
|
||||
return createResponse(Status::CODE_200, "OK");
|
||||
}
|
||||
@@ -209,6 +204,10 @@ public:
|
||||
|
||||
database::SongRepository songRepo(m_bConf);
|
||||
model::Song songDb(id);
|
||||
if (!songRepo.doesSongExist(songDb, type::SongFilter::id)) {
|
||||
return songDoesNotExist();
|
||||
}
|
||||
|
||||
songDb = songRepo.retrieveRecord(songDb, type::SongFilter::id);
|
||||
|
||||
oatpp::data::v_io_size dSize = 1024;
|
||||
@@ -225,6 +224,12 @@ public:
|
||||
|
||||
#include OATPP_CODEGEN_END(ApiController)
|
||||
private:
|
||||
std::shared_ptr<oatpp::web::protocol::http::outgoing::Response>
|
||||
songDoesNotExist() {
|
||||
|
||||
return createResponse(Status::CODE_404, "Song not found");
|
||||
}
|
||||
|
||||
std::string m_exe_path;
|
||||
|
||||
model::BinaryPath m_bConf;
|
||||
|
||||
@@ -23,6 +23,7 @@ namespace dto
|
||||
DTO_FIELD(Int32, disc);
|
||||
DTO_FIELD(Int32, year);
|
||||
DTO_FIELD(Int32, duration);
|
||||
DTO_FIELD(Int32, coverart_id);
|
||||
};
|
||||
|
||||
#include OATPP_CODEGEN_END(DTO)
|
||||
|
||||
@@ -13,6 +13,8 @@ namespace dto { namespace conversion {
|
||||
static dto::RegisterResultDto::ObjectWrapper toRegisterResultDto(
|
||||
const model::RegisterResult&);
|
||||
|
||||
static dto::SongDto::ObjectWrapper toSongDto(const model::Song&);
|
||||
|
||||
static model::Song toSong(dto::SongDto::ObjectWrapper&);
|
||||
|
||||
static model::User toUser(dto::UserDto::ObjectWrapper&);
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
#include "model/Models.h"
|
||||
#include "type/SongChanged.h"
|
||||
|
||||
namespace manager
|
||||
{
|
||||
namespace manager {
|
||||
class SongManager
|
||||
{
|
||||
public:
|
||||
@@ -22,12 +21,10 @@ namespace manager
|
||||
|
||||
bool didSongChange(const model::Song&, const model::Song&);
|
||||
bool requiresFilesystemChange(const model::Song&, const model::Song&);
|
||||
bool deleteSong(model::Song&);
|
||||
bool updateSong(model::Song&);
|
||||
|
||||
void saveSong(model::Song&);
|
||||
void deleteSong(model::Song&);
|
||||
void updateSong(model::Song&);
|
||||
|
||||
static model::Song songDtoConv(dto::SongDto::ObjectWrapper&);
|
||||
|
||||
static void printSong(const model::Song&);
|
||||
private:
|
||||
|
||||
@@ -24,6 +24,23 @@ namespace dto { namespace conversion {
|
||||
}
|
||||
|
||||
|
||||
dto::SongDto::ObjectWrapper DtoConversions::toSongDto(const model::Song& song) {
|
||||
auto result = dto::SongDto::createShared();
|
||||
result->id = (song.id != 0) ? song.id : 0;
|
||||
result->title = (!song.title.empty()) ? song.title.c_str() : "";
|
||||
result->album = (!song.album.empty()) ? song.album.c_str() : "";
|
||||
result->artist = (!song.artist.empty()) ? song.artist.c_str() : "";
|
||||
result->genre = (!song.genre.empty()) ? song.genre.c_str() : "";
|
||||
result->duration = (song.duration != 0) ? song.duration : 0;
|
||||
result->year = (song.year != 0) ? song.year : 0;
|
||||
result->track = (song.track != 0) ? song.track : 0;
|
||||
result->disc = (song.disc != 0) ? song.disc : 0;
|
||||
result->coverart_id = (song.coverArtId != 0) ? song.coverArtId : 0;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
model::Song DtoConversions::toSong(dto::SongDto::ObjectWrapper& songDto) {
|
||||
model::Song song;
|
||||
song.id = (songDto->id.getPtr() == nullptr) ? 0 : songDto->id->getValue();
|
||||
@@ -34,6 +51,8 @@ namespace dto { namespace conversion {
|
||||
song.year = (songDto->year.getPtr() == nullptr) ? 0 : songDto->year->getValue();
|
||||
song.track = (songDto->track.getPtr() == nullptr) ? 0 : songDto->track->getValue();
|
||||
song.disc = (songDto->disc.getPtr() == nullptr) ? 0 : songDto->disc->getValue();
|
||||
song.coverArtId = (songDto->coverart_id.getPtr() == nullptr) ?
|
||||
0 : songDto->coverart_id->getValue();
|
||||
|
||||
return song;
|
||||
}
|
||||
|
||||
+23
-37
@@ -68,30 +68,13 @@ bool manager::SongManager::requiresFilesystemChange(const model::Song& updatedSo
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void manager::SongManager::saveSong(model::Song& song)
|
||||
{
|
||||
saveSongTemp(song);
|
||||
utility::MetadataRetriever meta;
|
||||
auto data = std::move(song.data);
|
||||
song = meta.retrieveMetadata(song.songPath);
|
||||
song.data = std::move(data);
|
||||
|
||||
saveMisc(song);
|
||||
|
||||
printSong(song);
|
||||
|
||||
database::SongRepository songRepo(m_bConf);
|
||||
songRepo.saveRecord(song);
|
||||
}
|
||||
|
||||
void manager::SongManager::deleteSong(model::Song& song)
|
||||
bool manager::SongManager::deleteSong(model::Song& song)
|
||||
{
|
||||
database::SongRepository songRepo(m_bConf);
|
||||
|
||||
if (!songRepo.doesSongExist(song, type::SongFilter::id)) {
|
||||
std::cout << "song does not exist" << std::endl;
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
song = songRepo.retrieveRecord(song, type::SongFilter::id);
|
||||
@@ -102,25 +85,24 @@ void manager::SongManager::deleteSong(model::Song& song)
|
||||
|
||||
if (!deleted) {
|
||||
std::cout << "song not deleted from databases" << std::endl;
|
||||
return;
|
||||
return deleted;
|
||||
}
|
||||
deleteMisc(song);
|
||||
|
||||
fs::remove(song.songPath);
|
||||
manager::DirectoryManager::deleteDirectories(song, paths["root_music_path"].get<std::string>());
|
||||
return deleted;
|
||||
}
|
||||
|
||||
void manager::SongManager::updateSong(model::Song& updatedSong)
|
||||
bool manager::SongManager::updateSong(model::Song& updatedSong)
|
||||
{
|
||||
database::SongRepository songRepo(m_bConf);
|
||||
model::Song currSong(updatedSong.id);
|
||||
|
||||
OATPP_ASSERT_HTTP(songRepo.doesSongExist(currSong, type::SongFilter::id) , oatpp::web::protocol::http::Status::CODE_404, "song does not exist");
|
||||
|
||||
currSong = songRepo.retrieveRecord(currSong, type::SongFilter::id);
|
||||
if (!didSongChange(updatedSong, currSong)) {
|
||||
std::cout << "no change to the song" << std::endl;
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
assignMiscId(updatedSong, currSong);
|
||||
@@ -139,22 +121,26 @@ void manager::SongManager::updateSong(model::Song& updatedSong)
|
||||
printSong(currSong);
|
||||
|
||||
updateMisc(changes, updatedSong, currSong);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
model::Song manager::SongManager::songDtoConv(dto::SongDto::ObjectWrapper& songDto)
|
||||
{
|
||||
std::cout << "coverting dto::SongDto to model::Song" << std::endl;
|
||||
model::Song song;
|
||||
song.id = songDto->id;
|
||||
song.title = (songDto->title == nullptr) ? "" : songDto->title->c_str();
|
||||
song.album = (songDto->album == nullptr) ? "" : songDto->album->c_str();
|
||||
song.artist = (songDto->artist == nullptr) ? "" : songDto->artist->c_str();
|
||||
song.genre = (songDto->genre == nullptr) ? "" : songDto->genre->c_str();
|
||||
song.year = (songDto->year.getPtr() == nullptr) ? 0 : songDto->year->getValue();
|
||||
song.track = (songDto->track.getPtr() == nullptr) ? 0 : songDto->track->getValue();
|
||||
song.disc = (songDto->disc.getPtr() == nullptr) ? 0 : songDto->disc->getValue();
|
||||
|
||||
return song;
|
||||
void manager::SongManager::saveSong(model::Song& song)
|
||||
{
|
||||
saveSongTemp(song);
|
||||
utility::MetadataRetriever meta;
|
||||
auto data = std::move(song.data);
|
||||
song = meta.retrieveMetadata(song.songPath);
|
||||
song.data = std::move(data);
|
||||
|
||||
saveMisc(song);
|
||||
|
||||
printSong(song);
|
||||
|
||||
database::SongRepository songRepo(m_bConf);
|
||||
songRepo.saveRecord(song);
|
||||
song = songRepo.retrieveRecord(song, type::SongFilter::title);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user