Files
History_Api/cmd/api/server.go
AzenKain 2d36004ac7
All checks were successful
Build and Release / release (push) Successful in 1m7s
UPDATE: Media module
2026-04-05 22:25:43 +07:00

103 lines
3.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"
"history-api/pkg/storage"
"os"
"time"
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"
"golang.org/x/oauth2"
)
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(zerolog.ConsoleWriter{
Out: os.Stderr,
TimeFormat: time.RFC3339,
}).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, sclient storage.Storage, oauth *oauth2.Config) {
// Apply CORS middleware
s.App.Use(cors.New(cors.Config{
AllowOrigins: []string{
"http://localhost:3000",
"https://localhost:3000",
"http://localhost:3001",
"https://localhost:3001",
"http://localhost:3344",
},
AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"},
AllowHeaders: []string{"Accept", "Authorization", "Content-Type", "Origin"},
AllowCredentials: true,
}))
// repo setup
userRepo := repositories.NewUserRepository(sqlPg, redis)
roleRepo := repositories.NewRoleRepository(sqlPg, redis)
tileRepo := repositories.NewTileRepository(sqlTile, redis)
tokenRepo := repositories.NewTokenRepository(redis)
mediaRepo := repositories.NewMediaRepository(sqlPg, redis)
// service setup
authService := services.NewAuthService(userRepo, roleRepo, tokenRepo, redis)
userService := services.NewUserService(userRepo, roleRepo)
roleService := services.NewRoleService(roleRepo)
tileService := services.NewTileService(tileRepo)
mediaService := services.NewMediaService(mediaRepo, tokenRepo, sclient, redis)
// controller setup
authController := controllers.NewAuthController(authService, oauth)
userController := controllers.NewUserController(userService, mediaService)
tileController := controllers.NewTileController(tileService)
roleController := controllers.NewRoleController(roleService)
mediaController := controllers.NewMediaController(mediaService)
// route setup
routes.AuthRoutes(s.App, authController, userRepo)
routes.UserRoutes(s.App, userController, userRepo)
routes.MediaRoutes(s.App, mediaController, userRepo)
routes.RoleRoutes(s.App, roleController, userRepo)
routes.TileRoutes(s.App, tileController)
routes.NotFoundRoute(s.App)
}