Files
xinmi/scripts/retire_migration_fixture_accounts.cjs
T

24 lines
2.0 KiB
JavaScript
Raw Normal View History

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 }))