#pragma once #include #include "bank.hpp" using namespace drogon; #define req_args const HttpRequestPtr &req, std::function &&callback #define JSON(V) callback(HttpResponse::newHttpJsonResponse(JsonReturn(V))); #define INLINE __attribute__((always_inline)) inline #define GEN_BODY \ const auto temp_req = req->getJsonObject(); \ const auto body = temp_req ? *temp_req : Json::Value(); template INLINE Json::Value JsonReturn(T &&val) { Json::Value res; if constexpr (std::is_same_v) { res["value"] = (int)val; //becuase of json lib interpreting 67 as 'A' for example } else { res["value"] = val; } return res; } class BankF : public HttpController { public: void Help(req_args) const { auto resp = HttpResponse::newHttpResponse(); auto handlerInfo = app().getHandlersInfo(); resp->setBody("

ALL FUNCTIONS (that have args) ARE EXPECTING JSON AS DATA TYPE


/BankF/admin/close (POST)

 attempt  - admin password

Closes and Saves the server.


/BankF/user (POST)

 name  - name of the user being added

 init_pass  - initial password for the user being added

Adds a user to the bank


/BankF/admin/user (POST)

 name  - name of the user being added

 attempt  - admin password required to add user with balance

 init_bal  - initial balance for user being added

 init_pass  - initial password for user being added

Adds a user with initial balance


/BankF/sendfunds (POST)

 a_name  - sender's name

 b_name  - reciever's name

 amount  - amount being sent

 attempt  - password of sender

Sends money from one user to another


/BankF/changepass (PATCH)

 name  - name of user's password being changes

 attempt  - password of user being changed

 new_pass  - new password to replace the current user's password

 Changes password of a user

 

/BankF/{name}/bal (PATCH)

 name  - the name of the user being set

 attempt  - the admin password required

 amount  - the new balance of the user

Sets the balance of a user

 

/BankF/help (GET)

the page you're looking at right now!


/BankF/vpass (GET)

 name  - name of user being verified

 attempt  - password being verified

returns 0 or 1 based on if [attempt] is equal to the password of the user [name]. The intended usage for this function is for connected services


/BankF/contains/{name} (GET)

returns a 0 or 1 based on if the bank contains the user

 

/BankF/{name}/bal (GET)

returns the balance of a given user's name, if -1 that means the user does not exist


/BankF/user (DELETE)

 name  - name of user being deleted

 attempt  - password of user being deleted

Deletes a user with the password of the user as verification


/BankF/admin/user (DELETE)

 name  - name of user being deleted

 attempt  - admin password

Deletes a user with admin password as verification

"); resp->setExpiredTime(0); callback(resp); } void Close(req_args) const { GEN_BODY bool res; if (body["attempt"].asCString() == bank.admin_pass) { bank.Save(); res = true; app().quit(); } else { res = false; } JSON(res); } void AddUser(req_args) const { GEN_BODY JSON(bank.AddUser(body["name"].asCString(), body["init_pass"].asCString())); } void AdminAddUser(req_args) const { GEN_BODY JSON(bank.AdminAddUser(body["attempt"].asCString(), body["name"].asCString(), body["init_bal"].asUInt(), body["init_pass"].asCString())); } void DelUser(req_args) const { GEN_BODY JSON(bank.DelUser(body["name"].asCString(), body["attempt"].asCString())); } void AdminDelUser(req_args) const { GEN_BODY JSON(bank.AdminDelUser(body["name"].asCString(), body["attempt"].asCString())); } void SendFunds(req_args) const { GEN_BODY JSON(bank.SendFunds(body["a_name"].asCString(), body["b_name"].asCString(), body["amount"].asUInt(), body["attempt"].asCString())); } void ChangePassword(req_args) const { GEN_BODY JSON(bank.ChangePassword(body["name"].asCString(), body["attempt"].asCString(), body["new_pass"].asCString())); } void Contains(req_args, const std::string &name) const { JSON(bank.Contains(name)); } void GetBal(req_args, const std::string &name) const { JSON(bank.GetBal(name)); } void VerifyPassword(req_args) const { GEN_BODY JSON(bank.VerifyPassword(body["name"].asCString(), body["attempt"].asCString())); } void SetBal(req_args, const std::string &name) const { GEN_BODY JSON(bank.SetBal(name, body["attempt"].asCString(), body["amount"].asUInt())); } METHOD_LIST_BEGIN METHOD_ADD(BankF::Close, "/admin/close", Post); METHOD_ADD(BankF::AddUser, "/user", Post); METHOD_ADD(BankF::AdminAddUser, "/admin/user", Post); METHOD_ADD(BankF::SendFunds, "/sendfunds", Post); METHOD_ADD(BankF::ChangePassword, "/changepass", Patch); METHOD_ADD(BankF::SetBal, "/{name}/bal", Patch); METHOD_ADD(BankF::Help, "/help", Get); METHOD_ADD(BankF::VerifyPassword, "/vpass", Get); METHOD_ADD(BankF::Contains, "/contains/{name}", Get); METHOD_ADD(BankF::GetBal, "/{name}/bal", Get); METHOD_ADD(BankF::DelUser, "/user", Delete); METHOD_ADD(BankF::AdminDelUser, "/admin/user", Delete); METHOD_LIST_END };