From 90cbcec11d597a2e55c83062bbd12f650205a008 Mon Sep 17 00:00:00 2001 From: Kieran Date: Mon, 21 Feb 2022 14:32:13 +0000 Subject: [PATCH] Allow setting `None` paywall service --- VoidCat/Controllers/DownloadController.cs | 2 +- VoidCat/Controllers/UploadController.cs | 4 ++- VoidCat/Model/Paywall/Paywall.cs | 2 ++ VoidCat/Services/Redis/RedisPaywallStore.cs | 1 + VoidCat/spa/src/FileEdit.js | 17 ++++++++++++- VoidCat/spa/src/FilePreview.js | 2 +- VoidCat/spa/src/NoPaywallConfig.js | 27 +++++++++++++++++++++ VoidCat/spa/src/StrikePaywallConfig.js | 19 ++++++--------- 8 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 VoidCat/spa/src/NoPaywallConfig.js diff --git a/VoidCat/Controllers/DownloadController.cs b/VoidCat/Controllers/DownloadController.cs index 647198c..90b9ee8 100644 --- a/VoidCat/Controllers/DownloadController.cs +++ b/VoidCat/Controllers/DownloadController.cs @@ -83,7 +83,7 @@ public class DownloadController : Controller } // check paywall - if (meta.Paywall != default) + if (meta.Paywall != default && meta.Paywall.Service != PaywallServices.None) { var orderId = Request.Headers.GetHeader("V-OrderId") ?? Request.Query["orderId"]; if (!await IsOrderPaid(orderId)) diff --git a/VoidCat/Controllers/UploadController.cs b/VoidCat/Controllers/UploadController.cs index bb4de6f..6b22493 100644 --- a/VoidCat/Controllers/UploadController.cs +++ b/VoidCat/Controllers/UploadController.cs @@ -125,7 +125,9 @@ namespace VoidCat.Controllers return Ok(); } - return BadRequest(); + // if none set, set NoPaywallConfig + await _paywall.SetConfig(gid, new NoPaywallConfig()); + return Ok(); } } diff --git a/VoidCat/Model/Paywall/Paywall.cs b/VoidCat/Model/Paywall/Paywall.cs index ad17f5b..2f2f4b8 100644 --- a/VoidCat/Model/Paywall/Paywall.cs +++ b/VoidCat/Model/Paywall/Paywall.cs @@ -8,6 +8,8 @@ public enum PaywallServices public abstract record PaywallConfig(PaywallServices Service, PaywallMoney Cost); +public record NoPaywallConfig() : PaywallConfig(PaywallServices.None, new PaywallMoney(0m, PaywallCurrencies.BTC)); + public record StrikePaywallConfig(PaywallMoney Cost) : PaywallConfig(PaywallServices.Strike, Cost) { public string Handle { get; init; } diff --git a/VoidCat/Services/Redis/RedisPaywallStore.cs b/VoidCat/Services/Redis/RedisPaywallStore.cs index 512e6e1..3a986da 100644 --- a/VoidCat/Services/Redis/RedisPaywallStore.cs +++ b/VoidCat/Services/Redis/RedisPaywallStore.cs @@ -20,6 +20,7 @@ public class RedisPaywallStore : IPaywallStore var cfg = json.HasValue ? JsonConvert.DeserializeObject(json) : default; return cfg?.Service switch { + PaywallServices.None => JsonConvert.DeserializeObject(json), PaywallServices.Strike => JsonConvert.DeserializeObject(json), _ => default }; diff --git a/VoidCat/spa/src/FileEdit.js b/VoidCat/spa/src/FileEdit.js index ebe6813..d55766f 100644 --- a/VoidCat/spa/src/FileEdit.js +++ b/VoidCat/spa/src/FileEdit.js @@ -2,6 +2,7 @@ import {useState} from "react"; import "./FileEdit.css"; import {StrikePaywallConfig} from "./StrikePaywallConfig"; +import {NoPaywallConfig} from "./NoPaywallConfig"; export function FileEdit(props) { const file = props.file; @@ -12,10 +13,24 @@ export function FileEdit(props) { return null; } + async function saveConfig(cfg) { + let req = await fetch(`/upload/${file.id}/paywall`, { + method: "POST", + body: JSON.stringify(cfg), + headers: { + "Content-Type": "application/json" + } + }); + return req.ok; + } + function renderPaywallConfig() { switch (paywall) { + case 0: { + return ; + } case 1: { - return + return } } return null; diff --git a/VoidCat/spa/src/FilePreview.js b/VoidCat/spa/src/FilePreview.js index ece01a5..045e19d 100644 --- a/VoidCat/spa/src/FilePreview.js +++ b/VoidCat/spa/src/FilePreview.js @@ -21,7 +21,7 @@ export function FilePreview() { } function renderTypes() { - if (info.paywall) { + if (info.paywall && info.paywall.service !== 0) { if (!order) { return ; } diff --git a/VoidCat/spa/src/NoPaywallConfig.js b/VoidCat/spa/src/NoPaywallConfig.js new file mode 100644 index 0000000..7caa880 --- /dev/null +++ b/VoidCat/spa/src/NoPaywallConfig.js @@ -0,0 +1,27 @@ +import FeatherIcon from "feather-icons-react"; +import {useState} from "react"; + +export function NoPaywallConfig(props) { + const [saveStatus, setSaveStatus] = useState(); + const privateFile = props.privateFile; + const onSaveConfig = props.onSaveConfig; + + async function saveConfig(e) { + e.target.disabled = true; + let cfg = { + editSecret: privateFile.metadata.editSecret + }; + + if (typeof onSaveConfig === "function") { + setSaveStatus(await onSaveConfig(cfg)); + } + e.target.disabled = false; + } + + return ( +
+ + {saveStatus ? : null} +
+ ) +} \ No newline at end of file diff --git a/VoidCat/spa/src/StrikePaywallConfig.js b/VoidCat/spa/src/StrikePaywallConfig.js index f3b7a73..59ea8cd 100644 --- a/VoidCat/spa/src/StrikePaywallConfig.js +++ b/VoidCat/spa/src/StrikePaywallConfig.js @@ -5,15 +5,15 @@ import {PaywallCurrencies} from "./Const"; export function StrikePaywallConfig(props) { const file = props.file; const privateFile = props.privateFile; + const onSaveConfig = props.onSaveConfig; const paywall = file.paywall; const editSecret = privateFile.metadata.editSecret; - const id = file.id; const [username, setUsername] = useState(paywall?.handle ?? "hrf"); const [currency, setCurrency] = useState(paywall?.cost.currency ?? PaywallCurrencies.USD); const [price, setPrice] = useState(paywall?.cost.amount ?? 1); const [saveStatus, setSaveStatus] = useState(); - + async function saveStrikeConfig(e) { e.target.disabled = true; let cfg = { @@ -27,17 +27,14 @@ export function StrikePaywallConfig(props) { } }; - let req = await fetch(`/upload/${id}/paywall`, { - method: "POST", - body: JSON.stringify(cfg), - headers: { - "Content-Type": "application/json" + if (typeof onSaveConfig === "function") { + if (await onSaveConfig(cfg)) { + setSaveStatus(true); + } else { + alert("Error settings paywall config!"); + setSaveStatus(false); } - }); - if (!req.ok) { - alert("Error settings paywall config!"); } - setSaveStatus(req.ok); e.target.disabled = false; }