/
seypher
/
benchmark
Обзор
Документация
Войти
/
seypher
/
benchmark
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
spec-kit/cmd/server/main.go
79 строк
2 KB
dorshanskiy
first_commit
19 май 2026, 18:09
19 май 2026, 18:09
5d12ee6
Код
Авторство
О чём код?
package main import ( "context" "log/slog" "net/http" "os" "os/signal" "syscall" "time" "github.com/jackc/pgx/v5/pgxpool" "urlshortener/internal/handler" "urlshortener/internal/service" "urlshortener/internal/store" ) func main() { dsn := os.Getenv("DATABASE_URL") if dsn == "" { slog.Error("DATABASE_URL is required") os.Exit(1) } port := os.Getenv("PORT") if port == "" { port = "8080" } baseURL := os.Getenv("BASE_URL") if baseURL == "" { baseURL = "http://localhost:" + port } pool, err := pgxpool.New(context.Background(), dsn) if err != nil { slog.Error("failed to connect to database", "error", err) os.Exit(1) } defer pool.Close() if err := pool.Ping(context.Background()); err != nil { slog.Error("database ping failed", "error", err) os.Exit(1) } st := store.New(pool) svc := service.New(st) mux := http.NewServeMux() mux.Handle("POST /shorten", handler.NewShortenHandler(svc, baseURL)) mux.Handle("GET /{code}", handler.NewRedirectHandler(svc)) srv := &http.Server{ Addr: ":" + port, Handler: mux, ReadTimeout: 5 * time.Second, WriteTimeout: 10 * time.Second, IdleTimeout: 60 * time.Second, } quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) go func() { slog.Info("server starting", "addr", srv.Addr, "base_url", baseURL) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { slog.Error("server error", "error", err) os.Exit(1) } }() <-quit slog.Info("shutting down gracefully") ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { slog.Error("shutdown error", "error", err) } }