kopia lustrzana https://github.com/reiver/greatape
123 wiersze
3.0 KiB
Go
123 wiersze
3.0 KiB
Go
package server
|
|
|
|
import (
|
|
"config"
|
|
. "contracts"
|
|
"server/authorize"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/gofiber/fiber/v2/middleware/cors"
|
|
"github.com/gofiber/fiber/v2/middleware/csrf"
|
|
"github.com/gofiber/fiber/v2/middleware/limiter"
|
|
"github.com/gofiber/fiber/v2/middleware/logger"
|
|
"github.com/gofiber/fiber/v2/middleware/recover"
|
|
"github.com/gofiber/helmet/v2"
|
|
"github.com/gofiber/template/html"
|
|
)
|
|
|
|
type httpServer struct {
|
|
framework *fiber.App
|
|
storage IStorage
|
|
logger ILogger
|
|
cache ICache
|
|
}
|
|
|
|
func New() IServer {
|
|
framework := fiber.
|
|
New(fiber.Config{
|
|
DisableStartupMessage: true,
|
|
Views: html.New("./views", ".html"),
|
|
BodyLimit: config.BodyLimit(),
|
|
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
|
|
code := fiber.StatusInternalServerError
|
|
if e, ok := err.(*fiber.Error); ok {
|
|
code = e.Code
|
|
}
|
|
|
|
ctx.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSONCharsetUTF8)
|
|
return ctx.Status(code).SendString(err.Error())
|
|
},
|
|
})
|
|
|
|
framework.
|
|
Use(
|
|
cors.New(),
|
|
recover.New(),
|
|
helmet.New(),
|
|
logger.New(logger.Config{
|
|
Next: nil,
|
|
Format: "[${time}] ${status} - ${latency} ${method} ${path} ${body}\n",
|
|
TimeFormat: "15:04:05",
|
|
TimeZone: "Local",
|
|
TimeInterval: 500 * time.Millisecond,
|
|
}),
|
|
)
|
|
|
|
if config.CsrfProtection() {
|
|
framework.Use(csrf.New())
|
|
}
|
|
|
|
if config.RateLimiter() {
|
|
framework.Use(
|
|
limiter.New(limiter.Config{
|
|
Max: 20,
|
|
Expiration: 30 * time.Second,
|
|
LimiterMiddleware: limiter.SlidingWindow{},
|
|
}),
|
|
)
|
|
}
|
|
|
|
framework.Static("/media", config.UPLOAD_PATH)
|
|
framework.Group("/api/v1/profile").Use(authorize.New())
|
|
// framework.Get("/u/:name/inbox").Use(authorize.New())
|
|
// framework.Post("/u/:name/outbox").Use(authorize.New())
|
|
|
|
return &httpServer{
|
|
framework: framework,
|
|
}
|
|
}
|
|
|
|
func (server *httpServer) SetStorage(storage IStorage) {
|
|
server.storage = storage
|
|
}
|
|
|
|
func (server *httpServer) SetLogger(logger ILogger) {
|
|
server.logger = logger
|
|
}
|
|
|
|
func (server *httpServer) SetCache(cache ICache) {
|
|
server.cache = cache
|
|
}
|
|
|
|
func (server *httpServer) Bind(routes ...IRoute) {
|
|
for _, route := range routes {
|
|
func(route IRoute) {
|
|
switch route.Method() {
|
|
case HttpGet:
|
|
server.framework.Get(route.Path(), func(underlyingContext *fiber.Ctx) error {
|
|
return route.Handler()(newContext(underlyingContext))
|
|
})
|
|
case HttpPost:
|
|
server.framework.Post(route.Path(), func(underlyingContext *fiber.Ctx) error {
|
|
return route.Handler()(newContext(underlyingContext))
|
|
})
|
|
case HttpPut:
|
|
server.framework.Put(route.Path(), func(underlyingContext *fiber.Ctx) error {
|
|
return route.Handler()(newContext(underlyingContext))
|
|
})
|
|
case HttpDelete:
|
|
server.framework.Delete(route.Path(), func(underlyingContext *fiber.Ctx) error {
|
|
return route.Handler()(newContext(underlyingContext))
|
|
})
|
|
default:
|
|
panic("unsupported_method")
|
|
}
|
|
}(route)
|
|
}
|
|
}
|
|
|
|
func (server *httpServer) Listen(address string) {
|
|
server.framework.Listen(address)
|
|
}
|