81 lines
2.0 KiB
Go
81 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
_ "embed"
|
|
"history-api/docs"
|
|
"history-api/internal/controllers"
|
|
"history-api/internal/gen/sqlc"
|
|
"history-api/internal/repositories"
|
|
"history-api/internal/routes"
|
|
"history-api/internal/services"
|
|
"history-api/pkg/cache"
|
|
"os"
|
|
|
|
swagger "github.com/gofiber/contrib/v3/swaggerui"
|
|
middleware "github.com/gofiber/contrib/v3/zerolog"
|
|
"github.com/gofiber/fiber/v3"
|
|
"github.com/gofiber/fiber/v3/middleware/cors"
|
|
"github.com/rs/zerolog"
|
|
)
|
|
|
|
var (
|
|
Singleton *FiberServer
|
|
)
|
|
|
|
type FiberServer struct {
|
|
App *fiber.App
|
|
}
|
|
|
|
func NewHttpServer() *FiberServer {
|
|
server := &FiberServer{
|
|
App: fiber.New(fiber.Config{
|
|
ServerHeader: "http-server",
|
|
AppName: "http-server",
|
|
}),
|
|
}
|
|
cfg := swagger.Config{
|
|
BasePath: "/",
|
|
FileContent: docs.SwaggerJSON,
|
|
Path: "swagger",
|
|
Title: "Swagger API Docs",
|
|
}
|
|
|
|
server.App.Use(swagger.New(cfg))
|
|
|
|
logger := zerolog.New(os.Stderr).With().Timestamp().Logger()
|
|
server.App.Use(middleware.New(middleware.Config{
|
|
Logger: &logger,
|
|
}))
|
|
return server
|
|
}
|
|
|
|
func (s *FiberServer) SetupServer(sqlPg sqlc.DBTX, sqlTile *sql.DB, redis cache.Cache) {
|
|
// Apply CORS middleware
|
|
s.App.Use(cors.New(cors.Config{
|
|
AllowOrigins: []string{"*"},
|
|
AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"},
|
|
AllowHeaders: []string{"Accept", "Authorization", "Content-Type", "Origin"},
|
|
AllowCredentials: false,
|
|
MaxAge: 300,
|
|
}))
|
|
|
|
// repo setup
|
|
userRepo := repositories.NewUserRepository(sqlPg, redis)
|
|
roleRepo := repositories.NewRoleRepository(sqlPg, redis)
|
|
tileRepo := repositories.NewTileRepository(sqlTile, redis)
|
|
|
|
// service setup
|
|
authService := services.NewAuthService(userRepo, roleRepo)
|
|
tileService := services.NewTileService(tileRepo)
|
|
|
|
// controller setup
|
|
authController := controllers.NewAuthController(authService)
|
|
tileController := controllers.NewTileController(tileService)
|
|
|
|
// route setup
|
|
routes.AuthRoutes(s.App, authController)
|
|
routes.TileRoutes(s.App, tileController)
|
|
routes.NotFoundRoute(s.App)
|
|
}
|