longcelot-sheet-db
Version:
Google Sheets-backed staging database adapter for Node.js with schema-first design
114 lines โข 4.41 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mockUsersCommand = mockUsersCommand;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const chalk_1 = __importDefault(require("chalk"));
const sheetAdapter_1 = require("../../adapter/sheetAdapter");
const actorConfig_1 = require("../../utils/actorConfig");
const cliFiles_1 = require("../../utils/cliFiles");
function makeEmail(userId, role) {
return `${role}.${userId}@example.local`;
}
async function mockUsersCommand(countArg) {
const count = Number(countArg) || 3;
console.log(chalk_1.default.blue.bold(`
๐งช Creating ${count} mock users (development)...
`));
require('dotenv').config();
const requiredEnvVars = [
'GOOGLE_CLIENT_ID',
'GOOGLE_CLIENT_SECRET',
'GOOGLE_REDIRECT_URI',
'ADMIN_SHEET_ID',
'SUPER_ADMIN_EMAIL',
];
for (const envVar of requiredEnvVars) {
if (!process.env[envVar]) {
console.error(chalk_1.default.red(`โ Missing environment variable: ${envVar}`));
process.exit(1);
}
}
const tokensPath = (0, cliFiles_1.resolveTokensPath)();
if (!fs_1.default.existsSync(tokensPath)) {
console.error(chalk_1.default.red('โ No OAuth tokens found. Run: lsdb sync'));
process.exit(1);
}
let tokens;
try {
tokens = JSON.parse(fs_1.default.readFileSync(tokensPath, 'utf-8'));
}
catch {
console.error(chalk_1.default.red('โ Failed to read tokens file.'));
process.exit(1);
}
let config;
try {
config = require((0, cliFiles_1.resolveConfigPath)()).default;
}
catch {
console.error(chalk_1.default.red('โ lsdb.config.ts not found. Run: lsdb init'));
process.exit(1);
}
const adminSheetId = process.env.ADMIN_SHEET_ID;
const adapter = (0, sheetAdapter_1.createSheetAdapter)({
adminSheetId,
credentials: {
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
redirectUri: process.env.GOOGLE_REDIRECT_URI,
},
tokens,
});
// Load and register all schemas
const schemasRoot = config.schemasDir
? path_1.default.resolve(process.cwd(), config.schemasDir)
: path_1.default.join(process.cwd(), 'schemas');
for (const actorEntry of config.actors) {
const actor = (0, actorConfig_1.resolveActorName)(actorEntry);
const actorDir = path_1.default.join(schemasRoot, actor);
if (!fs_1.default.existsSync(actorDir))
continue;
const files = fs_1.default.readdirSync(actorDir).filter((f) => f.endsWith('.ts'));
for (const file of files) {
try {
const schema = require(path_1.default.join(actorDir, file)).default;
adapter.registerSchema(schema);
}
catch {
// ignore failures to require optional schemas
}
}
}
// createUserSheet is an admin operation โ requires admin context
const adminAdapter = adapter.withContext({
userId: 'mock-cli',
actor: 'admin',
actorSheetId: adminSheetId,
});
let created = 0;
for (let i = 0; i < count; i++) {
const userId = `mock-${Date.now().toString(36)}-${i}`;
// Rotate roles among configured actors (skip admin)
const actors = config.actors
.map((a) => (0, actorConfig_1.resolveActorName)(a))
.filter((r) => r !== 'admin');
const role = actors[i % actors.length] || 'student';
const email = makeEmail(userId, role);
try {
const sheetId = await adminAdapter.createUserSheet(userId, role, email);
console.log(chalk_1.default.green(` โ Created ${role} user ${userId} โ sheet ${sheetId}`));
created++;
}
catch (err) {
console.error(chalk_1.default.red(` โ Failed to create user ${userId}: ${err}`));
}
}
console.log();
console.log(chalk_1.default.bold(`Done. ${created}/${count} mock users created.`));
}
exports.default = mockUsersCommand;
//# sourceMappingURL=mock-users.js.map