From 073fcbad58e2339f6768d35607d2eb0a01e7bd43 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Wed, 27 Mar 2019 01:10:36 -0600 Subject: [PATCH] Add profile fetch and money sending APIs --- api/actions/profile.php | 25 ++++++++++++++++++++++++ api/actions/send.php | 41 ++++++++++++++++++++++++++++++++++++++++ api/apisettings.php | 7 +++++++ database.mwb | Bin 9742 -> 10952 bytes 4 files changed, 73 insertions(+) create mode 100644 api/actions/profile.php create mode 100644 api/actions/send.php diff --git a/api/actions/profile.php b/api/actions/profile.php new file mode 100644 index 0000000..a29d3c3 --- /dev/null +++ b/api/actions/profile.php @@ -0,0 +1,25 @@ +has("accounts", ["publicid" => $VARS["id"]])) { + sendJsonResp($Strings->get("Could not find a matching account.", false), "ERROR"); +} + +$profile = $database->get("accounts", ["publicid", "name", "username", "type", "verified"], ["publicid" => $VARS["id"]]); + +// Make sure the name field always has something useful +if (empty($profile["name"])) { + $profile["name"] = $profile["username"]; +} + +$profile["verified"] = $profile["verified"] == 1; + +exitWithJson([ + "status" => "OK", + "profile" => $profile +]); diff --git a/api/actions/send.php b/api/actions/send.php new file mode 100644 index 0000000..cce3b70 --- /dev/null +++ b/api/actions/send.php @@ -0,0 +1,41 @@ +get("accounts", ["[>]authkeys" => "accountid"], ["accounts.accountid", "balance", "type"], ["authkeys.key" => $VARS["key"]]); + +if (!$database->has("accounts", ["publicid" => $VARS["to"]])) { + sendJsonResp($Strings->get("Could not find the receiving account.", false), "ERROR"); +} + +$receiver = $database->get("accounts", ["accountid", "balance", "type"], ["publicid" => $VARS["to"]]); + +$amount = $VARS["amount"] * 1.0; + +if ($amount > $sender["balance"]) { + sendJsonResp($Strings->get("Insufficient funds.", false), "ERROR"); +} + +if (($sender["type"] === 1 && $receiver["type"] === 2) || ($sender["type"] === 2 && $receiver["type"] === 3)) { + $database->action(function ($database) { + global $VARS, $sender, $receiver, $amount; + + $database->update("accounts", ["balance[+]" => $amount], ["accountid" => $receiver["accountid"]]); + $database->update("accounts", ["balance[-]" => $amount], ["accountid" => $sender["accountid"]]); + + $database->insert("transactions", [ + "amount" => $amount, + "fromid" => $sender["accountid"], + "toid" => $receiver["accountid"], + "datetime" => date("Y-m-d H:i:s") + ]); + }); + + sendJsonResp(); +} else { + sendJsonResp($Strings->get("Money cannot be sent from receivers to givers.", false), "ERROR"); +} \ No newline at end of file diff --git a/api/apisettings.php b/api/apisettings.php index 86d0a76..25977e9 100644 --- a/api/apisettings.php +++ b/api/apisettings.php @@ -58,5 +58,12 @@ $APIS = [ "to" => "/[0-9a-z]+/", "amount" => "/[0-9]{1,4}(\.[0-9]{2})?/" ] + ], + "getprofile" => [ + "load" => "profile.php", + "vars" => [ + "key" => $keyregex, + "id" => "/[0-9a-z]+/" + ] ] ]; diff --git a/database.mwb b/database.mwb index 5af467945196c3eb9191e41f33e1c09ac4261693..d0813876b1f93df8b2605fea48e1ffc2b32242f9 100644 GIT binary patch literal 10952 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

k*_uB83k$9a6$l?;k6avIy_WVdH!36d2Y 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