Changed C++ standard to C++17 and will implement functionality to retrieve songs, albums, artists, genres, cover art, and year records in json. Will add explicit versioning too

This commit is contained in:
kdeng00
2019-07-30 22:08:55 -04:00
parent 63bee45f95
commit 24a111e8e9
54 changed files with 1334 additions and 1331 deletions
+162 -162
View File
@@ -1,4 +1,5 @@
#include"ActionManager.h"
#include"Managers/ActionManager.h"
#include<algorithm>
#include<iostream>
#include<exception>
@@ -14,181 +15,180 @@ using Models::IcarusAction;
namespace Managers
{
#pragma
ActionManager::ActionManager(char **param)
{
this->params = param;
#pragma
ActionManager::ActionManager(char **param)
{
this->params = param;
action = string{params[1]};
transform(action.begin(), action.end(),
action.begin(), ::tolower);
action = string{params[1]};
transform(action.begin(), action.end(),
action.begin(), ::tolower);
initialize();
}
#pragma Constructors
initialize();
}
#pragma Constructors
#pragma
IcarusAction ActionManager::retrieveIcarusAction() const
{
auto icarusAction = IcarusAction{};
icarusAction.flags = flags;
icarusAction.action = action;
#pragma
IcarusAction ActionManager::retrieveIcarusAction() const
{
auto icarusAction = IcarusAction{};
icarusAction.flags = flags;
icarusAction.action = action;
return icarusAction;
}
vector<Flags> ActionManager::retrieveFlags() const
{
return flags;
}
return icarusAction;
}
vector<Flags> ActionManager::retrieveFlags() const
{
return flags;
}
string ActionManager::retrieveAction() const
{
return action;
}
string ActionManager::retrieveAction() const
{
return action;
}
bool ActionManager::isNumber(string val)
{
return !val.empty() && std::find_if(val.begin(),
val.end(), [](char c)
{
return !std::isdigit(c);
}) == val.end();
}
bool ActionManager::isNumber(string val)
{
return !val.empty() && std::find_if(val.begin(),
val.end(), [](char c)
{
return !std::isdigit(c);
}) == val.end();
}
void ActionManager::initialize()
{
initializeSupportedActions();
validateAction();
validateFlags();
}
void ActionManager::initializeSupportedActions()
{
supportedActions = vector<string>{
"download", "delete",
"retrieve", "upload"
};
}
void ActionManager::initializeSupportedFlags()
{
supportedFlags = vector<string>{
"-u", "-p", "-t", "-h", "-s",
"-d", "-D", "-b"
};
}
void ActionManager::validateAction()
{
cout<<"Validating action"<<endl;
void ActionManager::initialize()
{
initializeSupportedActions();
validateAction();
validateFlags();
}
void ActionManager::initializeSupportedActions()
{
supportedActions = vector<string>{
"download", "delete",
"retrieve", "upload"
};
}
void ActionManager::initializeSupportedFlags()
{
supportedFlags = vector<string>{
"-u", "-p", "-t", "-h", "-s",
"-d", "-D", "-b"
};
}
void ActionManager::validateAction()
{
cout<<"Validating action"<<endl;
if (std::any_of(supportedActions.begin(), supportedActions.end(),
[&](string val)
{
return !val.compare(action);
}))
{
cout<<"Action: "<<action<<" is valid"<<endl;
}
else
{
cout<<"Action is not valid"<<endl;
exit(1);
}
}
void ActionManager::validateFlags()
{
cout<<"Validating flags"<<endl;
if (std::any_of(supportedActions.begin(), supportedActions.end(),
[&](string val)
{
return !val.compare(action);
}))
{
//cout<<"Action: "<<action<<" is valid"<<endl;
}
else
{
cout<<"Action is not valid"<<endl;
exit(1);
}
}
void ActionManager::validateFlags()
{
cout<<"Validating flags"<<endl;
auto flagVals = parsedFlags();
initializeSupportedFlags();
auto flagVals = parsedFlags();
initializeSupportedFlags();
Flags flg{};
Flags flg{};
for (auto flag : flagVals)
{
//if (flag.size() > 3 || flg.flag.compare("-D"))
if (flag.size() > 3 || isNumber(flag))
{
flg.value = flag;
cout<<"flag value "<<flg.value<<endl;
flags.push_back(flg);
flg = Flags{};
continue;
}
for (auto flag : flagVals)
{
if (flag.size() > 3 || isNumber(flag))
{
flg.value = flag;
//cout<<"flag value "<<flg.value<<endl;
flags.push_back(flg);
flg = Flags{};
continue;
}
if (std::any_of(supportedFlags.begin(), supportedFlags.end(),
[&](string val)
{
return !val.compare(flag);
}))
{
cout<<"flag "<<flag<<endl;
flg.flag = flag;
}
else
{
cout<<"Action is not valid"<<endl;
exit(1);
}
}
}
if (std::any_of(supportedFlags.begin(), supportedFlags.end(),
[&](string val)
{
return !val.compare(flag);
}))
{
//cout<<"flag "<<flag<<endl;
flg.flag = flag;
}
else
{
cout<<"Action is not valid"<<endl;
exit(1);
}
}
}
vector<string> ActionManager::parsedFlags()
{
auto parsed = vector<string>{};
try
{
for (auto i = 2; true; ++i)
{
string val{*(params + i)};
cout<<"Parsed flag "<<val<<endl;
parsed.push_back(val);
}
}
catch (std::exception e)
{
auto msg = e.what();
cout<<"This happend: "<<msg<<endl<<endl;
}
vector<string> ActionManager::parsedFlags()
{
auto parsed = vector<string>{};
try
{
for (auto i = 2; true; ++i)
{
string val{*(params + i)};
cout<<"Parsed flag "<<val<<endl;
parsed.push_back(val);
}
}
catch (std::exception e)
{
auto msg = e.what();
cout<<"This happend: "<<msg<<endl<<endl;
}
return parsed;
}
return parsed;
}
#pragma
void ActionManager::printAction()
{
if (action.empty())
{
printf("Action is empty\n");
}
else
{
cout<<"Action is "<<action<<endl;
}
}
void ActionManager::printFlags(vector<string> flagVals)
{
if (flagVals.empty())
{
printf("Flags and values are empty\n");
}
else
{
printf("Printing flags and values..\n");
for (auto flgVal : flagVals)
{
cout<<flgVal<<endl;
}
}
}
void ActionManager::printFlags()
{
cout<<"\nPrinting flags..."<<endl;
for (auto flag: flags)
{
cout<<"flag "<<flag.flag<<endl;
cout<<"value "<<flag.value<<endl;
}
}
#pragma Testing
#pragma Functions
#pragma
void ActionManager::printAction()
{
if (action.empty())
{
printf("Action is empty\n");
}
else
{
cout<<"Action is "<<action<<endl;
}
}
void ActionManager::printFlags(vector<string> flagVals)
{
if (flagVals.empty())
{
printf("Flags and values are empty\n");
}
else
{
printf("Printing flags and values..\n");
for (auto flgVal : flagVals)
{
cout<<flgVal<<endl;
}
}
}
void ActionManager::printFlags()
{
cout<<"\nPrinting flags..."<<endl;
for (auto flag: flags)
{
cout<<"flag "<<flag.flag<<endl;
cout<<"value "<<flag.value<<endl;
}
}
#pragma Testing
#pragma Functions
}
-43
View File
@@ -1,43 +0,0 @@
#ifndef ACTIONMANAGER_H_
#define ACTIONMANAGER_H_
#include<string>
#include<vector>
#include"Models/Flags.h"
#include"Models/IcarusAction.h"
namespace Managers
{
class ActionManager
{
public:
ActionManager(char**);
Models::IcarusAction retrieveIcarusAction() const;
std::vector<Models::Flags> retrieveFlags() const;
std::string retrieveAction() const;
private:
bool isNumber(std::string);
void initialize();
void initializeSupportedActions();
void initializeSupportedFlags();
void validateAction();
void validateFlags();
std::vector<std::string> parsedFlags();
void printAction();
void printFlags(std::vector<std::string>);
void printFlags();
std::string action;
std::vector<std::string> supportedActions;
std::vector<std::string> supportedFlags;
std::vector<Models::Flags> flags;
char **params;
};
}
#endif
+22 -20
View File
@@ -1,16 +1,17 @@
#include"CommitManager.h"
#include"Managers/CommitManager.h"
#include<iostream>
#include"Models/API.h"
#include"Models/Song.h"
#include"Models/Token.h"
#include"Parsers/APIParser.h"
#include"Syncers/Delete.h"
#include"Syncers/Download.h"
#include"Syncers/Upload.h"
#include"TokenManager.h"
#include"UserManager.h"
#include"Managers/TokenManager.h"
#include"Managers/UserManager.h"
using std::cout;
using std::endl;
@@ -21,6 +22,7 @@ using Managers::TokenManager;
using Managers::UserManager;
using Models::API;
using Models::Song;
using Models::Token;
using Parsers::APIParser;
using Models::IcarusAction;
using Syncers::Delete;
@@ -59,6 +61,17 @@ namespace Managers
}
}
Token CommitManager::parseToken(API api)
{
cout<<"fetching token"<<endl;
UserManager usrMgr{icaAction};
auto user = usrMgr.retrieveUser();
TokenManager tk{user, api};
return tk.requestToken();
}
void CommitManager::initializeMapActions()
{
mapActions = map<string, ActionValues>{
@@ -69,16 +82,10 @@ namespace Managers
}
void CommitManager::deleteSong()
{
cout<<"Deleting song..."<<endl;
UserManager usrMgr{icaAction};
auto user = usrMgr.retrieveUser();
APIParser apiPrs{icaAction};
auto api = apiPrs.retrieveAPI();
TokenManager tk{user, api};
auto token = tk.requestToken();
auto token = parseToken(api);
Song song{};
@@ -94,19 +101,17 @@ namespace Managers
}
Delete del{api};
cout<<"Deleting song..."<<endl;
del.deleteSong(token, song);
}
void CommitManager::downloadSong()
{
cout<<"Starting downloading process..."<<endl;
UserManager usrMgr{icaAction};
auto user = usrMgr.retrieveUser();
APIParser apiPrs{icaAction};
auto api = apiPrs.retrieveAPI();
TokenManager tk{user, api};
auto token = tk.requestToken();
auto token = parseToken(api);
Song song{};
@@ -126,19 +131,15 @@ namespace Managers
}
Download dnld{api};
cout<<"downloading song"<<endl;
dnld.downloadSong(token, song);
}
void CommitManager::uploadSong()
{
cout<<"Uploading song..."<<endl;
UserManager usrMgr{icaAction};
auto user = usrMgr.retrieveUser();
APIParser apiPrs{icaAction};
auto api = apiPrs.retrieveAPI();
TokenManager tk{user, api};
auto token = tk.requestToken();
auto token = parseToken(api);
Song song{};
@@ -154,6 +155,7 @@ namespace Managers
}
Upload upld{api};
cout<<"Uploading song..."<<endl;
upld.uploadSong(token, song);
}
#pragma Functions
-35
View File
@@ -1,35 +0,0 @@
#ifndef COMMITMANAGER_H_
#define COMMITMANAGER_H_
#include<map>
#include<string>
#include"Models/IcarusAction.h"
namespace Managers
{
class CommitManager
{
public:
CommitManager(Models::IcarusAction);
void commitAction();
private:
void initializeMapActions();
void deleteSong();
void downloadSong();
void uploadSong();
enum ActionValues
{
deleteAct,
downloadAct,
retrieveAct,
uploadAct
};
std::map<std::string, ActionValues> mapActions;
Models::IcarusAction icaAction;
};
}
#endif
+44 -44
View File
@@ -1,7 +1,7 @@
#include<iostream>
#include<fstream>
#include"FileManager.h"
#include"Managers/FileManager.h"
using std::cout;
using std::endl;
@@ -11,56 +11,56 @@ using std::string;
namespace Managers
{
FileManager::FileManager() {}
FileManager::FileManager(string filePath)
{
this->filePath = filePath;
readFile();
}
FileManager::FileManager() {}
FileManager::FileManager(string filePath)
{
this->filePath = filePath;
readFile();
}
void FileManager::saveFile(string newFilePath)
{
if (!fileRead)
readFile();
void FileManager::saveFile(string newFilePath)
{
if (!fileRead)
readFile();
ofstream of{newFilePath, ofstream::binary};
of.write(fileBuffer, fileBufferLength);
of.close();
}
ofstream of{newFilePath, ofstream::binary};
of.write(fileBuffer, fileBufferLength);
of.close();
}
void FileManager::readFile()
{
ifstream is{filePath, ifstream::binary};
if (is)
{
is.seekg (0, is.end);
fileBufferLength = is.tellg();
is.seekg (0, is.beg);
void FileManager::readFile()
{
ifstream is{filePath, ifstream::binary};
if (is)
{
is.seekg (0, is.end);
fileBufferLength = is.tellg();
is.seekg (0, is.beg);
fileBuffer = new char [fileBufferLength];
fileBuffer = new char [fileBufferLength];
cout<< "Reading "<<fileBufferLength<<" characters... "<<endl;;
is.read (fileBuffer,fileBufferLength);
cout<< "Reading "<<fileBufferLength<<" characters... "<<endl;;
is.read (fileBuffer,fileBufferLength);
if (is)
cout<<"all characters read successfully.";
else
cout<<"error: only "<<is.gcount()<<" could be read";
cout<<endl;
is.close();
fileRead = true;
}
}
void FileManager::modifyFilePath(string filePath)
{
this->filePath = filePath;
}
if (is)
cout<<"all characters read successfully.";
else
cout<<"error: only "<<is.gcount()<<" could be read";
cout<<endl;
is.close();
fileRead = true;
}
}
void FileManager::modifyFilePath(string filePath)
{
this->filePath = filePath;
}
char* FileManager::retrieveFileBuffer() const
{
return fileBuffer;
}
char* FileManager::retrieveFileBuffer() const
{
return fileBuffer;
}
int FileManager::retrieveFileBufferLength() const { return fileBufferLength; }
int FileManager::retrieveFileBufferLength() const { return fileBufferLength; }
}
-29
View File
@@ -1,29 +0,0 @@
#ifndef FILEMANAGER_H_
#define FILEMANAGER_H_
#include<string>
namespace Managers
{
class FileManager
{
public:
FileManager();
FileManager(std::string);
void saveFile(std::string);
void modifyFilePath(std::string);
char* retrieveFileBuffer() const;
int retrieveFileBufferLength() const;
private:
void readFile();
std::string filePath;
char* fileBuffer;
bool fileRead;
int fileBufferLength;
};
}
#endif
+36 -36
View File
@@ -1,4 +1,4 @@
#include"TokenManager.h"
#include"Managers/TokenManager.h"
#include<iostream>
@@ -17,46 +17,46 @@ using Models::User;
namespace Managers
{
#pragma
TokenManager::TokenManager(const User user)
{
this->user = user;
}
TokenManager::TokenManager(const User user, API api)
{
this->user = user;
this->api = api;
this->api.endpoint = "api/" + api.version
+ "/login";
}
#pragma Constructors
#pragma
TokenManager::TokenManager(const User user)
{
this->user = user;
}
TokenManager::TokenManager(const User user, API api)
{
this->user = user;
this->api = api;
this->api.endpoint = "api/" + api.version
+ "/login";
}
#pragma Constructors
#pragma
Token TokenManager::requestToken()
{
Token token{};
json usrObj;
#pragma
Token TokenManager::requestToken()
{
Token token{};
json usrObj;
usrObj["username"] = user.username;
usrObj["password"] = user.password;
cout<<user.username<<" "<<user.password<<endl;
usrObj["username"] = user.username;
usrObj["password"] = user.password;
cout<<user.username<<" "<<user.password<<endl;
cout<<"Sending request for token"<<endl;
auto url = api.url + api.endpoint;
cout<<url<<endl;
auto r = cpr::Post(cpr::Url{url},
cpr::Body{usrObj.dump()},
cpr::Header{{"Content-Type", "application/json"}});
cout<<"Sending request for token"<<endl;
auto url = api.url + api.endpoint;
cout<<url<<endl;
auto r = cpr::Post(cpr::Url{url},
cpr::Body{usrObj.dump()},
cpr::Header{{"Content-Type", "application/json"}});
cout<<r.text<<endl;
json res = json::parse(r.text);
token.accessToken = res["token"];
token.tokenType = res["token_type"];
cout<<r.text<<endl;
json res = json::parse(r.text);
token.accessToken = res["token"];
token.tokenType = res["token_type"];
//cout<<"status code "<<r.status_code<<endl;
//cout<<"status code "<<r.status_code<<endl;
return token;
}
#pragma Functions
return token;
}
#pragma Functions
}
-23
View File
@@ -1,23 +0,0 @@
#ifndef TOKENMANAGER_H_
#define TOKENMANAGER_H_
#include"Models/API.h"
#include"Models/Token.h"
#include"Models/User.h"
namespace Managers
{
class TokenManager
{
public:
TokenManager(const Models::User);
TokenManager(const Models::User, Models::API);
Models::Token requestToken();
private:
Models::API api;
Models::User user;
};
}
#endif
+35 -35
View File
@@ -1,4 +1,4 @@
#include"UserManager.h"
#include"Managers/UserManager.h"
#include<iostream>
#include<string>
@@ -12,42 +12,42 @@ using Models::User;
namespace Managers
{
#pragma
UserManager::UserManager(User user)
{
this->user = user;
}
UserManager::UserManager(const IcarusAction icaAct)
{
this->icaAction = icaAct;
this->user = User{};
parseUserFromActions();
}
#pragma Constructors
#pragma
UserManager::UserManager(User user)
{
this->user = user;
}
UserManager::UserManager(const IcarusAction icaAct)
{
this->icaAction = icaAct;
this->user = User{};
parseUserFromActions();
}
#pragma Constructors
#pragma
User UserManager::retrieveUser() const
{
return user;
}
#pragma
User UserManager::retrieveUser() const
{
return user;
}
void UserManager::parseUserFromActions()
{
auto args = icaAction.flags;
void UserManager::parseUserFromActions()
{
auto args = icaAction.flags;
for (auto arg : args)
{
auto flag = arg.flag;
if (flag.compare("-u") == 0)
{
user.username = arg.value;
}
if (flag.compare("-p") == 0)
{
user.password = arg.value;
}
}
}
#pragma Functions
for (auto arg : args)
{
auto flag = arg.flag;
if (flag.compare("-u") == 0)
{
user.username = arg.value;
}
if (flag.compare("-p") == 0)
{
user.password = arg.value;
}
}
}
#pragma Functions
}
-26
View File
@@ -1,26 +0,0 @@
#ifndef USERMANAGER_H_
#define USERMANAGER_H_
#include<iostream>
#include"Models/IcarusAction.h"
#include"Models/User.h"
namespace Managers
{
class UserManager
{
public:
UserManager(Models::User);
UserManager(const Models::IcarusAction);
Models::User retrieveUser() const;
private:
void parseUserFromActions();
Models::User user;
Models::IcarusAction icaAction;
};
}
#endif