package main import ( "context" "fmt" "os" "reflect" "time" auth "nyanimedb/auth" handlers "nyanimedb/modules/auth/handlers" sqlc "nyanimedb/sql" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "github.com/jackc/pgx/v5/pgxpool" "github.com/pelletier/go-toml/v2" 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) } r := gin.Default() pool, err := pgxpool.New(context.Background(), os.Getenv("DATABASE_URL")) if err != nil { fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err) os.Exit(1) } var queries *sqlc.Queries = sqlc.New(pool) server := handlers.NewServer(queries, AppConfig.JwtPrivateKey) log.Info("allow origins:", AppConfig.ServiceAddress) r.Use(cors.New(cors.Config{ AllowOrigins: []string{"*"}, AllowMethods: []string{"GET", "POST", "PUT", "DELETE"}, AllowHeaders: []string{"Origin", "Content-Type", "Accept"}, ExposeHeaders: []string{"Content-Length"}, AllowCredentials: true, MaxAge: 12 * time.Hour, })) auth.RegisterHandlers(r, auth.NewStrictHandler( server, []auth.StrictMiddlewareFunc{}, )) r.Run(":8082") } 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") } }