@buildappolis/env-manager
Version:
Enterprise-grade environment variable management system with encryption, snapshots, and validation
93 lines (79 loc) • 3.12 kB
text/typescript
import type { APIRoute } from 'astro';
import { getDatabase } from '../../../lib/session.js';
import path from 'path';
export const POST: APIRoute = async ({ request }) => {
try {
const database = getDatabase();
if (!database.isAuthenticated()) {
return new Response(JSON.stringify({ error: 'Not authenticated' }), {
status: 401,
headers: { 'Content-Type': 'application/json' }
});
}
const { variableName } = await request.json();
if (!variableName) {
return new Response(JSON.stringify({ error: 'Variable name required' }), {
status: 400,
headers: { 'Content-Type': 'application/json' }
});
}
// Load project config from root directory
const projectRoot = process.env.PROJECT_ROOT || path.resolve(process.cwd(), '..');
const configPath = path.join(projectRoot, 'env.config.ts');
try {
// Import the actual config file
const configModule = await import(/* @vite-ignore */ configPath);
const projectConfig = configModule.default;
// Find the variable configuration
let variableConfig: any = null;
let groupName: string | null = null;
for (const [groupKey, group] of Object.entries(projectConfig.requirements)) {
const groupData = group as any;
const variable = groupData.variables.find((v: any) => v.name === variableName);
if (variable) {
variableConfig = variable;
groupName = groupKey;
break;
}
}
if (!variableConfig) {
return new Response(JSON.stringify({
error: 'Variable not found in project configuration'
}), {
status: 404,
headers: { 'Content-Type': 'application/json' }
});
}
// Return the variable configuration for the frontend
const config = {
name: variableConfig.name,
description: variableConfig.description,
category: groupName,
sensitive: variableConfig.sensitive || false,
minLength: variableConfig.minLength,
defaultValue: variableConfig.default,
generate: variableConfig.generate,
validation: variableConfig.validation ? variableConfig.validation.source : null
};
return new Response(JSON.stringify(config), {
status: 200,
headers: { 'Content-Type': 'application/json' }
});
} catch (configError) {
console.error('Config loading error:', configError);
return new Response(JSON.stringify({
error: 'Failed to load project configuration',
message: `Error loading env.config.ts: ${configError instanceof Error ? configError.message : String(configError)}`
}), {
status: 500,
headers: { 'Content-Type': 'application/json' }
});
}
} catch (error) {
console.error('Get variable config error:', error);
return new Response(JSON.stringify({ error: 'Failed to get variable configuration' }), {
status: 500,
headers: { 'Content-Type': 'application/json' }
});
}
};