package cmd import ( "crypto/subtle" "fmt" "log" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" "github.com/spf13/cobra" "github.com/spf13/viper" ) var ( apiPort int apiKey string ) const ( ViperAPIPort string = "api.port" FlagAPIPort string = "api-port" DefaultAPIPort int = 1312 DescriptionAPIPort string = "API server port" ViperAPIKey string = "api.key" FlagAPIKey string = "api-key" DefaultAPIKey string = "bottin" DescriptionAPIKey string = "API server key. Leave empty for no key auth (not recommended)" ViperDBDatabase string = "db.database" FlagDBDatabase string = "db-database" DefaultDBDatabase string = "bottin" DescriptionDBDatabase string = "Postgres database" ViperDBHost string = "db.host" FlagDBHost string = "db-host" DefaultDBHost string = "db" DescriptionDBHost string = "Postgres host" ViperDBPassword string = "db.password" FlagDBPassword string = "db-password" DefaultDBPassword string = "bottin" DescriptionDBPassword string = "Postgres password" ViperDBPort string = "db.port" FlagDBPort string = "db-port" DefaultDBPort int = 5432 DescriptionDBPort string = "Postgres port" ViperDBUser string = "db.user" FlagDBUser string = "db-user" DefaultDBUser string = "bottin" DescriptionDBUser string = "Postgres user" ) // apiCmd represents the api command var apiCmd = &cobra.Command{ Use: "api", Short: "Démarrer le serveur API", Args: cobra.ExactArgs(0), Run: func(cmd *cobra.Command, args []string) { apiKey = viper.GetString(ViperAPIKey) apiPort = viper.GetInt(ViperAPIPort) e := echo.New() // Middlewares e.Pre(middleware.AddTrailingSlash()) if apiKey != "" { e.Use(middleware.KeyAuth(func(key string, c echo.Context) (bool, error) { return subtle.ConstantTimeCompare([]byte(key), []byte(apiKey)) == 1, nil })) } // DataClient /* client, err := data.NewDataClientFromViper() if err != nil { log.Fatalf("Could not establish database connection.\n Error: %s\n", err) } defer client.DB.Close() err = client.DB.Ping() if err != nil { log.Fatalf("Database was supposed to be ready but Ping() failed.\n Error: %s\n", err) } _, err = client.Seed() if err != nil { log.Fatalf("Error during client.Seed(): %s", err) } */ // Routes /* h := handlers.New(client) e.GET("/v7/health/", h.GetHealth) e.POST("/v7/membres/", h.PostMembres) e.GET("/v7/membres/", h.ListMembres) e.GET("/v7/membres/:membre_id/", h.ReadMembre) e.PUT("/v7/membres/:membre_id/prefered_name/", h.PutMembrePreferedName) e.POST("/v7/programmes/", h.PostProgrammes) e.POST("/v7/seed/", h.PostSeed) */ // Execution e.Logger.Fatal(e.Start(fmt.Sprintf(":%d", apiPort))) }, } func init() { rootCmd.AddCommand(apiCmd) // api.key apiCmd.Flags().String(FlagAPIKey, DefaultAPIKey, DescriptionAPIKey) if err := viper.BindPFlag(ViperAPIKey, apiCmd.Flags().Lookup(FlagAPIKey)); err != nil { log.Fatal(err) } // api.port apiCmd.Flags().Int(FlagAPIPort, DefaultAPIPort, DescriptionAPIPort) if err := viper.BindPFlag(ViperAPIPort, apiCmd.Flags().Lookup(FlagAPIPort)); err != nil { log.Fatal(err) } // db.database apiCmd.Flags().String(FlagDBDatabase, DefaultDBDatabase, DescriptionDBDatabase) if err := viper.BindPFlag(ViperDBDatabase, apiCmd.Flags().Lookup(FlagDBDatabase)); err != nil { log.Fatal(err) } // db.host apiCmd.Flags().String(FlagDBHost, DefaultDBHost, DescriptionDBHost) if err := viper.BindPFlag(ViperDBHost, apiCmd.Flags().Lookup(FlagDBHost)); err != nil { log.Fatal(err) } // db.password apiCmd.Flags().String(FlagDBPassword, DefaultDBPassword, DescriptionDBPassword) if err := viper.BindPFlag(ViperDBPassword, apiCmd.Flags().Lookup(FlagDBPassword)); err != nil { log.Fatal(err) } // db.port apiCmd.Flags().Int(FlagDBPort, DefaultDBPort, DescriptionDBPort) if err := viper.BindPFlag(ViperDBPort, apiCmd.Flags().Lookup(FlagDBPort)); err != nil { log.Fatal(err) } // db.user apiCmd.Flags().String(FlagDBUser, DefaultDBUser, DescriptionDBUser) if err := viper.BindPFlag(ViperDBUser, apiCmd.Flags().Lookup(FlagDBUser)); err != nil { log.Fatal(err) } }