prosody-password/internal/api/server.go

91 lines
2.1 KiB
Go
Raw Normal View History

2023-07-05 22:07:10 +02:00
package api
import (
"log"
2023-07-09 21:58:26 +02:00
"time"
2023-07-05 22:07:10 +02:00
"gitea.urkob.com/urko/prosody-password/internal/api/handler"
2023-07-07 23:31:32 +02:00
"gitea.urkob.com/urko/prosody-password/internal/services/fail2ban"
2023-07-05 22:07:10 +02:00
"gitea.urkob.com/urko/prosody-password/internal/services/prosody"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
2023-07-09 21:58:26 +02:00
"github.com/gofiber/fiber/v2/middleware/limiter"
2023-07-05 22:07:10 +02:00
"github.com/gofiber/template/handlebars/v2"
)
type RestServer struct {
app *fiber.App
prosodyService *prosody.Prosody
2023-07-07 23:31:32 +02:00
fail2banSrv *fail2ban.Fail2Ban
2023-07-05 22:07:10 +02:00
}
func NewRestServer(
prosodyService *prosody.Prosody,
2023-07-07 23:31:32 +02:00
fail2banSrv *fail2ban.Fail2Ban,
2023-07-05 22:07:10 +02:00
) *RestServer {
return &RestServer{
prosodyService: prosodyService,
2023-07-07 23:31:32 +02:00
fail2banSrv: fail2banSrv,
2023-07-05 22:07:10 +02:00
}
}
func (s *RestServer) Start(apiPort, views string) error {
engine := handlebars.New(views, ".hbs")
s.app = fiber.New(fiber.Config{
2024-02-22 18:51:24 +01:00
Views: engine,
ProxyHeader: "X-Forwarded-For",
EnableIPValidation: true,
2023-07-05 22:07:10 +02:00
})
2023-07-09 21:58:26 +02:00
s.app.Use(limiter.New(limiter.Config{
2023-07-23 11:13:32 +02:00
Max: 8,
Expiration: 30 * time.Minute,
2023-07-09 21:58:26 +02:00
LimiterMiddleware: limiter.SlidingWindow{},
}))
2023-07-05 22:07:10 +02:00
s.app.Use(cors.New(cors.Config{
AllowMethods: "POST,OPTIONS",
AllowOrigins: "*",
AllowHeaders: "Origin, Accept, Content-Type, X-CSRF-Token, Authorization",
ExposeHeaders: "Origin",
}))
s.loadViews()
2023-07-07 23:31:32 +02:00
prosodyHdl := handler.NewProsodyHandler(s.prosodyService, s.fail2banSrv)
2023-07-20 11:31:10 +02:00
s.app.Post("/changePassword", prosodyHdl.Post)
2023-07-05 22:07:10 +02:00
if err := s.app.Listen(":" + apiPort); err != nil {
log.Fatalln("app.Listen:", err)
return err
}
return nil
}
func (s *RestServer) loadViews() {
s.app.Get("/", func(c *fiber.Ctx) error {
return c.Render("index", fiber.Map{})
})
s.app.Get("/error", func(c *fiber.Ctx) error {
message := c.Query("message")
return renderError(c, nil, message)
})
}
func renderError(c *fiber.Ctx, err error, message string) error {
if err != nil {
log.Printf("renderError: %s\n", err)
}
return c.Render("error", fiber.Map{
"message": message,
})
}
func (s *RestServer) Shutdown() error {
if err := s.app.Server().Shutdown(); err != nil {
log.Printf("app.Server().Shutdown(): %s\n", err)
return err
}
return nil
}