mirror of
https://github.com/Expand-sys/CCash
synced 2026-03-22 12:37:08 +11:00
✨🐎 AllUsers added & seperated save_l into bal_l/size_l
This commit is contained in:
parent
ac0105ff68
commit
c1c077fc81
2 changed files with 27 additions and 8 deletions
|
|
@ -23,14 +23,15 @@ private:
|
|||
* permitted while saving so they do not have to share this lock
|
||||
*
|
||||
*/
|
||||
std::shared_mutex save_lock;
|
||||
std::shared_mutex size_lock;
|
||||
std::shared_mutex bal_lock;
|
||||
|
||||
public:
|
||||
std::string admin_pass;
|
||||
|
||||
bool AddUser(const std::string &name, std::string &&init_pass)
|
||||
{
|
||||
std::shared_lock<std::shared_mutex> lock{save_lock};
|
||||
std::shared_lock<std::shared_mutex> lock{size_lock};
|
||||
return users.try_emplace_l(
|
||||
name, [](User &) {}, std::move(init_pass));
|
||||
}
|
||||
|
|
@ -39,7 +40,7 @@ public:
|
|||
bool state = (admin_pass == attempt);
|
||||
if (state)
|
||||
{
|
||||
std::shared_lock<std::shared_mutex> lock{save_lock};
|
||||
std::shared_lock<std::shared_mutex> lock{size_lock};
|
||||
state = users.try_emplace_l(
|
||||
name, [](User &) {}, init_bal, std::move(init_pass));
|
||||
}
|
||||
|
|
@ -48,12 +49,12 @@ public:
|
|||
|
||||
bool DelUser(const std::string &name, const std::string &attempt)
|
||||
{
|
||||
std::shared_lock<std::shared_mutex> lock{save_lock};
|
||||
std::shared_lock<std::shared_mutex> lock{size_lock};
|
||||
return users.erase_if(name, [&attempt](const User &u) { return (attempt == u.password); });
|
||||
}
|
||||
bool AdminDelUser(const std::string &name, const std::string &attempt)
|
||||
{
|
||||
std::shared_lock<std::shared_mutex> lock{save_lock};
|
||||
std::shared_lock<std::shared_mutex> lock{size_lock};
|
||||
return users.erase_if(name, [this, &attempt](const User &) { return (admin_pass == attempt); });
|
||||
}
|
||||
|
||||
|
|
@ -68,7 +69,7 @@ public:
|
|||
|
||||
//if A exists, A can afford it, and A's password matches
|
||||
bool state = false;
|
||||
std::shared_lock<std::shared_mutex> lock{save_lock}; //because SendFunds requires 3 locking operations
|
||||
std::shared_lock<std::shared_mutex> lock{bal_lock}; //because SendFunds requires 3 locking operations
|
||||
users.modify_if(a_name, [&state, amount, &attempt](User &a) {
|
||||
if (state = (a.balance >= amount) && (a.password == attempt), state)
|
||||
{
|
||||
|
|
@ -138,6 +139,19 @@ public:
|
|||
return res;
|
||||
}
|
||||
|
||||
Json::Value AllUsers()
|
||||
{
|
||||
Json::Value temp;
|
||||
Json::UInt i = 0;
|
||||
std::unique_lock<std::shared_mutex> lock{size_lock};
|
||||
for (const auto &u : users)
|
||||
{
|
||||
//we know it contains this key but we call this func to grab mutex
|
||||
temp[i++] = u.first;
|
||||
}
|
||||
return temp;
|
||||
}
|
||||
|
||||
void Save()
|
||||
{
|
||||
Json::StreamWriterBuilder builder;
|
||||
|
|
@ -148,7 +162,7 @@ public:
|
|||
|
||||
//loading info into json temp
|
||||
{
|
||||
std::unique_lock<std::shared_mutex> lock{save_lock}; //grabbing it from any busy add/del opperations
|
||||
std::scoped_lock<std::shared_mutex, std::shared_mutex> lock{size_lock, bal_lock}; //grabbing it from any busy add/del/sendfunds opperations
|
||||
for (const auto &u : users)
|
||||
{
|
||||
//we know it contains this key but we call this func to grab mutex
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ public:
|
|||
{
|
||||
auto resp = HttpResponse::newHttpResponse();
|
||||
auto handlerInfo = app().getHandlersInfo();
|
||||
resp->setBody("<h1>ALL FUNCTIONS (that have args) ARE EXPECTING JSON AS DATA TYPE</h1><h2><br />/BankF/<span style=\"color: #993300;\">admin</span>/close (POST)</h2><p><span style=\"background-color: #808080;\"> attempt </span> - admin password</p><blockquote><p>Closes and Saves the server.</p></blockquote><h2><br />/BankF/user (POST)</h2><p><span style=\"background-color: #808080;\"> name </span> - name of the user being added</p><p><span style=\"background-color: #808080;\"> init_pass </span> - initial password for the user being added</p><blockquote><p>Adds a user to the bank</p></blockquote><h2><br />/BankF/<span style=\"color: #993300;\">admin</span>/user (POST)</h2><p><span style=\"background-color: #808080;\"> name </span> - name of the user being added</p><p><span style=\"background-color: #808080;\"> attempt </span> - admin password required to add user with balance</p><p><span style=\"background-color: #808080;\"> init_bal </span> - initial balance for user being added</p><p><span style=\"background-color: #808080;\"> init_pass </span> - initial password for user being added</p><blockquote><p>Adds a user with initial balance</p></blockquote><h2><br />/BankF/sendfunds (POST)</h2><p><span style=\"background-color: #808080;\"> a_name </span> - sender's name</p><p><span style=\"background-color: #808080;\"> b_name </span> - reciever's name</p><p><span style=\"background-color: #808080;\"> amount </span> - amount being sent</p><p><span style=\"background-color: #808080;\"> attempt </span> - password of sender</p><blockquote><p>Sends money from one user to another</p></blockquote><h2><br />/BankF/changepass (PATCH)</h2><p><span style=\"background-color: #808080;\"> name </span> - name of user's password being changes</p><p><span style=\"background-color: #808080;\"> attempt </span> - password of user being changed</p><p><span style=\"background-color: #808080;\"> new_pass </span> - new password to replace the current user's password</p><blockquote><p> Changes password of a user</p></blockquote><p> </p><h2>/BankF/{<span style=\"color: #339966;\">name</span>}/bal (PATCH)</h2><p><span style=\"background-color: #808080;\"> name </span> - the name of the user being set</p><p><span style=\"background-color: #808080;\"> attempt </span> - the admin password required</p><p><span style=\"background-color: #808080;\"> amount </span> - the new balance of the user</p><blockquote><p>Sets the balance of a user</p></blockquote><h2> </h2><h2>/BankF/help (GET)</h2><blockquote><p>the page you're looking at right now!</p></blockquote><h2><br />/BankF/vpass (POST)</h2><p><span style=\"background-color: #808080;\"> name </span> - name of user being verified</p><p><span style=\"background-color: #808080;\"> attempt </span> - password being verified</p><blockquote><p>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</p></blockquote><h2><br />/BankF/contains/{<span style=\"color: #339966;\">name</span>} (GET)</h2><blockquote><p>returns a 0 or 1 based on if the bank contains the user</p></blockquote><p> </p><h2>/BankF/{<span style=\"color: #339966;\">name</span>}/bal (GET)</h2><blockquote><p>returns the balance of a given user's name, if -1 that means the user does not exist</p></blockquote><h2><br />/BankF/user (DELETE)</h2><p><span style=\"background-color: #808080;\"> name </span> - name of user being deleted</p><p><span style=\"background-color: #808080;\"> attempt </span> - password of user being deleted</p><blockquote><p>Deletes a user with the password of the user as verification</p></blockquote><h2><br />/BankF/<span style=\"color: #993300;\">admin</span>/user (DELETE)</h2><p><span style=\"background-color: #808080;\"> name </span> - name of user being deleted</p><p><span style=\"background-color: #808080;\"> attempt </span> - admin password</p><blockquote><p>Deletes a user with admin password as verification</p></blockquote>");
|
||||
resp->setBody("<body> <h1>ALL FUNCTIONS (that have args) ARE EXPECTING JSON AS DATA TYPE</h1> <h2>/BankF/<span style=\"color: #993300;\">admin</span>/close (POST)</h2> <p><span style=\"background-color: #808080;\"> attempt </span> - admin password</p> <blockquote> <p>Closes and Saves the server.</p> </blockquote> <h2>/BankF/user (POST)</h2> <p><span style=\"background-color: #808080;\"> name </span> - name of the user being added</p> <p><span style=\"background-color: #808080;\"> init_pass </span> - initial password for the user being added</p> <blockquote> <p>Adds a user to the bank</p> </blockquote> <h2>/BankF/<span style=\"color: #993300;\">admin</span>/user (POST)</h2> <p><span style=\"background-color: #808080;\"> name </span> - name of the user being added</p> <p><span style=\"background-color: #808080;\"> attempt </span> - admin password required to add user with balance</p> <p><span style=\"background-color: #808080;\"> init_bal </span> - initial balance for user being added</p> <p><span style=\"background-color: #808080;\"> init_pass </span> - initial password for user being added</p> <blockquote> <p>Adds a user with initial balance</p> </blockquote> <h2>/BankF/sendfunds (POST)</h2> <p><span style=\"background-color: #808080;\"> a_name </span> - sender's name</p> <p><span style=\"background-color: #808080;\"> b_name </span> - reciever's name</p> <p><span style=\"background-color: #808080;\"> amount </span> - amount being sent</p> <p><span style=\"background-color: #808080;\"> attempt </span> - password of sender</p> <blockquote> <p>Sends money from one user to another</p> </blockquote> <h2>/BankF/changepass (PATCH)</h2> <p><span style=\"background-color: #808080;\"> name </span> - name of user's password being changes</p> <p><span style=\"background-color: #808080;\"> attempt </span> - password of user being changed</p> <p><span style=\"background-color: #808080;\"> new_pass </span> - new password to replace the current user's password</p> <blockquote> <p>Changes password of a user</p> </blockquote> <h2>/BankF/{<span style=\"color: #339966;\">name</span>}/bal (PATCH)</h2> <p><span style=\"background-color: #808080;\"> name </span> - the name of the user being set</p> <p><span style=\"background-color: #808080;\"> attempt </span> - the admin password required</p> <p><span style=\"background-color: #808080;\"> amount </span> - the new balance of the user</p> <blockquote> <p>Sets the balance of a user</p> </blockquote> <h2>/BankF/help (GET)</h2> <blockquote> <p>the page you're looking at right now!</p> </blockquote> <h2>/BankF/vpass (POST)</h2> <p><span style=\"background-color: #808080;\"> name </span> - name of user being verified</p> <p><span style=\"background-color: #808080;\"> attempt </span> - password being verified</p> <blockquote> <p>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</p> </blockquote> <h2>/BankF/contains/{<span style=\"color: #339966;\">name</span>} (GET)</h2> <blockquote> <p>returns a 0 or 1 based on if the bank contains the user</p> </blockquote> <h2>/BankF/{<span style=\"color: #339966;\">name</span>}/bal (GET)</h2> <blockquote> <p>returns the balance of a given user's name, if -1 that means the user does not exist</p> </blockquote> <h2>/BankF/allusers/ (GET)</h2> <blockquote> <p>returns an array of all users in the bank</p> </blockquote> <h2>/BankF/user (DELETE)</h2> <p><span style=\"background-color: #808080;\"> name </span> - name of user being deleted</p> <p><span style=\"background-color: #808080;\"> attempt </span> - password of user being deleted</p> <blockquote> <p>Deletes a user with the password of the user as verification</p> </blockquote> <h2>/BankF/<span style=\"color: #993300;\">admin</span>/user (DELETE)</h2> <p><span style=\"background-color: #808080;\"> name </span> - name of user being deleted</p> <p><span style=\"background-color: #808080;\"> attempt </span> - admin password</p> <blockquote> <p>Deletes a user with admin password as verification</p> </blockquote> </body>");
|
||||
resp->setExpiredTime(0);
|
||||
callback(resp);
|
||||
}
|
||||
|
|
@ -106,6 +106,10 @@ public:
|
|||
GEN_BODY
|
||||
JSON(bank.SetBal(name, body["attempt"].asCString(), body["amount"].asUInt()));
|
||||
}
|
||||
void AllUsers(req_args)
|
||||
{
|
||||
JSON(bank.AllUsers());
|
||||
}
|
||||
|
||||
METHOD_LIST_BEGIN
|
||||
METHOD_ADD(BankF::Close, "/admin/close", Post, Options);
|
||||
|
|
@ -120,6 +124,7 @@ public:
|
|||
METHOD_ADD(BankF::VerifyPassword, "/vpass", Post, Options);
|
||||
METHOD_ADD(BankF::Contains, "/contains/{name}", Get, Options);
|
||||
METHOD_ADD(BankF::GetBal, "/{name}/bal", Get, Options);
|
||||
METHOD_ADD(BankF::AllUsers, "/allusers", Get, Options);
|
||||
|
||||
METHOD_ADD(BankF::DelUser, "/user", Delete, Options);
|
||||
METHOD_ADD(BankF::AdminDelUser, "/admin/user", Delete, Options);
|
||||
|
|
|
|||
Loading…
Reference in a new issue