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