mirror of
https://github.com/complexcaresolutions/cms.c2sgmbh.git
synced 2026-03-17 20:54:11 +00:00
Localization: - Add middleware for locale detection/routing - Add [locale] dynamic route structure - Add i18n utility library (DE/EN support) SEO & Discovery: - Add robots.ts for search engine directives - Add sitemap.ts for XML sitemap generation - Add structuredData.ts for JSON-LD schemas Utilities: - Add search.ts for full-text search functionality - Add tenantAccess.ts for multi-tenant access control - Add envValidation.ts for environment validation Frontend: - Update layout.tsx with locale support - Update page.tsx for localized content - Add API routes for frontend functionality - Add instrumentation.ts for monitoring 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
73 lines
1.9 KiB
TypeScript
73 lines
1.9 KiB
TypeScript
// src/lib/envValidation.ts
|
|
|
|
/**
|
|
* Zentrale Validierung aller erforderlichen Environment-Variablen.
|
|
* Wird beim Server-Start aufgerufen und beendet den Prozess bei fehlenden Werten.
|
|
*/
|
|
|
|
interface RequiredEnvVars {
|
|
PAYLOAD_SECRET: string
|
|
DATABASE_URI: string
|
|
CONSENT_LOGGING_API_KEY: string
|
|
IP_ANONYMIZATION_PEPPER: string
|
|
}
|
|
|
|
const FORBIDDEN_VALUES = [
|
|
'',
|
|
'default-pepper-change-me',
|
|
'change-me',
|
|
'your-secret-here',
|
|
'xxx',
|
|
]
|
|
|
|
function validateEnvVar(name: string, value: string | undefined): string {
|
|
if (!value || value.trim() === '') {
|
|
throw new Error(
|
|
`FATAL: Environment variable ${name} is required but not set. ` +
|
|
`Server cannot start without this value.`,
|
|
)
|
|
}
|
|
|
|
if (FORBIDDEN_VALUES.includes(value.trim().toLowerCase())) {
|
|
throw new Error(
|
|
`FATAL: Environment variable ${name} has an insecure default value. ` +
|
|
`Please set a secure random value.`,
|
|
)
|
|
}
|
|
|
|
return value.trim()
|
|
}
|
|
|
|
/**
|
|
* Validiert alle erforderlichen Environment-Variablen.
|
|
* Wirft einen Fehler und beendet den Server-Start, wenn Variablen fehlen.
|
|
*/
|
|
export function validateRequiredEnvVars(): RequiredEnvVars {
|
|
return {
|
|
PAYLOAD_SECRET: validateEnvVar('PAYLOAD_SECRET', process.env.PAYLOAD_SECRET),
|
|
DATABASE_URI: validateEnvVar('DATABASE_URI', process.env.DATABASE_URI),
|
|
CONSENT_LOGGING_API_KEY: validateEnvVar(
|
|
'CONSENT_LOGGING_API_KEY',
|
|
process.env.CONSENT_LOGGING_API_KEY,
|
|
),
|
|
IP_ANONYMIZATION_PEPPER: validateEnvVar(
|
|
'IP_ANONYMIZATION_PEPPER',
|
|
process.env.IP_ANONYMIZATION_PEPPER,
|
|
),
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Lazy-initialized Environment-Variablen.
|
|
* Wird erst beim ersten Zugriff validiert (vermeidet Build-Probleme).
|
|
*/
|
|
let _cachedEnv: RequiredEnvVars | null = null
|
|
|
|
export const env: RequiredEnvVars = new Proxy({} as RequiredEnvVars, {
|
|
get(_, prop: keyof RequiredEnvVars) {
|
|
if (!_cachedEnv) {
|
|
_cachedEnv = validateRequiredEnvVars()
|
|
}
|
|
return _cachedEnv[prop]
|
|
},
|
|
})
|