board/internal/server/server.go
2025-04-15 23:49:28 +03:00

84 lines
2.8 KiB
Go

package server
import (
"context"
"github.com/jackc/pgx/v5/pgxpool"
"log/slog"
"madsky.ru/go-finance/internal/repository/issue"
"madsky.ru/go-finance/internal/repository/project"
"madsky.ru/go-finance/internal/repository/status"
"madsky.ru/go-finance/internal/server/handlers"
"madsky.ru/go-finance/internal/server/middleware"
"madsky.ru/go-finance/web"
"net/http"
"time"
)
type Server struct {
http *http.Server
logger *slog.Logger
}
func RegisterProjectRoutes(mux *http.ServeMux, ctx context.Context, repository project.Repository) {
mux.HandleFunc("GET /api/projects", handlers.FindProjects(ctx, repository))
mux.HandleFunc("GET /api/projects/{id}", handlers.FindProjectByID(ctx, repository))
mux.HandleFunc("POST /api/projects", handlers.CreateProject(ctx, repository))
mux.HandleFunc("PUT /api/projects/{id}", handlers.UpdateProject(ctx, repository))
mux.HandleFunc("DELETE /api/projects/{id}", handlers.DeleteProject(ctx, repository))
}
func RegisterStatusRoutes(mux *http.ServeMux, ctx context.Context, repository status.Repository) {
mux.HandleFunc("GET /api/statuses/", handlers.FindStatuses(ctx, repository))
mux.HandleFunc("GET /api/statuses/{id}", handlers.FindStatusById(ctx, repository))
mux.HandleFunc("POST /api/statuses", handlers.CreateStatus(ctx, repository))
mux.HandleFunc("DELETE /api/statuses/{id}", handlers.DeleteStatus(ctx, repository))
}
func RegisterIssueRoutes(mux *http.ServeMux, ctx context.Context, repository issue.Repository) {
mux.HandleFunc("GET /api/issues/", handlers.FindIssues(ctx, repository))
mux.HandleFunc("GET /api/issues/{id}", handlers.FindIssuesByID(ctx, repository))
mux.HandleFunc("POST /api/issues", handlers.CreateIssues(ctx, repository))
mux.HandleFunc("POST /api/issues/positions", handlers.UpdatePositions(ctx, repository))
mux.HandleFunc("DELETE /api/issues/{id}", handlers.DeleteIssues(ctx, repository))
}
func NewServer(ctx context.Context, client *pgxpool.Pool, logger *slog.Logger) *Server {
const addr = "localhost:3000"
mux := http.NewServeMux()
mux.Handle("/", http.FileServer(http.FS(web.Dist)))
handler := middleware.LoggingMiddleware(mux, logger)
projectsRepository := project.NewRepository(client)
RegisterProjectRoutes(mux, ctx, projectsRepository)
statusRepository := status.NewRepository(client)
RegisterStatusRoutes(mux, ctx, statusRepository)
issueRepository := issue.NewRepository(client)
RegisterIssueRoutes(mux, ctx, issueRepository)
logger.Info("start server", slog.String("addr", addr))
return &Server{
logger: logger,
http: &http.Server{
Addr: addr,
Handler: handler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
},
}
}
func (s *Server) Start() error {
return s.http.ListenAndServe()
}
func (s *Server) Stop() error {
s.logger.Info("stopping http server")
return s.http.Close()
}