core: badge codes schema, plan (#7427)

This commit is contained in:
spaced4ndy
2026-08-28 09:31:24 +00:00
committed by GitHub
parent 7d54a5b960
commit e80a174f13
11 changed files with 364 additions and 20 deletions
+4
View File
@@ -62,6 +62,10 @@ data BadgeServiceCommand
paymentVia :: ServicePaymentMethod,
upgrade :: Maybe BadgeUpgrade -- upgrade non-store badge
}
| BSCRedeemBadgeCode
{ masterKey :: BadgeMasterKey,
code :: Text -- no badgeRequest: a code carries no tier for the client to state
}
| BSCPurchaseBadge
{ badgeRequest :: BadgeRequest,
payment :: ServicePayment,
+5 -1
View File
@@ -9,6 +9,7 @@ module Simplex.Chat.Badges.Types
BadgeItemStatus (..),
OfferDiscount (..),
BadgePurchaseStatus (..),
BadgeCodePaymentStatus (..),
LedgerEntryType (..),
LedgerCreditType (..),
LedgerDebitType (..),
@@ -22,7 +23,6 @@ module Simplex.Chat.Badges.Types
) where
import qualified Data.Aeson as J
import Data.ByteString.Char8 (ByteString)
import Data.Int (Int64)
import Data.Text (Text)
import Data.Time.Clock (UTCTime)
@@ -58,6 +58,10 @@ data OfferDiscount
data BadgePurchaseStatus = PSAcquiring | PSIssued | PSSuperseded | PSFailed
deriving (Eq, Show)
-- unconfirmed draft
data BadgeCodePaymentStatus = CPSPaid | CPSUnpaid | CPSFree
deriving (Eq, Show)
-- confirmed
data LedgerEntryType = LECredit {credit :: LedgerCreditType} | LEDebit {debit :: LedgerDebitType}
deriving (Eq, Show)
-1
View File
@@ -26,6 +26,5 @@ data ServicePayment
= SPApple {jws :: Text}
| SPGoogle {token :: Text}
| SPInvoice {invoiceId :: InvoiceId}
| SPCode {code :: Text}
| SPReceipt {receipt :: Text} -- transfer of unissued months
deriving (Show)
@@ -180,12 +180,23 @@ CREATE INDEX @idx_badge_issuances_purchase ON @badge_issuances(badge_purchase_id
badgeSchemaTablesDown :: Text
badgeSchemaTablesDown =
[r|
DROP INDEX @idx_badge_issuances_purchase;
DROP TABLE @badge_issuances;
DROP INDEX @idx_badge_ledger_uuid;
DROP INDEX @idx_badge_ledger_purchase;
DROP INDEX @idx_badge_ledger_payment;
DROP INDEX @idx_badge_ledger_charge;
DROP INDEX @idx_badge_ledger_from_purchase;
DROP INDEX @idx_badge_ledger_to_purchase;
DROP TABLE @badge_ledger;
DROP INDEX @idx_badge_subscription_changes_purchase;
DROP TABLE @badge_subscription_changes;
DROP INDEX @idx_badge_invoices_purchase;
DROP TABLE @badge_invoices;
DROP TABLE @badge_purchases;
DROP TABLE @subscription_charges;
DROP INDEX @idx_payments_provider_ref;
DROP INDEX @idx_payments_invoice;
DROP TABLE @payments;
DROP TABLE @invoices;
DROP TABLE @badge_offers;
@@ -217,11 +228,34 @@ ALTER TABLE badge_ledger ADD COLUMN entry_type_value TEXT;
CREATE INDEX idx_badge_purchases_user ON badge_purchases(user_id);
ALTER TABLE users ADD COLUMN shown_badge_id BIGINT REFERENCES badge_purchases ON DELETE SET NULL;
CREATE TABLE badge_code_redemptions(
badge_code_redemption_id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users ON DELETE CASCADE,
code TEXT NOT NULL,
purchase_key BYTEA NOT NULL,
purchase_priv_key BYTEA NOT NULL,
master_key BYTEA NOT NULL,
created_at TIMESTAMPTZ NOT NULL,
UNIQUE(code)
);
CREATE INDEX idx_badge_code_redemptions_user ON badge_code_redemptions(user_id);
ALTER TABLE badge_purchases ADD COLUMN badge_code_redemption_id BIGINT REFERENCES badge_code_redemptions;
CREATE UNIQUE INDEX idx_badge_purchases_code_redemption ON badge_purchases(badge_code_redemption_id);
|]
down_m20261001_user_badges :: Text
down_m20261001_user_badges =
[r|
DROP INDEX idx_badge_purchases_code_redemption;
DROP INDEX idx_badge_purchases_user;
ALTER TABLE users DROP COLUMN shown_badge_id;
|]
<> badgeSchemaDown ""
<> [r|
DROP INDEX idx_badge_code_redemptions_user;
DROP TABLE badge_code_redemptions;
|]
@@ -181,12 +181,23 @@ CREATE INDEX @idx_badge_issuances_purchase ON @badge_issuances(badge_purchase_id
badgeSchemaTablesDown :: Query
badgeSchemaTablesDown =
[sql|
DROP INDEX @idx_badge_issuances_purchase;
DROP TABLE @badge_issuances;
DROP INDEX @idx_badge_ledger_uuid;
DROP INDEX @idx_badge_ledger_purchase;
DROP INDEX @idx_badge_ledger_payment;
DROP INDEX @idx_badge_ledger_charge;
DROP INDEX @idx_badge_ledger_from_purchase;
DROP INDEX @idx_badge_ledger_to_purchase;
DROP TABLE @badge_ledger;
DROP INDEX @idx_badge_subscription_changes_purchase;
DROP TABLE @badge_subscription_changes;
DROP INDEX @idx_badge_invoices_purchase;
DROP TABLE @badge_invoices;
DROP TABLE @badge_purchases;
DROP TABLE @subscription_charges;
DROP INDEX @idx_payments_provider_ref;
DROP INDEX @idx_payments_invoice;
DROP TABLE @payments;
DROP TABLE @invoices;
DROP TABLE @badge_offers;
@@ -218,11 +229,34 @@ ALTER TABLE badge_ledger ADD COLUMN entry_type_value TEXT;
CREATE INDEX idx_badge_purchases_user ON badge_purchases(user_id);
ALTER TABLE users ADD COLUMN shown_badge_id INTEGER REFERENCES badge_purchases ON DELETE SET NULL;
CREATE TABLE badge_code_redemptions(
badge_code_redemption_id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL REFERENCES users ON DELETE CASCADE,
code TEXT NOT NULL,
purchase_key BLOB NOT NULL,
purchase_priv_key BLOB NOT NULL,
master_key BLOB NOT NULL,
created_at TEXT NOT NULL,
UNIQUE(code)
);
CREATE INDEX idx_badge_code_redemptions_user ON badge_code_redemptions(user_id);
ALTER TABLE badge_purchases ADD COLUMN badge_code_redemption_id INTEGER REFERENCES badge_code_redemptions;
CREATE UNIQUE INDEX idx_badge_purchases_code_redemption ON badge_purchases(badge_code_redemption_id);
|]
down_m20261001_user_badges :: Query
down_m20261001_user_badges =
[sql|
DROP INDEX idx_badge_purchases_code_redemption;
DROP INDEX idx_badge_purchases_user;
ALTER TABLE users DROP COLUMN shown_badge_id;
|]
<> badgeSchemaDown ""
<> [sql|
DROP INDEX idx_badge_code_redemptions_user;
DROP TABLE badge_code_redemptions;
|]