70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
|
package server
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"net/http"
|
||
|
"os"
|
||
|
"rpirelay/config"
|
||
|
"time"
|
||
|
|
||
|
"github.com/gin-contrib/cors"
|
||
|
"github.com/gin-gonic/gin"
|
||
|
)
|
||
|
|
||
|
type Server struct {
|
||
|
*gin.Engine
|
||
|
cfg *config.Config
|
||
|
}
|
||
|
|
||
|
func New(cfg *config.Config) *Server {
|
||
|
e := gin.New()
|
||
|
|
||
|
e.Use(gin.Logger())
|
||
|
e.Use(gin.Recovery())
|
||
|
|
||
|
corsCfg := cors.DefaultConfig()
|
||
|
corsCfg.AllowOriginFunc = func(origin string) bool { return origin != "" }
|
||
|
corsCfg.AllowCredentials = true
|
||
|
corsCfg.AddAllowHeaders("Authorization")
|
||
|
|
||
|
e.Use(cors.New(corsCfg))
|
||
|
|
||
|
if os.Getenv("RELEASE") != "1" {
|
||
|
e.Use(SwaggerServe("/api-docs", nil))
|
||
|
e.GET("/api-docs.json", SwaggerSpecServe())
|
||
|
}
|
||
|
|
||
|
// set healthcheck path
|
||
|
e.GET("/", func(c *gin.Context) {
|
||
|
c.String(http.StatusOK, "ok")
|
||
|
})
|
||
|
|
||
|
return &Server{
|
||
|
Engine: e,
|
||
|
cfg: cfg,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (w *Server) Start(ctx context.Context) {
|
||
|
s := &http.Server{
|
||
|
Handler: w,
|
||
|
Addr: fmt.Sprintf(":%d", w.cfg.Server.Port),
|
||
|
}
|
||
|
|
||
|
go func() {
|
||
|
if err := s.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
||
|
s.ErrorLog.Fatal(err)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
<-ctx.Done()
|
||
|
|
||
|
c, cancel := context.WithTimeout(context.Background(), time.Second*5)
|
||
|
defer cancel()
|
||
|
|
||
|
if err := s.Shutdown(c); err != nil {
|
||
|
s.ErrorLog.Fatal(err)
|
||
|
}
|
||
|
}
|