187 lines
4.9 KiB
Go
187 lines
4.9 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
)
|
|
|
|
// EnvVarDoc représente la documentation d'une variable d'environnement (T0033)
|
|
type EnvVarDoc struct {
|
|
Name string
|
|
Type string
|
|
Required bool
|
|
Default string
|
|
Description string
|
|
Example string
|
|
}
|
|
|
|
// envVarsDocs contient la documentation de toutes les variables d'environnement (T0033)
|
|
var envVarsDocs = map[string]EnvVarDoc{
|
|
"APP_ENV": {
|
|
Name: "APP_ENV",
|
|
Type: "string",
|
|
Required: false,
|
|
Default: "development",
|
|
Description: "Environment mode (development, production, test)",
|
|
Example: "production",
|
|
},
|
|
"APP_PORT": {
|
|
Name: "APP_PORT",
|
|
Type: "int",
|
|
Required: false,
|
|
Default: "8080",
|
|
Description: "Port for HTTP server (1-65535)",
|
|
Example: "8080",
|
|
},
|
|
"JWT_SECRET": {
|
|
Name: "JWT_SECRET",
|
|
Type: "string",
|
|
Required: true,
|
|
Default: "",
|
|
Description: "Secret key for JWT token signing and validation (minimum 32 characters)",
|
|
Example: "your-super-secret-jwt-key-minimum-32-characters-long",
|
|
},
|
|
"DATABASE_URL": {
|
|
Name: "DATABASE_URL",
|
|
Type: "string",
|
|
Required: false,
|
|
Default: "postgresql://veza:password@localhost:5432/veza_db",
|
|
Description: "PostgreSQL database connection URL (must start with postgres://, postgresql://, or sqlite://)",
|
|
Example: "postgresql://user:password@localhost:5432/veza_db",
|
|
},
|
|
"DB_HOST": {
|
|
Name: "DB_HOST",
|
|
Type: "string",
|
|
Required: false,
|
|
Default: "localhost",
|
|
Description: "Database host address",
|
|
Example: "localhost",
|
|
},
|
|
"DB_PORT": {
|
|
Name: "DB_PORT",
|
|
Type: "int",
|
|
Required: false,
|
|
Default: "5432",
|
|
Description: "Database port number",
|
|
Example: "5432",
|
|
},
|
|
"DB_USER": {
|
|
Name: "DB_USER",
|
|
Type: "string",
|
|
Required: false,
|
|
Default: "veza",
|
|
Description: "Database username",
|
|
Example: "veza",
|
|
},
|
|
"DB_PASSWORD": {
|
|
Name: "DB_PASSWORD",
|
|
Type: "string",
|
|
Required: true,
|
|
Default: "",
|
|
Description: "Database password (required)",
|
|
Example: "your-secure-database-password",
|
|
},
|
|
"DB_NAME": {
|
|
Name: "DB_NAME",
|
|
Type: "string",
|
|
Required: false,
|
|
Default: "veza_db",
|
|
Description: "Database name",
|
|
Example: "veza_db",
|
|
},
|
|
"REDIS_URL": {
|
|
Name: "REDIS_URL",
|
|
Type: "string",
|
|
Required: false,
|
|
Default: "redis://localhost:6379",
|
|
Description: "Redis connection URL (must start with redis:// or rediss://)",
|
|
Example: "redis://localhost:6379",
|
|
},
|
|
"CORS_ALLOWED_ORIGINS": {
|
|
Name: "CORS_ALLOWED_ORIGINS",
|
|
Type: "string",
|
|
Required: false,
|
|
Default: "*",
|
|
Description: "Comma-separated list of allowed CORS origins (use * for all origins)",
|
|
Example: "http://localhost:3000,https://app.veza.com",
|
|
},
|
|
"RATE_LIMIT_LIMIT": {
|
|
Name: "RATE_LIMIT_LIMIT",
|
|
Type: "int",
|
|
Required: false,
|
|
Default: "100",
|
|
Description: "Maximum number of requests allowed per time window for rate limiting",
|
|
Example: "100",
|
|
},
|
|
"RATE_LIMIT_WINDOW": {
|
|
Name: "RATE_LIMIT_WINDOW",
|
|
Type: "int",
|
|
Required: false,
|
|
Default: "60",
|
|
Description: "Time window in seconds for rate limiting",
|
|
Example: "60",
|
|
},
|
|
"LOG_LEVEL": {
|
|
Name: "LOG_LEVEL",
|
|
Type: "string",
|
|
Required: false,
|
|
Default: "INFO",
|
|
Description: "Logging level (DEBUG, INFO, WARN, ERROR)",
|
|
Example: "INFO",
|
|
},
|
|
}
|
|
|
|
// GenerateConfigDocs génère la documentation markdown pour toutes les variables d'environnement (T0033)
|
|
func GenerateConfigDocs() string {
|
|
var keys []string
|
|
for k := range envVarsDocs {
|
|
keys = append(keys, k)
|
|
}
|
|
sort.Strings(keys)
|
|
|
|
md := "# Configuration Variables\n\n"
|
|
md += "This document lists all environment variables used by the Veza backend API.\n\n"
|
|
md += "## Overview\n\n"
|
|
md += "Variables can be set in:\n"
|
|
md += "- System environment variables (highest priority)\n"
|
|
md += "- `.env.{APP_ENV}` file (e.g., `.env.development`, `.env.production`)\n"
|
|
md += "- `.env` file (fallback)\n\n"
|
|
md += "---\n\n"
|
|
|
|
for _, key := range keys {
|
|
doc := envVarsDocs[key]
|
|
md += fmt.Sprintf("## %s\n\n", doc.Name)
|
|
|
|
md += fmt.Sprintf("**Type**: `%s`\n\n", doc.Type)
|
|
|
|
if doc.Required {
|
|
md += "**Required**: ✅ Yes\n\n"
|
|
} else {
|
|
md += "**Required**: ❌ No\n\n"
|
|
}
|
|
|
|
if doc.Default != "" {
|
|
md += fmt.Sprintf("**Default**: `%s`\n\n", doc.Default)
|
|
}
|
|
|
|
md += fmt.Sprintf("**Description**: %s\n\n", doc.Description)
|
|
|
|
if doc.Example != "" {
|
|
md += fmt.Sprintf("**Example**:\n```bash\nexport %s=%s\n```\n\n", doc.Name, doc.Example)
|
|
}
|
|
|
|
md += "---\n\n"
|
|
}
|
|
|
|
return md
|
|
}
|
|
|
|
// GetAllEnvVarDocs retourne la map complète de documentation (utile pour les tests et l'introspection)
|
|
func GetAllEnvVarDocs() map[string]EnvVarDoc {
|
|
// Retourner une copie pour éviter les modifications externes
|
|
result := make(map[string]EnvVarDoc)
|
|
for k, v := range envVarsDocs {
|
|
result[k] = v
|
|
}
|
|
return result
|
|
}
|