Replace @vercel/postgres, Blob, and Upstash with lib/sql.js, MinIO object storage, and CT 102 Redis rate limits. Add Dockerfile for Dokploy deploy, homelab runbooks, Neon data-copy helper, and point CI smoke/visual at the homelab URL instead of Vercel previews. Co-authored-by: Cursor <cursoragent@cursor.com>
74 lines
2.6 KiB
JavaScript
Executable file
74 lines
2.6 KiB
JavaScript
Executable file
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Create Test Users Script
|
|
*
|
|
* Seeds the alice + bob test-user fixtures used by the manual QA flows
|
|
* in TESTING_GUIDE.md. Both users share a single password supplied via
|
|
* the TEST_USERS_PASSWORD environment variable — this is a test-fixture
|
|
* helper, not a prod auth surface, so per-user env vars would be
|
|
* unnecessary sprawl.
|
|
*
|
|
* Required env (in .env.local):
|
|
* POSTGRES_URL — Neon connection string
|
|
* TEST_USERS_PASSWORD — strong password applied to every test user
|
|
* (generate with `openssl rand -base64 24`)
|
|
*
|
|
* Mirrors the post-`drop-public-setup` shape of `setup-neon-db.js`
|
|
* (commit b63b509) and the post-`fix-reset-db-script` shape of
|
|
* `reset-db.js` (commit 3ab9bf8) — same ESM imports, same fail-loud
|
|
* env-var check, same no-password-echo convention. Convoy:
|
|
* `purge-weak-creds-from-helpers` (2026-05-26).
|
|
*/
|
|
|
|
import { config } from 'dotenv';
|
|
import { sql } from '../lib/sql.js';
|
|
import bcrypt from 'bcryptjs';
|
|
|
|
config({ path: '.env.local' });
|
|
|
|
async function createTestUsers() {
|
|
const testUsersPassword = process.env.TEST_USERS_PASSWORD;
|
|
if (!testUsersPassword || !testUsersPassword.trim()) {
|
|
console.error(
|
|
'❌ TEST_USERS_PASSWORD environment variable is not set.\n' +
|
|
'\n' +
|
|
' Set it in .env.local before running `node scripts/create-test-users.js`.\n' +
|
|
' Generate a strong password with: openssl rand -base64 24\n' +
|
|
' See README.md → "First-time admin setup" for the env-var pattern.\n'
|
|
);
|
|
process.exit(1);
|
|
}
|
|
|
|
try {
|
|
console.log('👥 Creating test users...\n');
|
|
|
|
const hashedPassword = await bcrypt.hash(testUsersPassword, 12);
|
|
|
|
await sql`
|
|
INSERT INTO users (email, password, role)
|
|
VALUES ('alice@deckhearth.com', ${hashedPassword}, 'user')
|
|
ON CONFLICT (email) DO NOTHING
|
|
`;
|
|
console.log('✅ Created Alice (alice@deckhearth.com)');
|
|
|
|
await sql`
|
|
INSERT INTO users (email, password, role)
|
|
VALUES ('bob@deckhearth.com', ${hashedPassword}, 'user')
|
|
ON CONFLICT (email) DO NOTHING
|
|
`;
|
|
console.log('✅ Created Bob (bob@deckhearth.com)');
|
|
|
|
console.log('\n🎉 Test users created successfully!');
|
|
console.log('\n👥 Available Test Accounts (passwords from TEST_USERS_PASSWORD):');
|
|
console.log(' 1. admin@deckhearth.com (Admin — seeded by setup-neon-db.js)');
|
|
console.log(' 2. alice@deckhearth.com (User)');
|
|
console.log(' 3. bob@deckhearth.com (User)');
|
|
|
|
} catch (error) {
|
|
console.error('❌ Failed to create test users:', error.message);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
createTestUsers();
|