init
This commit is contained in:
157
internal/server/server.go
Normal file
157
internal/server/server.go
Normal file
@@ -0,0 +1,157 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user