158 lines
3.8 KiB
Go
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()
|
|
}
|