Victor Lacasse-Beaudoin
3aa7faa2f6
Ignore .swp files Rename serverCmd to apiCmd (the web client is technically a server too) Add webCmd for html routes hosting Add embedding and templating for web client Add webhandlers Fix some variables not being filled automatically by viper Change flags and reorganize config structure
119 lines
3 KiB
Go
119 lines
3 KiB
Go
package cmd
|
|
|
|
import (
|
|
"crypto/subtle"
|
|
"fmt"
|
|
"log"
|
|
|
|
"git.agecem.com/agecem/bottin/v4/data"
|
|
"git.agecem.com/agecem/bottin/v4/handlers"
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/labstack/echo/v4/middleware"
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
var (
|
|
apiPort int
|
|
apiKey string
|
|
)
|
|
|
|
// 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("api.key")
|
|
apiPort = viper.GetInt("api.port")
|
|
|
|
connection := data.PostgresConnection{
|
|
User: viper.GetString("db.user"),
|
|
Password: viper.GetString("db.password"),
|
|
Host: viper.GetString("db.host"),
|
|
Database: viper.GetString("db.database"),
|
|
Port: viper.GetInt("db.port"),
|
|
}
|
|
|
|
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
|
|
}))
|
|
}
|
|
|
|
// Routes
|
|
|
|
e.GET("/v4/", handlers.GetV4)
|
|
|
|
e.POST("/v4/membres/", handlers.PostMembres)
|
|
|
|
e.GET("/v4/membres/:membre_id/", handlers.ReadMembre)
|
|
|
|
e.PUT("/v4/membres/:membre_id/prefered_name/", handlers.PutMembrePreferedName)
|
|
|
|
e.POST("/v4/programmes/", handlers.PostProgrammes)
|
|
|
|
e.POST("/v4/seed/", handlers.PostSeed)
|
|
|
|
// Execution
|
|
|
|
client, err := data.NewDataClient(connection)
|
|
if err != nil {
|
|
log.Fatalf("Could not establish database connection.\n Error: %s\n", err)
|
|
}
|
|
|
|
err = client.DB.Ping()
|
|
if err != nil {
|
|
log.Fatalf("Database was supposed to be ready but Ping() failed.\n Error: %s\n", err)
|
|
}
|
|
|
|
client.DB.Close()
|
|
|
|
log.Println("apiPort: ", apiPort)
|
|
log.Println("apiKey: ", apiKey)
|
|
|
|
e.Logger.Fatal(e.Start(fmt.Sprintf(":%d", apiPort)))
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(apiCmd)
|
|
|
|
// api.key
|
|
apiCmd.Flags().String(
|
|
"api-key", "bottin",
|
|
"API server key. Leave empty for no key auth. (config: 'api.key')")
|
|
viper.BindPFlag("api.key", apiCmd.Flags().Lookup("api-key"))
|
|
|
|
// api.port
|
|
apiCmd.Flags().Int(
|
|
"api-port", 1312,
|
|
"API server port (config:'api.port')")
|
|
viper.BindPFlag("api.port", apiCmd.Flags().Lookup("api-port"))
|
|
|
|
// db.database
|
|
apiCmd.Flags().String("db-database", "bottin", "Postgres database (config:'db.database')")
|
|
viper.BindPFlag("db.database", apiCmd.Flags().Lookup("db-database"))
|
|
|
|
// db.host
|
|
apiCmd.Flags().String("db-host", "db", "Postgres host (config:'db.host')")
|
|
viper.BindPFlag("db.host", apiCmd.Flags().Lookup("db-host"))
|
|
|
|
// db.password
|
|
apiCmd.Flags().String("db-password", "bottin", "Postgres password (config:'db.password')")
|
|
viper.BindPFlag("db.password", apiCmd.Flags().Lookup("db-password"))
|
|
|
|
// db.port
|
|
apiCmd.Flags().Int("db-port", 5432, "Postgres port (config:'db.port')")
|
|
viper.BindPFlag("db.port", apiCmd.Flags().Lookup("db-port"))
|
|
|
|
// db.user
|
|
apiCmd.Flags().String("db-user", "bottin", "Postgres user (config:'db.user')")
|
|
viper.BindPFlag("db.user", apiCmd.Flags().Lookup("db-user"))
|
|
}
|