package main import ( "context" "fmt" "net/http" sqlc "nyanimedb/sql" "os" "reflect" "time" oapi "nyanimedb/api" handlers "nyanimedb/modules/backend/handlers" middleware "nyanimedb/modules/backend/middlewares" "nyanimedb/modules/backend/rmq" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "github.com/jackc/pgx/v5/pgxpool" "github.com/pelletier/go-toml/v2" "github.com/rabbitmq/amqp091-go" log "github.com/sirupsen/logrus" ) var AppConfig Config func main() { if len(os.Args) != 2 { AppConfig.Mode = "env" } else { AppConfig.Mode = "argv" } err := InitConfig() if err != nil { log.Fatalf("Failed to init config: %v\n", err) } pool, err := pgxpool.New(context.Background(), AppConfig.DdUrl) if err != nil { fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err) os.Exit(1) } defer pool.Close() r := gin.Default() if len(AppConfig.AuthEnabled) > 0 && AppConfig.AuthEnabled != "false" { r.Use(middleware.CSRFMiddleware()) r.Use(middleware.JWTAuthMiddleware(AppConfig.JwtPrivateKey)) } queries := sqlc.New(pool) rmqConn, err := amqp091.Dial(AppConfig.RmqURL) if err != nil { log.Fatalf("Failed to connect to RabbitMQ: %v", err) } defer rmqConn.Close() rpcClient := rmq.NewRPCClient(rmqConn, 30*time.Second) server := handlers.NewServer(queries, rpcClient) r.Use(cors.New(cors.Config{ AllowOrigins: []string{AppConfig.ServiceAddress}, // AllowOrigins: []string{"*"}, AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "PATCH"}, AllowHeaders: []string{"Origin", "Content-Type", "Accept", "X-XSRF-TOKEN"}, ExposeHeaders: []string{"Content-Length"}, AllowCredentials: true, MaxAge: 12 * time.Hour, })) oapi.RegisterHandlers(r, oapi.NewStrictHandler( server, []oapi.StrictMiddlewareFunc{}, )) // Запуск log.Infof("Server starting on :8080") if err := r.Run(":8080"); err != nil && err != http.ErrServerClosed { log.Fatalf("server failed: %v", err) } } func InitConfig() error { if AppConfig.Mode == "argv" { content, err := os.ReadFile(os.Args[1]) if err != nil { return err } toml.Unmarshal(content, &AppConfig) fmt.Printf("%+v\n", AppConfig) return nil } else if AppConfig.Mode == "env" { f := reflect.ValueOf(AppConfig) for i := 0; i < f.NumField(); i++ { field := f.Type().Field(i) tag := field.Tag env_var := tag.Get("env") fmt.Printf("Field: %v.\nEnvironment variable: %v.\n", field.Name, env_var) if env_var != "" { env_value, exists := os.LookupEnv(env_var) if !exists { return fmt.Errorf("there is no env variable %s", env_var) } err := setField(&AppConfig, field.Name, env_value) if err != nil { return fmt.Errorf("failed to set config field %s: %v", field.Name, err) } } } return nil } else { return fmt.Errorf("incorrect config mode") } }