diff options
Diffstat (limited to 'pages/api/money')
-rw-r--r-- | pages/api/money/account.php | 62 | ||||
-rw-r--r-- | pages/api/money/accounts.php | 96 | ||||
-rw-r--r-- | pages/api/money/create.php | 99 |
3 files changed, 257 insertions, 0 deletions
diff --git a/pages/api/money/account.php b/pages/api/money/account.php new file mode 100644 index 0000000..6620733 --- /dev/null +++ b/pages/api/money/account.php @@ -0,0 +1,62 @@ +<?php + +require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn; global $_PROFILE; +require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc"; +if (!$isLoggedIn) header("Location: /-/login") and die(); +header("Content-Type: application/json"); + +$accounts = array_map(function ($i) { + $name = substr($i, 0, -5); + $data = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/money/" . $i), true); + $data["_name"] = $name; + return $data; +}, array_values(array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/money"), function ($i) { return !str_starts_with($i, "."); }))); +$rate = (float)trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/exchange.txt")); +$obj = []; + +if (!isset($_GET["id"])) { + die(json_encode($obj, JSON_PRETTY_PRINT)); +} + +foreach ($accounts as $account) { + if ($account["_name"] === $_GET["id"]) { + $acc = []; + + $acc["id"] = $account["_name"]; + $acc["name"] = $account["name"]; + $acc["currency"] = $account["currency"]; + $acc["default"] = $account["default"]; + $acc["total"] = round(calculateFullAmount($account, true), 2); + $acc["interests"] = $account["interests"]; + $acc["max"] = $account["max"]; + $acc["used_percentage"] = isset($account["max"]) ? (calculateFullAmount($account, true) / $account["max"]) * 100 : null; + $acc["transactions"] = []; + + foreach ($account["transactions"] as $index => $transaction) { + $member = getMemberWithoutSystem($transaction["author"]) ?? getMemberWithoutSystem("zdtsg"); + $trans = [ + "id" => $index, + "author" => [ + "avatar" => getAsset($member["_system"], $member["id"]), + "name" => $member["display_name"] ?? $member["name"] + ], + "type" => $transaction["amount"] < 0 ? "REMOVE" : "ADD", + "amount" => round(abs($transaction["amount"]), 2), + "date" => [ + "ts" => strtotime($transaction["date"]), + "iso" => date('c', strtotime($transaction["date"])), + "relative" => timeAgo($transaction["date"]) + ], + "description" => (isset($transaction["description"]) && trim($transaction["description"]) !== "") ? trim($transaction["description"]) : null + ]; + + $acc["transactions"][] = $trans; + } + + $obj = $acc; + } +} + +/* ------------------- */ + +die(json_encode($obj, JSON_PRETTY_PRINT));
\ No newline at end of file diff --git a/pages/api/money/accounts.php b/pages/api/money/accounts.php new file mode 100644 index 0000000..22d8c77 --- /dev/null +++ b/pages/api/money/accounts.php @@ -0,0 +1,96 @@ +<?php + +require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn; global $_PROFILE; +require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc"; +if (!$isLoggedIn) header("Location: /-/login") and die(); +header("Content-Type: application/json"); + +$accounts = array_map(function ($i) { + $name = substr($i, 0, -5); + $data = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/money/" . $i), true); + $data["_name"] = $name; + return $data; +}, array_values(array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/money"), function ($i) { return !str_starts_with($i, "."); }))); +$rate = (float)trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/exchange.txt")); +$obj = [ + "total" => 0, + "exchange_rate" => $rate, + "users" => [ + "cloudburst" => [ + "total" => 0, + "accounts" => [] + ], + "raindrops" => [ + "total" => 0, + "accounts" => [] + ] + ] +]; + +$allAccounts = array_reduce(array_map(function ($i) { + return calculateFullAmount($i, true, true); +}, $accounts), function ($a, $b) { + return $a + $b; +}); +$obj["total"] = [ + "gbp" => round($allAccounts, 2), + "eur" => round($allAccounts * (1 / $rate), 2) +]; + +/* ------------------- */ + +$allAccounts = array_reduce(array_map(function ($i) { + return calculateFullAmount($i, true, true); +}, array_values(array_filter($accounts, function ($i) { return $i["owner"] === "cloudburst"; }))), function ($a, $b) { + return $a + $b; +}); + +$obj["users"]["cloudburst"]["total"] = $allAccounts; + +foreach ($accounts as $index => $account) { + if ($account["owner"] === "cloudburst") { + $acc = []; + + $acc["id"] = $account["_name"]; + $acc["name"] = $account["name"]; + $acc["currency"] = $account["currency"]; + $acc["default"] = $account["default"]; + $acc["total"] = round(calculateFullAmount($account, true), 2); + $acc["interests"] = $account["interests"]; + $acc["max"] = $account["max"]; + $acc["used_percentage"] = isset($account["max"]) ? (calculateFullAmount($account, true) / $account["max"]) * 100 : null; + + $obj["users"]["cloudburst"]["accounts"][] = $acc; + } +} +/* ------------------- */ + +$allAccounts = array_reduce(array_map(function ($i) { + return calculateFullAmount($i, true, true); +}, array_values(array_filter($accounts, function ($i) { return $i["owner"] === "raindrops"; }))), function ($a, $b) { + return $a + $b; +}); + +$obj["users"]["raindrops"]["total"] = $allAccounts; + +foreach ($accounts as $index => $account) { + if ($account["owner"] === "raindrops") { + $acc = []; + + $acc["id"] = $account["_name"]; + $acc["name"] = $account["name"]; + $acc["currency"] = $account["currency"]; + $acc["default"] = $account["default"]; + $acc["total"] = round(calculateFullAmount($account, true), 2); + $acc["interests"] = $account["interests"]; + $acc["max"] = $account["max"]; + $acc["used_percentage"] = isset($account["max"]) ? (calculateFullAmount($account, true) / $account["max"]) * 100 : null; + $acc["transactions"] = null; + + $obj["users"]["raindrops"]["accounts"][] = $acc; + } +} + +/* ------------------- */ + +die(json_encode($obj, JSON_PRETTY_PRINT));
\ No newline at end of file diff --git a/pages/api/money/create.php b/pages/api/money/create.php new file mode 100644 index 0000000..ff06a37 --- /dev/null +++ b/pages/api/money/create.php @@ -0,0 +1,99 @@ +<?php + +require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/session.inc"; global $isLoggedIn; global $_PROFILE; +require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/util/functions.inc"; +$app = $GLOBALS["ColdHazeApp"] = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/app.json"), true); +if (!$isLoggedIn) header("Location: /-/login") and die(); +header("Content-Type: application/json"); + +$request_raw = file_get_contents('php://input'); +$json_object = $data = json_decode($request_raw, true); + +$systemID = $_PROFILE["login"] === "cloudburst" ? "ynmuc" : "gdapd"; +$fronters = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/" . ($_PROFILE["login"] === "cloudburst" ? "ynmuc" : "gdapd") . "/fronters.json"), true)["members"]; + +if (count($fronters) > 0) { + $myId = $fronters[0]["id"]; +} else { + $myId = "zdtsg"; +} + +$accounts = array_map(function ($i) { + $name = substr($i, 0, -5); + $data = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/money/" . $i), true); + $data["_name"] = $name; + return $data; +}, array_values(array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/money"), function ($i) { return !str_starts_with($i, "."); }))); +$rate = (float)trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/exchange.txt")); + +$obj = [ + "success" => false, + "error" => null +]; + +if ($_SERVER["REQUEST_METHOD"] !== "POST") { + $obj["success"] = false; + $obj["error"] = "INVALID_METHOD"; + die(json_encode($obj, JSON_PRETTY_PRINT)); +} + +if (!isset($data["amount"]) || !isset($data["id"]) || !isset($data["description"])) { + $obj["success"] = false; + $obj["error"] = "MISSING_OPERAND"; + die(json_encode($obj, JSON_PRETTY_PRINT)); +} + +$account = array_values(array_filter($accounts, function ($i) use ($data) { return $i["_name"] === $data["id"]; }))[0] ?? null; + +if (!isset($account)) { + $obj["success"] = false; + $obj["error"] = "ACCOUNT_NOT_FOUND"; + die(json_encode($obj, JSON_PRETTY_PRINT)); +} + +if (!(isset($data["amount"]) && is_numeric($data["amount"]) && (float)$data["amount"] < 9999 && (float)$data["amount"] > -9999)) { + $obj["success"] = false; + $obj["error"] = "INVALID_AMOUNT"; + die(json_encode($obj, JSON_PRETTY_PRINT)); +} +if (!isset($data["description"])) $data["description"] = ""; + +if (strlen($data["description"]) > 150) { + $obj["success"] = false; + $obj["error"] = "DESCRIPTION_TOO_LONG"; + die(json_encode($obj, JSON_PRETTY_PRINT)); +} + +if ($data["amount"] === 0) { + $obj["success"] = false; + $obj["error"] = "AMOUNT_IS_ZERO"; + die(json_encode($obj, JSON_PRETTY_PRINT)); +} + +$ntfy = $GLOBALS["ColdHazeApp"]["ntfy"]; +file_get_contents('https://' . $ntfy["server"] . '/' . $ntfy["topic"], false, stream_context_create([ + 'http' => [ + 'method' => 'POST', + 'header' => + "Content-Type: text/plain\r\n" . + "Title: " . formatPonypush((getMember($myId)["display_name"] ?? getMember($myId)["name"]) . " created a transaction to " . $account["name"] . " (" . ucfirst($account["owner"]) . ")") . "\r\n" . + "Tags: bits\r\n" . + "Authorization: Basic " . base64_encode($ntfy["user"] . ":" . $ntfy["password"]), + 'content' => formatPonypush(($account["currency"] === "gbp" ? "£" : "€") . abs((float)$_GET["amount"]) . " were " . ((float)$_GET["amount"] >= 0 ? "added" : "removed") . " just now" . (trim($_GET["description"]) !== "" ? ": " . $_GET["description"] : "")) + ] +])); + +array_unshift($account["transactions"], [ + "author" => $myId, + "description" => $_GET["description"], + "amount" => (float)$_GET["amount"], + "date" => date('c') +]); + +$name = $account["_name"]; +unset($account["_name"]); + +file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/money/" . $name . ".json", json_encode($account, JSON_PRETTY_PRINT)); + +$obj["success"] = true; +die(json_encode($obj, JSON_PRETTY_PRINT));
\ No newline at end of file |