ghostguild-org/scripts/README.md

74 lines
3 KiB
Markdown

# scripts/
One-off admin and migration scripts. None of these run in CI.
---
## helcim-plan-consolidation.js
Consolidates Helcim payment plans from the legacy per-tier model (multiple plans at $15/$30/$50) to two unified plans (Monthly Membership at $15, Annual Membership at $150), and backfills Mongo members.
### Required env
```
HELCIM_API_TOKEN=<token>
MONGODB_URI=<mongodb connection string>
```
Copy `.env.example``.env` if you haven't already.
### Usage
```bash
# Dry-run (default) — no mutations, writes backup file
node scripts/helcim-plan-consolidation.js
# Execute all steps: delete subs, delete legacy plans, create new plans, update Mongo
node scripts/helcim-plan-consolidation.js --confirm
# Mongo cleanup only — skips all Helcim steps (use if Helcim steps already ran)
node scripts/helcim-plan-consolidation.js --mongo-only
```
### What it does
1. **Backup** — always written to `.migration-backup-<timestamp>.json`, even in dry-run. Contains all Helcim subscriptions, payment plans, and Mongo members with `helcimSubscriptionId`.
2. **Delete subscriptions** — deletes all Helcim subscriptions (`--confirm` only).
3. **Delete legacy plans** — deletes plan IDs `20162`, `21596`, `21597`, `21598`, plus any plan whose name matches the legacy pattern (e.g. "Ghost Guild - Member ($15)").
4. **Create Monthly Membership** — $15/month. Idempotent: skipped if a plan named "Monthly Membership" already exists.
5. **Create Annual Membership** — $150/year. Same idempotency. Uses `billingPeriod: "yearly"` (Helcim v2 convention); if Helcim returns 4xx, the script aborts and prints the full error so you can correct the field name.
6. **Mongo cleanup**`updateMany` with `runValidators: false` on all members with `helcimSubscriptionId`: sets `contributionTier: '0'` and `billingCadence: 'monthly'`, unsets `helcimSubscriptionId`. Does **not** change `status`.
At the end, prints new plan IDs formatted for copy-paste into `.env`.
### Recovery
If something goes wrong mid-run, the backup JSON contains the pre-migration state. You can use the backup to:
- Identify which subscriptions existed before deletion.
- Identify which plan IDs to recreate manually in Helcim.
- Identify which members had `helcimSubscriptionId` before it was unset.
Backup files are gitignored (`.migration-backup-*.json`).
---
## migrate-contribution-amount.cjs
One-time migration: converts `Member.contributionTier` (String enum) to
`Member.contributionAmount` (Number). Idempotent — only touches documents that
still have the legacy field.
### Usage
```bash
node scripts/migrate-contribution-amount.cjs # dry-run
node scripts/migrate-contribution-amount.cjs --apply # write
```
### What it does
Iterates members with `contributionTier` still set, parses each value as an integer
(valid: `"0"`, `"5"`, `"15"`, `"30"`, `"50"`), and writes the converted value to
`contributionAmount`. Unsets the old field. Skips any record that cannot be parsed.
Safe to re-run: only matches members where `contributionTier` still exists.