Files
go-tracker/internal/server/server.go
2025-11-12 09:41:52 +03:00

158 lines
3.8 KiB
Go

package server
import (
"context"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/jackc/pgx/v5/pgxpool"
"io/fs"
"log/slog"
"madsky.ru/go-tracker/internal/config"
"madsky.ru/go-tracker/internal/storage"
web "madsky.ru/go-tracker/web"
"net/http"
"os"
"strings"
"time"
)
type Application struct {
Config *config.Config
Storage *storage.Storage
Ctx context.Context
}
func NewServer(ctx context.Context, client *pgxpool.Pool, logger *slog.Logger) {
//statusRepository := status.NewRepository(client)
//projectsRepository := project.NewRepository(client)
//issueRepository := issue.NewRepository(client)
//userRepository := user.NewRepository(client)
//r.Get("/bla/assets/*", func(w http.ResponseWriter, r *http.Request) {
// dist, err := fs.Sub(web.DistDir, "dist")
// if err != nil {
// http.Error(w, err.Error(), http.StatusInternalServerError)
// }
// http.FileServer(http.FS(dist)).ServeHTTP(w, r)
//})
//handlers.RegisterAuthRoutes(mux, ctx, userRepository)
//
//authMux := http.NewServeMux()
//handlers.RegisterProjectRoutes(authMux, ctx, projectsRepository)
//handlers.RegisterStatusRoutes(authMux, ctx, statusRepository)
//handlers.RegisterIssueRoutes(authMux, ctx, issueRepository)
//handlers.RegisterUserRoutes(authMux, ctx, userRepository)
//
//mux.Handle("/api/", http.StripPrefix("/api", md.AuthMiddleware(authMux)))
//
//handler := md.LoggingMiddleware(mux, logger)
}
func (app *Application) Routes() http.Handler {
r := chi.NewRouter()
r.Use(middleware.RequestID)
r.Use(middleware.RealIP)
r.Use(middleware.Logger)
r.Use(middleware.Recoverer)
r.Route("/api", func(r chi.Router) {
r.Route("/version", func(r chi.Router) {
r.Get("/", app.getVersion)
})
r.Route("/auth", func(r chi.Router) {
r.Post("/login", app.login)
r.Post("/register", app.register)
r.Post("/logout", app.logout)
})
r.Route("/projects", func(r chi.Router) {
r.Use(app.AuthMiddleware)
r.Use(app.LogRole)
r.Get("/", app.findProjects)
r.Post("/", app.createProject)
r.Route("/{id}", func(r chi.Router) {
r.Get("/", app.findProjectByID)
r.Patch("/", app.updateProject)
r.Delete("/", app.deleteProject)
})
})
r.Route("/statuses", func(r chi.Router) {
r.Use(app.AuthMiddleware)
r.Get("/", app.findStatuses)
})
r.Route("/issues", func(r chi.Router) {
r.Use(app.AuthMiddleware)
r.Get("/", app.findIssues)
r.Post("/", app.createIssues)
r.Post("/positions", app.updatePositions)
r.Route("/{id}", func(r chi.Router) {
r.Get("/", app.findIssuesByID)
r.Delete("/", app.deleteIssues)
})
})
r.Route("/preferences", func(r chi.Router) {
r.Use(app.AuthMiddleware)
r.Get("/", app.getSettings)
})
r.Route("/profile", func(r chi.Router) {
r.Use(app.AuthMiddleware)
r.Get("/", app.getProfile)
r.Patch("/", app.updateProfile)
r.Delete("/", app.deleteProfile)
})
r.Route("/users", func(r chi.Router) {
r.Use(app.AuthMiddleware)
r.Get("/", app.findUsers)
})
})
r.Get("/*", func(w http.ResponseWriter, r *http.Request) {
dist, err := fs.Sub(web.DistDir, "dist")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
file, err := dist.Open(strings.TrimPrefix(r.URL.Path, "/"))
if err != nil {
if os.IsNotExist(err) {
r.URL.Path = "/"
}
} else {
defer func(file fs.File) {
err := file.Close()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}(file)
}
http.FileServer(http.FS(dist)).ServeHTTP(w, r)
})
return r
}
func (app *Application) Start(mux http.Handler) error {
srv := &http.Server{
Addr: "0.0.0.0:3000",
Handler: mux,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
return srv.ListenAndServe()
}