diff --git a/src/bank_api.cpp b/src/bank_api.cpp new file mode 100644 index 0000000..d7caa5a --- /dev/null +++ b/src/bank_api.cpp @@ -0,0 +1,115 @@ +#include "bank_api.h" + +namespace v1 +{ + template + constexpr Json::Value JsonCast(T &&val) + { + if constexpr (std::is_same_v) + { + return (int)val; //becuase of json lib interpreting 67 as 'A' for example + } + else if constexpr (std::is_same_v) + { + return (Json::Int64)val; + } + else if constexpr (std::is_same_v) + { + return (Json::Int64)val; + } + else + { + return val; + } + } + + api::api(Bank &b) : bank(b) {} + + void api::Help(req_args) const + { + auto resp = HttpResponse::newHttpResponse(); + resp->setBody("# Meta Usage

Error Responses

# meaning
-1 UserNotFound
-2 WrongPassword
-3 InvalidRequest
-4 NameTooLong
-5 UserAlreadyExists
-6 InsufficientFunds

Things of Note

  • all endpoints respond with JSON file type
  • "A" denotes requiring Authentication in the form of a header titled "Password"

Usage

Name Path Method A Description
GetBal api/{name}/bal GET false returns the balance of a given user {name}
GetLog api/{name}/log GET true returns a list of last n number of transactions (a configurable amount) of a given user {name}
SendFunds api/{name}/send/{to}?amount={amount} POST true sends {amount} from user {name} to user {to}
VerifyPassword api/{name}/pass/verify GET true returns 1 if the supplied user {name}'s password matches the password supplied in the header

Meta Usage

Name Path Method A Description
ChangePassword api/{name}/pass/change PATCH true if the password supplied in the header matches the user {name}'s password, the user’s password is changed to the one given in the body
SetBal api/admin/{name}/bal?amount={amount} PATCH true sets the balance of a give user {name} if the supplied password matches the admin password

System Usage

Name Path Method A Description
Help api/help GET false the page you’re looking at right now!
Ping api/ping GET false for pinging the server to see if its online
Close api/admin/close POST true saves and then closes the program if the supplied password matches the admin password
Contains api/contains/{name} GET false returns 1 if the supplied user {name} exists
AdminVerifyPass api/admin/verify GET true returns 1 if the password supplied in the header matches the admin password

User Management

Name Path Method A Description
AddUser api/user/{name} POST true registers a user with the name {name}, balance of 0 and a password of the password supplied in the header
AdminAddUser api/admin/user/{name}?init_bal={init_bal} POST true if the password supplied in the header matches the admin password, then it registers a user with the name {name}, balance of init_bal and a password supplied by the body of the request
DelUser api/user/{name} DELETE true if the password supplied in the header matches the user {name}'s password, then the user is deleted
AdminDelUser api/admin/user/{name} DELETE true if the password supplied in the header matches the admin password, then the user is deleted
"); + resp->setExpiredTime(0); + callback(resp); + } + void api::Close(req_args) const + { + bool res; + if (PASS_HEADER == bank.admin_pass) + { + bank.Save(); + + res = true; + app().quit(); + } + else + { + res = false; + } + JSON(res); + } + void api::Ping(req_args) const + { + auto resp = HttpResponse::newHttpResponse(); + resp->setBody("pong"); + resp->setExpiredTime(0); + callback(resp); + } + void api::AddUser(req_args, const std::string &name) const + { + JSON(bank.AddUser(std::move(name), PASS_HEADER)); + } + void api::AdminAddUser(req_args, std::string &&name, uint32_t init_bal) const + { + JSON(bank.AdminAddUser(PASS_HEADER, std::move(name), init_bal, std::string(req->getBody()))); + } + void api::DelUser(req_args, const std::string &name) const + { + JSON(bank.DelUser(name, PASS_HEADER)); + } + void api::AdminDelUser(req_args, const std::string &name) const + { + JSON(bank.AdminDelUser(name, PASS_HEADER)); + } + void api::SendFunds(req_args, const std::string name, const std::string to, uint32_t amount) const + { + JSON(bank.SendFunds(name, to, amount, PASS_HEADER)); + } + void api::ChangePassword(req_args, const std::string &name) const + { + JSON(bank.ChangePassword(name, PASS_HEADER, std::string(req->getBody()))); + } + void api::Contains(req_args, const std::string &name) const + { + JSON(bank.Contains(name)); + } + void api::GetBal(req_args, const std::string &name) const + { + JSON(bank.GetBal(name)); + } + void api::VerifyPassword(req_args, const std::string &name) const + { + JSON(bank.VerifyPassword(name, PASS_HEADER)); + } + void api::SetBal(req_args, const std::string &name, uint32_t amount) const + { + JSON(bank.SetBal(name, PASS_HEADER, amount)); + } + void api::AdminVerifyPass(req_args) + { + JSON(bank.AdminVerifyPass(PASS_HEADER)); + } + void api::GetLog(req_args, const std::string &name) + { + if constexpr (max_log_size > 0) + { + JSON(bank.GetLogs(name, PASS_HEADER)); + } + else + { + auto resp = HttpResponse::newHttpJsonResponse("Logs are Disabled"); + resp->setExpiredTime(0); //cached forever + callback(resp); + } + } +} \ No newline at end of file diff --git a/src/bank_f.cpp b/src/bank_f.cpp deleted file mode 100644 index 7cef779..0000000 --- a/src/bank_f.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include "bank_f.h" - -#define JSON(V) callback(HttpResponse::newHttpJsonResponse(JsonCast(V))); -#define PASS_HEADER req->getHeader("Password") - -template -constexpr Json::Value JsonCast(T &&val) -{ - if constexpr (std::is_same_v) - { - return (int)val; //becuase of json lib interpreting 67 as 'A' for example - } - else if constexpr (std::is_same_v) - { - return (Json::Int64)val; - } - else if constexpr (std::is_same_v) - { - return (Json::Int64)val; - } - else - { - return val; - } -} - -api::api(Bank &b) : bank(b) {} - -void api::Help(req_args) const -{ - auto resp = HttpResponse::newHttpResponse(); - resp->setBody("# Meta Usage

Error Responses

# meaning
-1 UserNotFound
-2 WrongPassword
-3 InvalidRequest
-4 NameTooLong
-5 UserAlreadyExists
-6 InsufficientFunds

Things of Note

  • all endpoints respond with JSON file type
  • "A" denotes requiring Authentication in the form of a header titled "Password"

Usage

Name Path Method A Description
GetBal api/{name}/bal GET false returns the balance of a given user {name}
GetLog api/{name}/log GET true returns a list of last n number of transactions (a configurable amount) of a given user {name}
SendFunds api/{name}/send/{to}?amount={amount} POST true sends {amount} from user {name} to user {to}
VerifyPassword api/{name}/pass/verify GET true returns 1 if the supplied user {name}'s password matches the password supplied in the header

Meta Usage

Name Path Method A Description
ChangePassword api/{name}/pass/change PATCH true if the password supplied in the header matches the user {name}'s password, the user’s password is changed to the one given in the body
SetBal api/admin/{name}/bal?amount={amount} PATCH true sets the balance of a give user {name} if the supplied password matches the admin password

System Usage

Name Path Method A Description
Help api/help GET false the page you’re looking at right now!
Ping api/ping GET false for pinging the server to see if its online
Close api/admin/close POST true saves and then closes the program if the supplied password matches the admin password
Contains api/contains/{name} GET false returns 1 if the supplied user {name} exists
AdminVerifyPass api/admin/verify GET true returns 1 if the password supplied in the header matches the admin password

User Management

Name Path Method A Description
AddUser api/user/{name} POST true registers a user with the name {name}, balance of 0 and a password of the password supplied in the header
AdminAddUser api/admin/user/{name}?init_bal={init_bal} POST true if the password supplied in the header matches the admin password, then it registers a user with the name {name}, balance of init_bal and a password supplied by the body of the request
DelUser api/user/{name} DELETE true if the password supplied in the header matches the user {name}'s password, then the user is deleted
AdminDelUser api/admin/user/{name} DELETE true if the password supplied in the header matches the admin password, then the user is deleted
"); - resp->setExpiredTime(0); - callback(resp); -} -void api::Close(req_args) const -{ - bool res; - if (PASS_HEADER == bank.admin_pass) - { - bank.Save(); - - res = true; - app().quit(); - } - else - { - res = false; - } - JSON(res); -} -void api::Ping(req_args) const -{ - auto resp = HttpResponse::newHttpResponse(); - resp->setBody("pong"); - resp->setExpiredTime(0); - callback(resp); -} -void api::AddUser(req_args, const std::string &name) const -{ - JSON(bank.AddUser(std::move(name), PASS_HEADER)); -} -void api::AdminAddUser(req_args, std::string &&name, uint32_t init_bal) const -{ - JSON(bank.AdminAddUser(PASS_HEADER, std::move(name), init_bal, std::string(req->getBody()))); -} -void api::DelUser(req_args, const std::string &name) const -{ - JSON(bank.DelUser(name, PASS_HEADER)); -} -void api::AdminDelUser(req_args, const std::string &name) const -{ - JSON(bank.AdminDelUser(name, PASS_HEADER)); -} -void api::SendFunds(req_args, const std::string name, const std::string to, uint32_t amount) const -{ - JSON(bank.SendFunds(name, to, amount, PASS_HEADER)); -} -void api::ChangePassword(req_args, const std::string &name) const -{ - JSON(bank.ChangePassword(name, PASS_HEADER, std::string(req->getBody()))); -} -void api::Contains(req_args, const std::string &name) const -{ - JSON(bank.Contains(name)); -} -void api::GetBal(req_args, const std::string &name) const -{ - JSON(bank.GetBal(name)); -} -void api::VerifyPassword(req_args, const std::string &name) const -{ - JSON(bank.VerifyPassword(name, PASS_HEADER)); -} -void api::SetBal(req_args, const std::string &name, uint32_t amount) const -{ - JSON(bank.SetBal(name, PASS_HEADER, amount)); -} -void api::AdminVerifyPass(req_args) -{ - JSON(bank.AdminVerifyPass(PASS_HEADER)); -} -void api::GetLog(req_args, const std::string &name) -{ - if constexpr (max_log_size > 0) - { - JSON(bank.GetLogs(name, PASS_HEADER)); - } - else - { - auto resp = HttpResponse::newHttpJsonResponse("Logs are Disabled"); - resp->setExpiredTime(0); //cached forever - callback(resp); - } -}