Files
xinmi/scripts/retire_migration_fixture_accounts.cjs
T
yawan f7fc992f57
Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
WeKnora deployment source with the reviewed wiki identity, summary and recovery fixes
2026-09-22 16:19:06 +08:00

24 lines
2.0 KiB
JavaScript

const fs = require('node:fs')
const path = require('node:path')
const assert = require('node:assert/strict')
const { execFileSync } = require('node:child_process')
const root = path.resolve(__dirname, '../..')
const release = process.argv[2]
assert.match(release || '', /^public-\d{8}-\d{6}$/)
const directory = path.join(root, 'releases', release)
assert.ok(fs.statSync(path.join(directory, 'yawan_native_acceptance_20260915.dump')).size > 0, 'Backup required')
const sql = statement => execFileSync('docker', ['--context', 'colima-yawan', 'exec', '-i', 'WeKnora-postgres', 'psql', '-X', '-q', '-U', 'postgres', '-d', 'yawan_native_acceptance_20260915', '-At', '-v', 'ON_ERROR_STOP=1'], { input: statement, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim()
const predicate = "tenant_id BETWEEN 10000 AND 10058 AND NOT is_system_admin AND deleted_at IS NULL AND email ~ '^(acceptance-.+|etl-[0-9]+|milvus-[0-9]+)@example[.]test$'"
const accounts = JSON.parse(sql(`SELECT coalesce(json_agg(json_build_object('id',id,'tenant_id',tenant_id,'email',email,'is_active',is_active)), '[]'::json) FROM users WHERE ${predicate};`))
assert.equal(accounts.length, 59, 'Only the known disposable migration fixtures may be retired')
const beforePath = path.join(directory, 'retired-fixture-accounts.json')
assert.ok(!fs.existsSync(beforePath), 'Do not overwrite previous account state')
fs.writeFileSync(beforePath, JSON.stringify({ recorded_at: new Date().toISOString(), accounts }, null, 2), { mode: 0o600, flag: 'wx' })
sql(`BEGIN;
UPDATE auth_tokens SET is_revoked=true WHERE user_id IN (SELECT id FROM users WHERE ${predicate});
UPDATE tenant_api_keys SET revoked_at=now(),updated_at=now() WHERE tenant_id IN (SELECT tenant_id FROM users WHERE ${predicate}) AND revoked_at IS NULL;
UPDATE users SET is_active=false,updated_at=now() WHERE ${predicate};
COMMIT;`)
assert.equal(sql(`SELECT count(*) FROM users WHERE ${predicate} AND is_active;`), '0')
console.log(JSON.stringify({ retired_fixture_accounts: accounts.length, business_tenant_unchanged: 10059 }))