Added functionality to upload a song. Need to write parse classes to parse the base API HTTP endpoint, and the source path. #7

This commit is contained in:
amazing-username
2019-06-03 22:29:20 -04:00
parent 56bf7f1900
commit 8230f7b5ff
10 changed files with 215 additions and 12 deletions
+5 -1
View File
@@ -45,6 +45,8 @@ set(SOURCES
src/Managers/ActionManager.cpp src/Managers/ActionManager.cpp
src/Managers/CommitManager.cpp src/Managers/CommitManager.cpp
src/Managers/FileManager.cpp src/Managers/FileManager.cpp
src/Managers/TokenManager.cpp
src/Managers/UserManager.cpp
src/Syncers/Download.cpp src/Syncers/Download.cpp
src/Syncers/Upload.cpp src/Syncers/Upload.cpp
src/Utilities/Conversions.cpp src/Utilities/Conversions.cpp
@@ -53,10 +55,12 @@ set(HEADERS
src/Managers/ActionManager.h src/Managers/ActionManager.h
src/Managers/CommitManager.h src/Managers/CommitManager.h
src/Managers/FileManager.h src/Managers/FileManager.h
src/Models/Token.h src/Managers/TokenManager.h
src/Managers/UserManager.h
src/Models/Flags.h src/Models/Flags.h
src/Models/IcarusAction.h src/Models/IcarusAction.h
src/Models/Song.h src/Models/Song.h
src/Models/Token.h
src/Models/UploadForm.h src/Models/UploadForm.h
src/Models/User.h src/Models/User.h
src/Syncers/Download.h src/Syncers/Download.h
-2
View File
@@ -103,7 +103,6 @@ namespace Managers
flg = Flags{}; flg = Flags{};
continue; continue;
} }
cout<<"\nprovided flag: "<<flag<<endl;
if (std::any_of(supportedFlags.begin(), supportedFlags.end(), if (std::any_of(supportedFlags.begin(), supportedFlags.end(),
[&](string val) [&](string val)
{ {
@@ -113,7 +112,6 @@ namespace Managers
return !val.compare(flag); return !val.compare(flag);
})) }))
{ {
cout<<"Flag : "<<flag<<" is valid"<<endl;
flg.flag = flag; flg.flag = flag;
} }
else else
+35 -5
View File
@@ -2,12 +2,20 @@
#include<iostream> #include<iostream>
#include"Syncers/Upload.h"
#include"TokenManager.h"
#include"UserManager.h"
using std::cout; using std::cout;
using std::endl; using std::endl;
using std::map; using std::map;
using std::string; using std::string;
using Managers::TokenManager;
using Managers::UserManager;
using Models::IcarusAction; using Models::IcarusAction;
using Syncers::Upload;
namespace Managers namespace Managers
{ {
@@ -50,14 +58,36 @@ namespace Managers
void CommitManager::uploadSong() void CommitManager::uploadSong()
{ {
cout<<"Uploading song..."<<endl; cout<<"Uploading song..."<<endl;
UserManager usrMgr{icaAction};
auto user = usrMgr.retrieveUser();
TokenManager tk{user};
auto token = tk.requestToken();
string songPath{};
for (auto arg : icaAction.flags)
{
auto flag = arg.flag;
auto value = arg.value;
if (flag.compare("-s") == 0)
{
songPath.assign(arg.value);
}
}
Upload upld{};
upld.uploadSong(token, songPath);
// TODO: Implement functionality for uploading // TODO: Implement functionality for uploading
// //
// Need to the following: // Need to the following:
// 1. Parse the login credentials from the Flag model // 1. Parse the login credentials from the Flag model x
// 2. Retrieve a token -- implement token management // 2. Retrieve a token -- implement token management x
// 3. Parse song path from the Flag model // 3. Parse song path from the Flag model x Make a parser class
// 4. Parse the HTTP API endpoint // 4. Parse the HTTP API endpoint Make parser class
// 5. Upload the song // 5. Upload the song x
} }
#pragma Functions #pragma Functions
} }
+47
View File
@@ -0,0 +1,47 @@
#include"TokenManager.h"
#include<iostream>
#include<cpr/cpr.h>
#include<nlohmann/json.hpp>
using std::cout;
using std::endl;
using json = nlohmann::json;
using Managers::TokenManager;
using Models::Token;
using Models::User;
namespace Managers
{
#pragma
TokenManager::TokenManager(const User user)
{
this->user = user;
}
#pragma Constructors
#pragma
Token TokenManager::requestToken()
{
Token token{};
json usrObj;
usrObj["username"] = user.username;
usrObj["password"] = user.password;
auto r = cpr::Post(cpr::Url{""},
cpr::Body{usrObj.dump()},
cpr::Header{{"Content-Type", "application/json"}});
json res = json::parse(r.text);
token.accessToken = res["token"];
token.tokenType = res["token_type"];
return token;
}
#pragma Functions
}
+20
View File
@@ -0,0 +1,20 @@
#ifndef TOKENMANAGER_H_
#define TOKENMANAGER_H_
#include"Models/Token.h"
#include"Models/User.h"
namespace Managers
{
class TokenManager
{
public:
TokenManager(const Models::User);
Models::Token requestToken();
private:
Models::User user;
};
}
#endif
+54
View File
@@ -0,0 +1,54 @@
#include"UserManager.h"
#include<iostream>
#include<string>
#include<vector>
using std::string;
using std::vector;
using Models::IcarusAction;
using Models::User;
namespace Managers
{
#pragma
UserManager::UserManager(User user)
{
this->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;
}
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
}
+26
View File
@@ -0,0 +1,26 @@
#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
+1 -1
View File
@@ -9,7 +9,7 @@ namespace Models
{ {
std::string username; std::string username;
std::string password; std::string password;
} };
} }
#endif #endif
+23
View File
@@ -1,4 +1,5 @@
#include<iostream> #include<iostream>
#include<exception>
#include<string> #include<string>
#include<cpr/cpr.h> #include<cpr/cpr.h>
@@ -8,6 +9,7 @@
using std::cout; using std::cout;
using std::endl; using std::endl;
using std::exception;
using std::string; using std::string;
using json = nlohmann::json; using json = nlohmann::json;
@@ -50,6 +52,27 @@ namespace Syncers
cout<<"Finished"<<endl; cout<<"Finished"<<endl;
} }
void Upload::uploadSong(const Models::Token token, const std::string songPath)
{
try
{
string auth{token.tokenType};
auth.append(" " + token.accessToken);
auto r = cpr::Post(cpr::Url{""},
cpr::Multipart{{"key", "small value"},
{"file", cpr::File{songPath}}},
cpr::Header{{"authorization", auth}}
);
cout << r.status_code<< std::endl;
}
catch (exception e)
{
auto msg = e.what();
cout<<msg<<endl;
}
cout<<"Finished"<<endl;
}
void Upload::configureSongDemo() void Upload::configureSongDemo()
{ {
+2 -1
View File
@@ -7,6 +7,7 @@
#include"Managers/FileManager.h" #include"Managers/FileManager.h"
#include"Models/Song.h" #include"Models/Song.h"
#include"Models/Token.h"
#include"Models/UploadForm.h" #include"Models/UploadForm.h"
@@ -20,7 +21,7 @@ namespace Syncers
Upload(Models::UploadForm); Upload(Models::UploadForm);
void uploadSong(); void uploadSong();
void uploadSong(const Models::Token, const std::string);
private: private:
Managers::FileManager fMgr; Managers::FileManager fMgr;
Models::Song song; Models::Song song;