104 lines
3.5 KiB
Go
104 lines
3.5 KiB
Go
package main
|
|
|
|
// @title 58team blog backend
|
|
// @version 1.0
|
|
// @description 58team blog's backend
|
|
// @termsOfService http://swagger.io/terms/
|
|
// @contact.name API Support
|
|
// @contact.url http://www.swagger.io/support
|
|
// @contact.email support@swagger.io
|
|
// @license.name Apache 2.0
|
|
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
|
|
// @host localhost:8080
|
|
// @BasePath /api/v1
|
|
// @securityDefinitions.basic BasicAuth
|
|
|
|
import (
|
|
docs "58team_blog/docs"
|
|
"58team_blog/internal/application/services"
|
|
"58team_blog/internal/infrastructure"
|
|
"58team_blog/internal/infrastructure/db"
|
|
"58team_blog/internal/infrastructure/db/repo"
|
|
"58team_blog/internal/interfaces"
|
|
"58team_blog/internal/utils"
|
|
"log"
|
|
|
|
"github.com/gin-contrib/cors"
|
|
"github.com/gin-contrib/sessions"
|
|
"github.com/gin-contrib/sessions/cookie"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/gin-gonic/gin/binding"
|
|
"github.com/go-playground/validator/v10"
|
|
swaggerFiles "github.com/swaggo/files"
|
|
ginSwagger "github.com/swaggo/gin-swagger"
|
|
)
|
|
|
|
const secret = "58secret"
|
|
|
|
func main() {
|
|
router := gin.Default()
|
|
|
|
// Setup CORS
|
|
// IMPORTANT: Must be setup before all another middlewares.
|
|
//cors_config := cors.DefaultConfig()
|
|
//cors_config.AllowOrigins = []string{"http://localhost:8080", "http://localhost:5173"}
|
|
//cors_config.AllowAllOrigins = true
|
|
//cors_config.AllowHeaders = []string{"Origin", "Content-Type", "Accept", "Authorization", "X-Requested-With"}
|
|
//router.Use(cors.New(cors_config))
|
|
router.Use(cors.New(cors.Config{
|
|
AllowOrigins: []string{"http://localhost:5173"},
|
|
AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"},
|
|
AllowHeaders: []string{"*"}, // Пробуем разрешить все заголовки
|
|
ExposeHeaders: []string{},
|
|
AllowCredentials: true,
|
|
MaxAge: 12 * 60 * 60,
|
|
}))
|
|
|
|
// Setup cookie container
|
|
router.Use(sessions.Sessions("session", cookie.NewStore([]byte(secret))))
|
|
|
|
// Register custom validators
|
|
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
|
|
v.RegisterValidation("password", utils.PasswordValidator)
|
|
v.RegisterValidation("inlineList", utils.InlineListValidator)
|
|
}
|
|
|
|
// Swagger setup
|
|
docs.SwaggerInfo.Title = "58team blog"
|
|
docs.SwaggerInfo.Description = "This is blog 58team"
|
|
docs.SwaggerInfo.Version = "1.0"
|
|
docs.SwaggerInfo.Host = "localhost:8080"
|
|
docs.SwaggerInfo.BasePath = "/api/v1/"
|
|
docs.SwaggerInfo.Schemes = []string{"http", "https"}
|
|
|
|
router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, ginSwagger.URL("http://localhost:8080/swag/doc/doc.json")))
|
|
router.StaticFile("/swag/doc/doc.json", "docs/swagger.json")
|
|
|
|
// Routes setup
|
|
g := router.Group("/api/v1")
|
|
|
|
config, err := infrastructure.LoadConfig()
|
|
if err != nil {
|
|
log.Fatal("Load config error: ", err)
|
|
}
|
|
|
|
d, err := db.DatabaseInit(*config)
|
|
if err != nil {
|
|
log.Fatal("Database error: ", err)
|
|
}
|
|
|
|
postRepository := repo.CreatePostRepository(d)
|
|
userRepository := repo.CreateUserRepository(d)
|
|
imagesRepository := repo.CreateImagesRepository(d)
|
|
|
|
postService := services.CreatePostService(&postRepository)
|
|
userService := services.CreateUserService(&userRepository)
|
|
imagesService := services.CreateImagesService(&imagesRepository)
|
|
|
|
interfaces.BindPostAdmin(&postService, &userService, g)
|
|
interfaces.BindPost(&postService, &userService, g)
|
|
interfaces.BindUser(config.AdminName, config.AdminPassword, &userService, g)
|
|
interfaces.BindImages(config.ImagesPath, &imagesService, g)
|
|
|
|
router.Run(":8080")
|
|
}
|