660d8826e2
Ajouter data#ApiClient.InsertTransactions() Fix form action Ajouter séparateur entre description et formulaire Ajouter webhandlers#PostTransaction et PostTransactionResult
90 lines
2 KiB
Go
90 lines
2 KiB
Go
package cmd
|
|
|
|
import (
|
|
"crypto/subtle"
|
|
"embed"
|
|
"fmt"
|
|
"html/template"
|
|
"io"
|
|
"log"
|
|
|
|
"git.agecem.com/agecem/bottin-agenda/data"
|
|
"git.agecem.com/agecem/bottin-agenda/models"
|
|
"git.agecem.com/agecem/bottin-agenda/web"
|
|
"git.agecem.com/agecem/bottin-agenda/web/webhandlers"
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/labstack/echo/v4/middleware"
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
var templatesFS embed.FS
|
|
|
|
type Template struct {
|
|
templates *template.Template
|
|
}
|
|
|
|
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
|
|
return t.templates.ExecuteTemplate(w, name, data)
|
|
}
|
|
|
|
// webCmd represents the web command
|
|
var webCmd = &cobra.Command{
|
|
Use: "web",
|
|
Short: "Démarrer le client web",
|
|
Args: cobra.ExactArgs(0),
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
var config models.Config
|
|
|
|
err := viper.Unmarshal(&config)
|
|
if err != nil {
|
|
log.Fatalf("Error during webCmd#viper.Unmarshal(): %s", err)
|
|
}
|
|
|
|
// Ping API server
|
|
|
|
apiClient := data.NewApiClient(config.Web.Api.Key, config.Web.Api.Host, config.Web.Api.Protocol, config.Web.Api.Port)
|
|
|
|
healthResult, err := apiClient.GetHealth()
|
|
if err != nil {
|
|
log.Fatalf("Error during webCmd#apiClient.GetHealth(): %s", err)
|
|
}
|
|
|
|
log.Println(healthResult)
|
|
|
|
e := echo.New()
|
|
|
|
// Middlewares
|
|
|
|
e.Pre(middleware.AddTrailingSlash())
|
|
|
|
e.Use(middleware.BasicAuth(func(user, password string, c echo.Context) (bool, error) {
|
|
usersMatch := subtle.ConstantTimeCompare([]byte(user), []byte(config.Web.User)) == 1
|
|
passwordsMatch := subtle.ConstantTimeCompare([]byte(password), []byte(config.Web.Password)) == 1
|
|
return usersMatch && passwordsMatch, nil
|
|
}))
|
|
|
|
// Template
|
|
|
|
t := &Template{
|
|
templates: template.Must(template.ParseFS(templatesFS, "templates/*.html")),
|
|
}
|
|
|
|
e.Renderer = t
|
|
|
|
// Routes
|
|
|
|
e.GET("/", webhandlers.GetIndex)
|
|
e.POST("/transaction/", webhandlers.PostTransaction)
|
|
|
|
// Execution
|
|
|
|
e.Logger.Fatal(e.Start(
|
|
fmt.Sprintf(":%d", config.Web.Port)))
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(webCmd)
|
|
templatesFS = web.GetTemplates()
|
|
}
|