billing
This commit is contained in:
59
backend/migrations/003_mailbox_billing_events.sql
Normal file
59
backend/migrations/003_mailbox_billing_events.sql
Normal file
@@ -0,0 +1,59 @@
|
||||
-- ============================================================
|
||||
-- 003_mailbox_billing_events.sql
|
||||
-- Append-only event log for inbox billing.
|
||||
--
|
||||
-- Each row records that a mailbox was created or deleted at a
|
||||
-- specific point in time. The aggregation per month is computed
|
||||
-- on the fly from these events.
|
||||
-- ============================================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS mailbox_billing_events (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
occurred_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
domain TEXT NOT NULL,
|
||||
email TEXT NOT NULL,
|
||||
action TEXT NOT NULL CHECK (action IN ('created', 'deleted')),
|
||||
actor_email TEXT,
|
||||
notes TEXT
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_billing_events_domain_time
|
||||
ON mailbox_billing_events(domain, occurred_at);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_billing_events_email
|
||||
ON mailbox_billing_events(email);
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- Backfill: synthesize 'created' events for every mailbox that
|
||||
-- already exists when this migration runs, so we have correct
|
||||
-- historical data right from the first deploy.
|
||||
--
|
||||
-- We use the mailbox's created_at as the event timestamp.
|
||||
-- For mailboxes that are already soft-deleted, also synthesize
|
||||
-- the matching 'deleted' event using deleted_at.
|
||||
--
|
||||
-- The WHERE NOT EXISTS guards make this migration idempotent
|
||||
-- in case it is re-run.
|
||||
-- ------------------------------------------------------------
|
||||
|
||||
INSERT INTO mailbox_billing_events (occurred_at, domain, email, action, actor_email, notes)
|
||||
SELECT m.created_at, m.domain, m.email_address, 'created', NULL, 'backfill from migration 003'
|
||||
FROM mailboxes m
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM mailbox_billing_events b
|
||||
WHERE b.email = m.email_address
|
||||
AND b.action = 'created'
|
||||
AND b.occurred_at = m.created_at
|
||||
);
|
||||
|
||||
INSERT INTO mailbox_billing_events (occurred_at, domain, email, action, actor_email, notes)
|
||||
SELECT m.deleted_at, m.domain, m.email_address, 'deleted', NULL, 'backfill from migration 003'
|
||||
FROM mailboxes m
|
||||
WHERE m.status = 'deleted'
|
||||
AND m.deleted_at IS NOT NULL
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM mailbox_billing_events b
|
||||
WHERE b.email = m.email_address
|
||||
AND b.action = 'deleted'
|
||||
AND b.occurred_at = m.deleted_at
|
||||
);
|
||||
Reference in New Issue
Block a user