veza/veza-backend-api/internal/config/docs.go
2025-12-03 20:29:37 +01:00

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
}