package main import ( "context" "encoding/base64" "log" "net/http" "os" "time" appcrypto "netisjwt/internal/crypto" "netisjwt/internal/httpapi" "netisjwt/internal/storage" ) // main zazene HTTP API streznik in inicializira odvisnosti. func main() { cfg := naloziNastavitve() ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() store, err := storage.PoveziInMigriraj(ctx, cfg.databaseURL, cfg.aesKeyBase64) if err != nil { log.Fatalf("failed to connect store: %v", err) } defer store.Zapri() privatePEM, err := naloziAliUstvariZasebniKljucPEM(cfg.privateKeyPath) if err != nil { log.Fatalf("failed to load signing key: %v", err) } handler := httpapi.NewObravnalnik(store, privatePEM) router := httpapi.NewUsmerjevalnik(handler) log.Printf("server listening on %s", cfg.listenAddr) if err := http.ListenAndServe(cfg.listenAddr, router); err != nil { log.Fatalf("server stopped: %v", err) } } type config struct { listenAddr string databaseURL string aesKeyBase64 string privateKeyPath string } // naloziNastavitve prebere konfiguracijo iz okolja z default vrednostmi. func naloziNastavitve() config { return config{ listenAddr: preberiOkoljeAliPrivzeto("APP_ADDR", ":8001"), databaseURL: preberiOkoljeAliPrivzeto("DATABASE_URL", "postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable"), aesKeyBase64: preberiOkoljeAliPrivzeto("STATUS_AES_KEY_B64", base64.StdEncoding.EncodeToString([]byte("01234567890123456789012345678901"))), privateKeyPath: os.Getenv("SIGNING_KEY_PATH"), } } // naloziAliUstvariZasebniKljucPEM prebere kljuc iz datoteke ali ga ustvari. func naloziAliUstvariZasebniKljucPEM(path string) ([]byte, error) { if path == "" { // Če pot ni podana, ustvarimo ključ ob zagonu za enostaven lokalni test. return appcrypto.UstvariZasebniKljucECDSAP256PEM() } return os.ReadFile(path) } // preberiOkoljeAliPrivzeto vrne env vrednost ali podan fallback. func preberiOkoljeAliPrivzeto(name, fallback string) string { value := os.Getenv(name) if value == "" { return fallback } return value }