Add HTTP layer and server setup

- Add strict configuration management (no fallbacks)
- Create HTTP router with Chi and CORS middleware
- Implement health check endpoint
- Add main entry point with database initialization
- Server runs on configurable host and port
This commit is contained in:
2025-11-26 00:21:07 +01:00
parent 34ea1f718e
commit 76893bd114
5 changed files with 146 additions and 1 deletions
+66
View File
@@ -0,0 +1,66 @@
package config
import (
"fmt"
"os"
"github.com/joho/godotenv"
)
type Config struct {
DBType string
DBPath string
Port string
Host string
JWTSecret string
JWTExpiry string
RefreshTokenExpiry string
CORSOrigins string
DefaultTimezone string
}
func Load() (*Config, error) {
godotenv.Load()
cfg := &Config{
DBType: os.Getenv("DB_TYPE"),
DBPath: os.Getenv("DB_PATH"),
Port: os.Getenv("PORT"),
Host: os.Getenv("HOST"),
JWTSecret: os.Getenv("JWT_SECRET"),
JWTExpiry: os.Getenv("JWT_EXPIRY"),
RefreshTokenExpiry: os.Getenv("REFRESH_TOKEN_EXPIRY"),
CORSOrigins: os.Getenv("CORS_ORIGINS"),
DefaultTimezone: os.Getenv("DEFAULT_TIMEZONE"),
}
if cfg.DBType == "" {
return nil, fmt.Errorf("DB_TYPE is required")
}
if cfg.DBPath == "" {
return nil, fmt.Errorf("DB_PATH is required")
}
if cfg.Port == "" {
return nil, fmt.Errorf("PORT is required")
}
if cfg.Host == "" {
return nil, fmt.Errorf("HOST is required")
}
if cfg.JWTSecret == "" {
return nil, fmt.Errorf("JWT_SECRET is required")
}
if cfg.JWTExpiry == "" {
return nil, fmt.Errorf("JWT_EXPIRY is required")
}
if cfg.RefreshTokenExpiry == "" {
return nil, fmt.Errorf("REFRESH_TOKEN_EXPIRY is required")
}
if cfg.CORSOrigins == "" {
return nil, fmt.Errorf("CORS_ORIGINS is required")
}
if cfg.DefaultTimezone == "" {
return nil, fmt.Errorf("DEFAULT_TIMEZONE is required")
}
return cfg, nil
}
+29
View File
@@ -0,0 +1,29 @@
package http
import (
"net/http"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/go-chi/cors"
)
func NewRouter(corsOrigins string) *chi.Mux {
r := chi.NewRouter()
r.Use(middleware.Logger)
r.Use(middleware.Recoverer)
r.Use(cors.Handler(cors.Options{
AllowedOrigins: []string{corsOrigins},
AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
AllowedHeaders: []string{"Accept", "Authorization", "Content-Type"},
AllowCredentials: true,
}))
r.Get("/api/v1/health", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"status":"ok"}`))
})
return r
}