package cmd import ( "database/sql" "log" "net/http" "github.com/spf13/cobra" "github.com/spf13/viper" httpSwagger "github.com/swaggo/http-swagger" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect/pgdialect" "github.com/uptrace/bun/driver/pgdriver" "github.com/uptrace/bun/extra/bunotel" "github.com/uptrace/bunrouter" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.uber.org/zap" "gitea.konchin.com/service/amane-tanikaze-dcbot/amane/handlers/api" _ "gitea.konchin.com/service/amane-tanikaze-dcbot/amane/handlers/docs" "gitea.konchin.com/service/amane-tanikaze-dcbot/amane/middlewares" "gitea.konchin.com/service/amane-tanikaze-dcbot/amane/tracing" ) // @Title Amane Tanikaze Discord Bot Backend // @Version 2.0-alpha1 // @TermsOfService http://swagger.io/terms/ // @License.Name 0BSD // @BasePath / var backendCmd = &cobra.Command{ Use: "backend", Short: "backend server", Run: func(cmd *cobra.Command, args []string) { ctx := cmd.Context() tracing.InitTracer() sqldb := sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN( viper.GetString("pg-dsn")))) db := bun.NewDB(sqldb, pgdialect.New()) db.AddQueryHook(bunotel.NewQueryHook(bunotel.WithDBName("PostgreSQL"))) router := bunrouter.New() middlewaresHandlers := middlewares.NewHandlers(db) backend := router.NewGroup(""). Use(middlewaresHandlers.ErrorHandler) if viper.GetBool("swagger") { backend.GET("/docs/*any", bunrouter.HTTPHandlerFunc(httpSwagger.Handler())) } apiHandlers := api.NewHandlers(db) apiGroup := backend.NewGroup("/api") apiGroup.GET("/image", apiHandlers.GetImage) tracing.Logger.Ctx(ctx). Info("http server up", zap.String("http.port", viper.GetString("port"))) log.Println(http.ListenAndServe(":"+viper.GetString("port"), otelhttp.NewHandler(router, ""))) }, } func init() { backendCmd.Flags(). String("port", "8080", "Port to listen on") backendCmd.Flags(). String("pg-dsn", "postgres://amane:amane@postgres:5432/amane?sslmode=disable", "PostgreSQL connection string") backendCmd.Flags(). Bool("zap-develop", false, "Enable development log") backendCmd.Flags(). Bool("swagger", false, "Enable swagger") }