niledatabase
Version:
Command line interface for Nile databases
163 lines (156 loc) • 6.96 kB
text/typescript
import axios from 'axios';
import { theme } from './colors';
import { GlobalOptions } from './globalOptions';
import { ConfigManager } from './config';
import { Auth } from './auth';
import { NileAPI } from './api';
/**
* Forces a re-login when authentication fails
*/
export async function forceRelogin(configManager: ConfigManager): Promise<void> {
configManager.removeToken(); // Clear the invalid token
console.log(theme.warning('\nAuthentication failed. Forcing re-login...'));
const token = await Auth.getAuthorizationToken(configManager);
if (token) {
if (configManager.getDebug()) {
console.log('Debug - Token received from auth flow');
}
configManager.setToken(token);
if (configManager.getDebug()) {
console.log('Debug - Token saved to config manager');
const savedToken = configManager.getToken();
console.log('Debug - Token retrieved from config manager:', savedToken ? 'present' : 'missing');
}
console.log(theme.success('Successfully re-authenticated!'));
// Verify workspace access after re-authentication
const workspaceSlug = configManager.getWorkspace();
if (workspaceSlug) {
try {
const api = new NileAPI({
token,
controlPlaneUrl: configManager.getGlobalHost(),
debug: configManager.getDebug()
});
await api.getWorkspace(workspaceSlug);
} catch (error) {
if (axios.isAxiosError(error) && error.response?.status === 403) {
console.error(theme.error(`\nWorkspace '${workspaceSlug}' is not accessible with the new token.`));
console.error(theme.warning('Please use a different workspace or contact your administrator.'));
process.exit(1);
}
throw error;
}
}
} else {
console.error(theme.error('Failed to re-authenticate'));
process.exit(1);
}
}
/**
* Handles API errors consistently across all commands
* @param error The error object
* @param operation Description of the operation that failed
* @param configManager The ConfigManager instance to use
*/
export async function handleApiError(error: any, operation: string, configManager: ConfigManager): Promise<never> {
if (axios.isAxiosError(error)) {
if (error.response?.status === 401 || error.message === 'Token is required') {
await forceRelogin(configManager);
// Retry the operation after re-login
const token = configManager.getToken();
if (!token) {
throw new Error('Failed to get token after re-login');
}
throw error;
} else if (error.response?.data?.errors) {
console.error(theme.error(`Failed to ${operation}:`), new Error(error.response.data.errors.join(', ')));
} else if (configManager.getDebug()) {
console.error(theme.error(`Failed to ${operation}:`), error);
} else {
console.error(theme.error(`Failed to ${operation}:`), error.message || 'Unknown error');
}
} else if (configManager.getDebug()) {
console.error(theme.error(`Failed to ${operation}:`), error);
} else {
console.error(theme.error(`Failed to ${operation}:`), error instanceof Error ? error.message : 'Unknown error');
}
process.exit(1);
}
/**
* Handles database-specific errors
* @param error The error object
* @param operation Description of the operation that failed
* @param configManager The ConfigManager instance to use
*/
export async function handleDatabaseError(error: any, operation: string, configManager: ConfigManager): Promise<never> {
if (axios.isAxiosError(error)) {
if (error.response?.status === 401 || error.message === 'Token is required') {
await forceRelogin(configManager);
// Retry the operation after re-login
throw error;
} else if (error.response?.data?.errors) {
console.error(theme.error(`Database operation failed: ${operation}`), new Error(error.response.data.errors.join(', ')));
} else if (configManager.getDebug()) {
console.error(theme.error(`Database operation failed: ${operation}`), error);
} else {
console.error(theme.error(`Database operation failed: ${operation}`), error.message || 'Unknown error');
}
} else if (configManager.getDebug()) {
console.error(theme.error(`Database operation failed: ${operation}`), error);
} else {
console.error(theme.error(`Database operation failed: ${operation}`), error instanceof Error ? error.message : 'Unknown error');
}
process.exit(1);
}
/**
* Handles tenant-specific errors
* @param error The error object
* @param operation Description of the operation that failed
* @param configManager The ConfigManager instance to use
*/
export async function handleTenantError(error: any, operation: string, configManager: ConfigManager): Promise<never> {
if (axios.isAxiosError(error)) {
if (error.response?.status === 401 || error.message === 'Token is required') {
await forceRelogin(configManager);
// Retry the operation after re-login
throw error;
} else if (error.response?.data?.errors) {
console.error(theme.error(`Tenant operation failed: ${operation}`), new Error(error.response.data.errors.join(', ')));
} else if (configManager.getDebug()) {
console.error(theme.error(`Tenant operation failed: ${operation}`), error);
} else {
console.error(theme.error(`Tenant operation failed: ${operation}`), error.message || 'Unknown error');
}
} else if (configManager.getDebug()) {
console.error(theme.error(`Tenant operation failed: ${operation}`), error);
} else {
console.error(theme.error(`Tenant operation failed: ${operation}`), error instanceof Error ? error.message : 'Unknown error');
}
process.exit(1);
}
/**
* Handles user-specific errors
* @param error The error object
* @param operation Description of the operation that failed
* @param configManager The ConfigManager instance to use
*/
export async function handleUserError(error: any, operation: string, configManager: ConfigManager): Promise<never> {
if (axios.isAxiosError(error)) {
if (error.response?.status === 401 || error.message === 'Token is required') {
await forceRelogin(configManager);
// Retry the operation after re-login
throw error;
} else if (error.response?.data?.errors) {
console.error(theme.error(`User operation failed: ${operation}`), new Error(error.response.data.errors.join(', ')));
} else if (configManager.getDebug()) {
console.error(theme.error(`User operation failed: ${operation}`), error);
} else {
console.error(theme.error(`User operation failed: ${operation}`), error.message || 'Unknown error');
}
} else if (configManager.getDebug()) {
console.error(theme.error(`User operation failed: ${operation}`), error);
} else {
console.error(theme.error(`User operation failed: ${operation}`), error instanceof Error ? error.message : 'Unknown error');
}
process.exit(1);
}