presences/handler.go

158 lines
3.7 KiB
Go

package main
import (
"context"
"fmt"
"log"
"net/http"
"git.agecem.com/bottin/bottin/v10/pkg/bottin"
"github.com/labstack/echo/v4"
)
func UICountPresences(ctx context.Context, cfg Config, dbClient *DBClient) echo.HandlerFunc {
return func(c echo.Context) error {
type data struct {
Error string
Decompte int
HideFermerButton bool
}
return c.Render(http.StatusOK, "decompte-html", func() (d data) {
if err := func() error {
select {
case <-ctx.Done():
return fmt.Errorf("Impossible de contacter le serveur: %s", ctx.Err())
default:
if dbClient == nil {
return fmt.Errorf("Impossible de contacter la base de données: le client DB est nil")
}
/*
switch c.QueryParams().Get("hideFermerButton") {
case "", "false":
default:
d.HideFermerButton = true
}
*/
if err := echo.QueryParamsBinder(c).
Bool("hideFermerButton", &d.HideFermerButton).
BindError(); err != nil {
//
log.Println("bind error on /decompte:", err)
}
decompte, err := dbClient.CountPresences(ctx)
if err != nil {
return err
}
d.Decompte = decompte
// No errors
return nil
}
}(); err != nil {
// Send error to user
d.Error = err.Error()
// Log error
log.Println("err:", d.Error)
}
return
}())
}
}
func UICreatePresence(ctx context.Context, cfg Config, bottinClient *bottin.APIClient, dbClient *DBClient) echo.HandlerFunc {
return func(c echo.Context) error {
type data struct {
Error string
Result string
}
return c.Render(http.StatusOK, "scan-html", func() (d data) {
if err := func() error {
select {
case <-ctx.Done():
return fmt.Errorf("Impossible de contacter le serveur: %s", ctx.Err())
default:
if bottinClient == nil {
return fmt.Errorf("Impossible de contacter le serveur: le client bottin est nil")
}
if dbClient == nil {
return fmt.Errorf("Impossible de contacter la base de données: le client DB est nil")
}
membreID := c.FormValue("membre_id")
if membreID == "" {
return fmt.Errorf("Aucun numéro étudiant sélectionné. Assurez-vous de cliquer sur la case 'Numéro étudiant:' avant de scanner.")
}
membreResponse, err := bottinClient.ReadMembre(ctx, membreID)
if err != nil {
if err.Error() == "400 no rows in result set" {
return fmt.Errorf("Numéro étudiant introuvable %s", membreID)
}
return err
}
if membreResponse.Data.Membre.ID != membreID {
return fmt.Errorf("Bottin a retourné '%s' en demandant '%s'", membreID, membreResponse.Data.Membre.ID)
}
if err := dbClient.CreatePresence(ctx, membreID); err != nil {
return err
}
d.Result = fmt.Sprintf(
"%s, %s (%s) peut participer à l'Assemblée Générale!",
membreResponse.Data.Membre.LastName,
membreResponse.Data.Membre.FirstName,
membreID,
)
// No errors
return nil
}
}(); err != nil {
// Send error to user
d.Error = err.Error()
// Log error
log.Println("err:", d.Error)
}
return
}())
}
}
func UIIndex(ctx context.Context, cfg Config) echo.HandlerFunc {
return func(c echo.Context) error {
type data struct {
Error string
}
return c.Render(http.StatusOK, "index-html", func() (d data) {
if err := func() error {
select {
case <-ctx.Done():
return fmt.Errorf("Impossible de contacter le serveur: %s", ctx.Err())
default:
return nil
}
}(); err != nil {
// Send error to user
d.Error = err.Error()
// Log error
log.Println("err:", d.Error)
}
return
}())
}
}