From 7845753b27eb7b88ee7bc1a29512c6cfaf551ec8 Mon Sep 17 00:00:00 2001 From: Fornax Date: Tue, 16 Nov 2021 13:58:00 +0100 Subject: [PATCH] Add prepaid subscription management page --- svelte/src/admin_panel/Router.svelte | 20 +- svelte/src/admin_panel/Subscriptions.svelte | 70 +++++++ svelte/src/user_home/Home.svelte | 17 +- svelte/src/user_home/Router.svelte | 38 +++- svelte/src/user_home/Transactions.svelte | 220 ++++++++++++++++++++ svelte/src/util/Formatting.svelte | 16 +- webcontroller/web_controller.go | 3 + 7 files changed, 356 insertions(+), 28 deletions(-) create mode 100644 svelte/src/admin_panel/Subscriptions.svelte create mode 100644 svelte/src/user_home/Transactions.svelte diff --git a/svelte/src/admin_panel/Router.svelte b/svelte/src/admin_panel/Router.svelte index e6fd500..bb2fa39 100644 --- a/svelte/src/admin_panel/Router.svelte +++ b/svelte/src/admin_panel/Router.svelte @@ -5,6 +5,7 @@ import IpBans from "./IPBans.svelte" import Home from "./Home.svelte" import { onMount } from "svelte"; import BlockFiles from "./BlockFiles.svelte"; +import Subscriptions from "./Subscriptions.svelte"; let page = "" @@ -62,6 +63,13 @@ onMount(() => { remove_circle IP bans + {navigate("subscriptions", "Subscriptions")}}> + receipt_long + Subscriptions + edit Update global settings @@ -69,14 +77,16 @@ onMount(() => { {#if page === "status"} - + {:else if page === "block_files"} - + {:else if page === "abuse_reports"} - + {:else if page === "abuse_reporters"} - + {:else if page === "ip_bans"} - + + {:else if page === "subscriptions"} + {/if} diff --git a/svelte/src/admin_panel/Subscriptions.svelte b/svelte/src/admin_panel/Subscriptions.svelte new file mode 100644 index 0000000..bc9619b --- /dev/null +++ b/svelte/src/admin_panel/Subscriptions.svelte @@ -0,0 +1,70 @@ + + +
+
+

Give user credit

+

+ This adds credit to a user's account. You only need to enter one of + the user id, username or email. +

+
+
+
+
+
diff --git a/svelte/src/user_home/Home.svelte b/svelte/src/user_home/Home.svelte index 41c1a2c..ee5ea02 100644 --- a/svelte/src/user_home/Home.svelte +++ b/svelte/src/user_home/Home.svelte @@ -79,9 +79,7 @@ let update_graphs = (minutes, interval, live) => { } let direct_link_bandwidth_used = 0 -let direct_link_percent = 0 let storage_space_used = 0 -let storage_percent = 0 let load_direct_bw = () => { let today = new Date() let start = new Date() @@ -98,9 +96,7 @@ let load_direct_bw = () => { }).then(resp => { let total = resp.amounts.reduce((accum, val) => accum += val, 0); direct_link_bandwidth_used = total - direct_link_percent = total / window.user.subscription.direct_linking_bandwidth storage_space_used = window.user.storage_space_used - storage_percent = window.user.storage_space_used / window.user.subscription.storage_space }).catch(e => { console.error("Error requesting time series: " + e); }) @@ -148,8 +144,17 @@ onDestroy(() => { - - + {#if window.user.subscription.storage_space === -1} + Storage space used: {formatDataVolume(storage_space_used, 3)}
+ {:else} + + {/if} + + {#if window.user.subscription.storage_space === -1} + Hotlink bandwidth used in the last 30 days: {formatDataVolume(direct_link_bandwidth_used, 3)}
+ {:else} + + {/if}

Exports

diff --git a/svelte/src/user_home/Router.svelte b/svelte/src/user_home/Router.svelte index 7ce3a71..2ccb073 100644 --- a/svelte/src/user_home/Router.svelte +++ b/svelte/src/user_home/Router.svelte @@ -3,6 +3,7 @@ import { onMount } from "svelte"; import Home from "./Home.svelte"; import AccountSettings from "./AccountSettings.svelte"; import APIKeys from "./APIKeys.svelte"; +import Transactions from "./Transactions.svelte"; let page = "" @@ -14,21 +15,28 @@ let navigate = (path, title) => { ) } -onMount(() => { +let get_page = () => { let newpage = window.location.pathname.substring(window.location.pathname.lastIndexOf("/")+1) if (newpage === "user") { - newpage = "" + newpage = "home" } + page = newpage +} + +onMount(() => { + get_page() }) + +
- {#if page === ""} - + {#if page === "home"} + {:else if page === "settings"} - + {:else if page === "api_keys"} - + + {:else if page === "transactions"} + {/if}
- - diff --git a/svelte/src/user_home/Transactions.svelte b/svelte/src/user_home/Transactions.svelte new file mode 100644 index 0000000..abfd884 --- /dev/null +++ b/svelte/src/user_home/Transactions.svelte @@ -0,0 +1,220 @@ + + +
+ {#if loading} +
+ +
+ {/if} +
+

Manage subscription

+

+ Current account balance: {formatEuros(window.user.balance_micro_eur, 4)} +

+ + {#if result !== ""} +
+ {result} +
+ {/if} + +
+ {#if window.user.subscription.id !== "prepaid"} + Prepaid subscription is not active.
+ + {:else} + Prepaid subscription is active.
+ Deactivating your subscription may cause your files to expire + sooner than expected!
+ + {/if} +
+

+ When your prepaid subscription is active you will be charged: +

+
    +
  • + €4 per TB per month for storage. The amount is charged per day + and divided by the average number of days in a month (30.4375). + So if you have exactly 1 TB on your account you will be charged + €0.131416838 per day. +
  • +
  • + €2 per TB of bandwidth, charged every day based on the usage of + the previous day +
  • +
  • + €2 per month for the subscription itself, because prepaid has + the same perks as the Pro subscription (No advertisements, no + bandwidth limit, video player, etc) +
  • +
+ +

Transaction log

+

+ Here is a log of all transactions on your account balance. +

+ + {#each months as month} +

{month.month}

+
    +
  • Subscription charge: {formatEuros(month.total_subscription_charge, 4)}
  • +
  • Storage charge: {formatEuros(month.total_storage_charge, 4)}
  • +
  • Bandwidth charge: {formatEuros(month.total_bandwidth_charge, 4)}
  • +
  • Total charge: {formatEuros(month.total_deducted, 4)}
  • +
  • Deposited: {formatEuros(month.total_deposited, 4)}
  • +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + {#each month.rows as row} + + + + + + + + + + + {/each} + +
TimeBalanceSubscriptionStorageBandwidthDeposited
ChargedChargedUsedChargedUsed
{formatDate(row.time, true, true, false)}{formatEuros(row.new_balance, 4)}{formatEuros(row.subscription_charge, 4)}{formatEuros(row.storage_charge, 4)}{formatDataVolume(row.storage_used, 3)}{formatEuros(row.bandwidth_charge, 4)}{formatDataVolume(row.bandwidth_used, 3)}{formatEuros(row.deposit_amount, 4)}
+
+ {/each} +
+
+ + diff --git a/svelte/src/util/Formatting.svelte b/svelte/src/util/Formatting.svelte index 7feafea..9088382 100644 --- a/svelte/src/util/Formatting.svelte +++ b/svelte/src/util/Formatting.svelte @@ -15,17 +15,17 @@ export const formatThousands = (x) => { export const formatDataVolume = (amt, precision) => { if (precision < 3) { precision = 3; } - if (amt >= 1e18) { + if (amt >= 1e18-1e15) { return (amt/1e18).toPrecision(precision) + " EB"; - }else if (amt >= 1e15) { + }else if (amt >= 1e15-1e12) { return (amt/1e15).toPrecision(precision) + " PB"; - }else if (amt >= 1e12) { + }else if (amt >= 1e12-1e9) { return (amt/1e12).toPrecision(precision) + " TB"; - } else if (amt >= 1e9) { + } else if (amt >= 1e9-1e6) { return (amt/1e9).toPrecision(precision) + " GB"; - } else if (amt >= 1e6) { + } else if (amt >= 1e6-1e3) { return (amt/1e6).toPrecision(precision) + " MB"; - } else if (amt >= 1e3) { + } else if (amt >= 1e3-1) { return (amt/1e3).toPrecision(precision) + " kB"; } return amt + " B" @@ -58,4 +58,8 @@ export const formatDate = (date, hours, minutes, seconds) => { if (seconds) { dateStr += ":"+("00"+date.getMinutes()).slice(-2) } return dateStr } + +export const formatEuros = (amt, precision) => { + return "€ "+ (amt / 1000000).toFixed(precision) +} diff --git a/webcontroller/web_controller.go b/webcontroller/web_controller.go index dc69a66..e7becd6 100644 --- a/webcontroller/web_controller.go +++ b/webcontroller/web_controller.go @@ -175,8 +175,10 @@ func New( // User account settings {GET, "user" /* */, wc.serveTemplate("user_home", handlerOpts{Auth: true})}, + {GET, "user/home" /* */, wc.serveTemplate("user_home", handlerOpts{Auth: true})}, {GET, "user/settings" /* */, wc.serveTemplate("user_home", handlerOpts{Auth: true})}, {GET, "user/api_keys" /* */, wc.serveTemplate("user_home", handlerOpts{Auth: true})}, + {GET, "user/transactions" /* */, wc.serveTemplate("user_home", handlerOpts{Auth: true})}, {GET, "user/confirm_email" /* */, wc.serveEmailConfirm}, {GET, "user/password_reset_confirm" /**/, wc.serveForm(wc.passwordResetConfirmForm, handlerOpts{NoEmbed: true})}, {PST, "user/password_reset_confirm" /**/, wc.serveForm(wc.passwordResetConfirmForm, handlerOpts{NoEmbed: true})}, @@ -194,6 +196,7 @@ func New( {GET, "admin/abuse_reporters" /**/, wc.serveTemplate("admin", handlerOpts{Auth: true})}, {GET, "admin/abuse_reports" /* */, wc.serveTemplate("admin", handlerOpts{Auth: true})}, {GET, "admin/ip_bans" /* */, wc.serveTemplate("admin", handlerOpts{Auth: true})}, + {GET, "admin/subscriptions" /* */, wc.serveTemplate("admin", handlerOpts{Auth: true})}, {GET, "admin/globals" /* */, wc.serveForm(wc.adminGlobalsForm, handlerOpts{Auth: true})}, {PST, "admin/globals" /* */, wc.serveForm(wc.adminGlobalsForm, handlerOpts{Auth: true})},