core: register badges migration (#7429)

This commit is contained in:
spaced4ndy authored and GitHub committed 2026-08-28 10:20:13 +00:00
1 parent e80a174f13
commit 6075ea5797
8 files changed
+700 -18

No files matched your search

@@ -54,7 +54,8 @@ CREATE TABLE users(
auto_accept_member_contacts INTEGER NOT NULL DEFAULT 0,
is_user_chat_relay INTEGER NOT NULL DEFAULT 0,
client_service INTEGER NOT NULL DEFAULT 0,
auto_accept_group_invitations INTEGER NOT NULL DEFAULT 0, -- 1 for active user
auto_accept_group_invitations INTEGER NOT NULL DEFAULT 0,
shown_badge_id INTEGER REFERENCES badge_purchases ON DELETE SET NULL, -- 1 for active user
FOREIGN KEY(user_id, local_display_name)
REFERENCES display_names(user_id, local_display_name)
ON DELETE RESTRICT
@@ -851,6 +852,152 @@ CREATE TABLE rcv_roster_transfers(
created_at TEXT NOT NULL DEFAULT(datetime('now')),
updated_at TEXT NOT NULL DEFAULT(datetime('now'))
) STRICT;
CREATE TABLE invoices(
invoice_id TEXT NOT NULL PRIMARY KEY,
provider TEXT NOT NULL,
price INTEGER NOT NULL,
discount_amount INTEGER,
credit_amount INTEGER,
amount INTEGER NOT NULL,
currency TEXT NOT NULL,
payment_url TEXT,
payment_address TEXT,
payment_crypto_currency TEXT,
payment_crypto_amount TEXT,
expires_at TEXT NOT NULL,
status TEXT NOT NULL,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
) STRICT;
CREATE TABLE payments(
payment_id TEXT NOT NULL PRIMARY KEY,
invoice_id TEXT REFERENCES invoices,
provider TEXT NOT NULL,
provider_ref TEXT,
amount INTEGER,
currency TEXT,
status TEXT NOT NULL,
exception TEXT,
subscription_renews_at TEXT,
grace_until TEXT,
cancelled INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
,
evidence BLOB,
receipt_code TEXT
) STRICT;
CREATE TABLE subscription_charges(
charge_id TEXT NOT NULL PRIMARY KEY,
payment_id TEXT NOT NULL REFERENCES payments ON DELETE CASCADE,
provider_charge_ref TEXT NOT NULL,
period_start TEXT NOT NULL,
period_end TEXT NOT NULL,
amount INTEGER NOT NULL,
currency TEXT NOT NULL,
charged_at TEXT NOT NULL,
UNIQUE(payment_id, provider_charge_ref)
) STRICT;
CREATE TABLE badge_prices(
price_id TEXT NOT NULL PRIMARY KEY,
badge_type TEXT NOT NULL,
month_price INTEGER NOT NULL,
currency TEXT NOT NULL,
status TEXT NOT NULL,
created_at TEXT NOT NULL
) STRICT;
CREATE TABLE badge_offers(
offer_id TEXT NOT NULL PRIMARY KEY,
price_id TEXT REFERENCES badge_prices,
months INTEGER NOT NULL,
free_months INTEGER,
discount INTEGER,
status TEXT NOT NULL,
created_at TEXT NOT NULL
) STRICT;
CREATE TABLE badge_purchases(
badge_purchase_id INTEGER PRIMARY KEY AUTOINCREMENT,
purchase_key BLOB NOT NULL,
master_key BLOB NOT NULL,
initial_badge_type TEXT NOT NULL,
current_badge_type TEXT NOT NULL,
payment_id TEXT REFERENCES payments,
status TEXT NOT NULL,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
user_id INTEGER REFERENCES users ON DELETE CASCADE,
purchase_priv_key BLOB,
alert_acked_kind TEXT,
alert_acked_episode TEXT,
alert_snooze_until TEXT,
badge_code_redemption_id INTEGER REFERENCES badge_code_redemptions,
UNIQUE(purchase_key),
UNIQUE(payment_id)
) STRICT;
CREATE TABLE badge_invoices(
invoice_id TEXT NOT NULL PRIMARY KEY REFERENCES invoices ON DELETE CASCADE,
badge_purchase_id INTEGER NOT NULL REFERENCES badge_purchases ON DELETE CASCADE,
price_id TEXT NOT NULL REFERENCES badge_prices,
offer_id TEXT REFERENCES badge_offers,
months INTEGER NOT NULL,
created_at TEXT NOT NULL
) STRICT;
CREATE TABLE badge_subscription_changes(
change_id TEXT NOT NULL PRIMARY KEY,
badge_purchase_id INTEGER NOT NULL REFERENCES badge_purchases ON DELETE CASCADE,
from_badge_type TEXT NOT NULL,
to_badge_type TEXT NOT NULL,
from_provider_ref TEXT,
to_provider_ref TEXT,
effective TEXT NOT NULL,
status TEXT NOT NULL,
effective_at TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
) STRICT;
CREATE TABLE badge_ledger(
entry_id INTEGER PRIMARY KEY AUTOINCREMENT,
entry_uuid TEXT NOT NULL,
badge_purchase_id INTEGER NOT NULL REFERENCES badge_purchases ON DELETE CASCADE,
change_months INTEGER NOT NULL,
balance_months INTEGER NOT NULL,
balance_start_ts TEXT NOT NULL,
balance_badge_type TEXT NOT NULL,
was_paused_since TEXT,
service_created_at TEXT NOT NULL,
created_at TEXT NOT NULL,
entry_type TEXT NOT NULL,
entry_credit_type TEXT,
entry_debit_type TEXT,
payment_id TEXT REFERENCES payments,
charge_id TEXT REFERENCES subscription_charges,
from_purchase_id INTEGER REFERENCES badge_purchases,
to_purchase_id INTEGER REFERENCES badge_purchases
,
entry_type_unknown INTEGER NOT NULL DEFAULT 0,
entry_type_value TEXT
) STRICT;
CREATE TABLE badge_issuances(
issuance_id TEXT NOT NULL PRIMARY KEY,
badge_purchase_id INTEGER NOT NULL REFERENCES badge_purchases ON DELETE CASCADE,
entry_id INTEGER REFERENCES badge_ledger,
badge_type TEXT NOT NULL,
period_start TEXT NOT NULL,
period_end TEXT NOT NULL,
expiry TEXT NOT NULL,
credential BLOB NOT NULL,
created_at TEXT NOT NULL
) STRICT;
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)
) STRICT;
CREATE INDEX contact_profiles_index ON contact_profiles(
display_name,
full_name
@@ -1385,6 +1532,37 @@ CREATE INDEX idx_files_roster_transfer_id ON files(roster_transfer_id);
CREATE INDEX idx_chat_items_item_signed_by_group_member_id ON chat_items(
item_signed_by_group_member_id
);
CREATE INDEX idx_payments_provider_ref ON payments(provider, provider_ref);
CREATE INDEX idx_payments_invoice ON payments(invoice_id);
CREATE INDEX idx_badge_offers_price ON badge_offers(price_id);
CREATE INDEX idx_badge_invoices_purchase ON badge_invoices(badge_purchase_id);
CREATE INDEX idx_badge_invoices_offer ON badge_invoices(offer_id);
CREATE INDEX idx_badge_invoices_price ON badge_invoices(price_id);
CREATE INDEX idx_badge_subscription_changes_purchase ON badge_subscription_changes(
badge_purchase_id
);
CREATE UNIQUE INDEX idx_badge_ledger_uuid ON badge_ledger(entry_uuid);
CREATE INDEX idx_badge_ledger_purchase ON badge_ledger(
badge_purchase_id,
entry_id
);
CREATE INDEX idx_badge_ledger_payment ON badge_ledger(payment_id);
CREATE INDEX idx_badge_ledger_charge ON badge_ledger(charge_id);
CREATE INDEX idx_badge_ledger_from_purchase ON badge_ledger(from_purchase_id);
CREATE INDEX idx_badge_ledger_to_purchase ON badge_ledger(to_purchase_id);
CREATE INDEX idx_badge_issuances_purchase ON badge_issuances(
badge_purchase_id,
issuance_id
);
CREATE INDEX idx_badge_issuances_entry ON badge_issuances(entry_id);
CREATE INDEX idx_badge_purchases_user ON badge_purchases(user_id);
CREATE INDEX idx_users_shown_badge ON users(shown_badge_id);
CREATE INDEX idx_badge_code_redemptions_user ON badge_code_redemptions(
user_id
);
CREATE UNIQUE INDEX idx_badge_purchases_code_redemption ON badge_purchases(
badge_code_redemption_id
);
CREATE TRIGGER on_group_members_insert_update_summary
AFTER INSERT ON group_members
FOR EACH ROW