Implement CLI commands and admin API endpoints

- Add bootstrap command with direct DB access for initial setup
- Implement auth login/logout/status CLI commands
- Implement user create/confirm-email CLI commands
- Implement org create/list/add-site CLI commands
- Add admin.orgs.* and admin.users.* API endpoints
- Add password hashing utility with scrypt
- Add token hashing and authentication utility
- Add superuser runtime checks for admin endpoints
- Wrap multi-step operations in transactions
- Fix config file permissions (0o600) for security
- Remove token display from status command
- Add return statements to void handlers
- Add reviq CLI command to devenv

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
RevIQ
2026-01-09 15:30:10 +08:00
parent 30ee35b25c
commit 410b937f9f
20 changed files with 1267 additions and 85 deletions

View File

@@ -1,9 +1,25 @@
import type { LocalContext } from "../../context.js";
import { buildCommand } from "@stricli/core";
import { getConfigPath, readConfig } from "../../utils/config.js";
function status(this: LocalContext): void {
console.log("Auth status command - Not implemented");
console.log("This command will show current authentication status");
async function status(this: LocalContext): Promise<void> {
const config = await readConfig();
if (!config) {
console.log("Not logged in");
console.log(`\nConfig file: ${getConfigPath()} (not found)`);
console.log(
"\nRun 'reviq bootstrap' to create a superuser or 'reviq auth login' to authenticate.",
);
return;
}
console.log("Authentication Status");
console.log("=====================\n");
console.log(`Email: ${config.email}`);
console.log(`API URL: ${config.apiUrl}`);
console.log(`Config file: ${getConfigPath()}`);
console.log("Token: [configured]");
}
export const statusCommand = buildCommand({
@@ -11,5 +27,7 @@ export const statusCommand = buildCommand({
parameters: {},
docs: {
brief: "Check authentication status",
fullDescription:
"Shows the current authentication status and config file location.",
},
});