Ajouter décompte

This commit is contained in:
Victor Lacasse-Beaudoin 2023-09-19 18:25:12 -04:00
parent 7351f970f7
commit 6c09f1fa65
9 changed files with 126 additions and 1 deletions

View file

@ -14,6 +14,9 @@ type APIClient struct {
} }
func (a *APIClient) Scan(membreID string) (response apiresponse.ScanPOST, err error) { func (a *APIClient) Scan(membreID string) (response apiresponse.ScanPOST, err error) {
//TODO implement api key
return response, a.Voki.Unmarshal(http.MethodPost, fmt.Sprintf("/v0/scan/%s", membreID), nil, true, &response) return response, a.Voki.Unmarshal(http.MethodPost, fmt.Sprintf("/v0/scan/%s", membreID), nil, true, &response)
} }
func (a *APIClient) GetDecompte() (response apiresponse.DecompteGET, err error) {
return response, a.Voki.Unmarshal(http.MethodGet, "/v0/decompte", nil, true, &response)
}

View file

@ -17,6 +17,7 @@ func DeclareRoutes(e *echo.Group, h *APIHandler) {
e.GET("/health/", h.HealthGET) e.GET("/health/", h.HealthGET)
e.GET("/scan/:membre_id/", h.ScanGET) e.GET("/scan/:membre_id/", h.ScanGET)
e.POST("/scan/:membre_id/", h.ScanPOST) e.POST("/scan/:membre_id/", h.ScanPOST)
e.GET("/decompte/", h.DecompteGET)
} }
/* /*
@ -168,3 +169,26 @@ func (a *APIHandler) ScanPOST(c echo.Context) error {
return c.JSON(r.StatusCode, r) return c.JSON(r.StatusCode, r)
} }
// DecompteGET is the handler for `GET /v:version/decompte/ http/1.1`
func (a *APIHandler) DecompteGET(c echo.Context) error {
var r apiresponse.DecompteGET
r.Message = "not ok"
decompte, err := a.DBClient.GetDecompte()
if err != nil {
r.Error = err.Error()
r.StatusCode = http.StatusInternalServerError
r.Message = "Error during a.DBClient.GetDecompte"
return c.JSON(r.StatusCode, r)
}
r.Data.Decompte = decompte
r.StatusCode = http.StatusOK
r.Message = "ok"
return c.JSON(r.StatusCode, r)
}

View file

@ -23,3 +23,11 @@ type ScanGET struct {
type ScanPOST struct { type ScanPOST struct {
response.ResponseWithError response.ResponseWithError
} }
// DecompteGET is the response type for `GET /v:version/decompte/ http/1.1`
type DecompteGET struct {
response.ResponseWithError
Data struct {
Decompte int
}
}

View file

@ -72,3 +72,9 @@ func (d *DBClient) InsertPresence(presence dbstruct.Presence) (dbstruct.Presence
return insertedPresence, nil return insertedPresence, nil
} }
// GetDecompte returns the row count of the `presences` table and any error encountered
func (d *DBClient) GetDecompte() (decompte int, err error) {
err = d.DB.Get(&decompte, "SELECT COUNT(*) FROM presences;")
return decompte, err
}

View file

@ -0,0 +1,4 @@
{{ define "decompte-html" }}
Décompte: {{ .Data.Decompte }}
<button hx-get="/nothing" hx-on:click="document.getElementById('app-dialog').style.display = 'none';">fermer</button>
{{ end }}

View file

@ -6,6 +6,19 @@
<title>AGECEM | Assemblée Générale</title> <title>AGECEM | Assemblée Générale</title>
<script src="/public/js/htmx.min.js"></script> <script src="/public/js/htmx.min.js"></script>
<script src="/public/js/membreid-selected-and-cleared.js"></script> <script src="/public/js/membreid-selected-and-cleared.js"></script>
<style>
#app-dialog {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: white;
border: 1px solid #ccc;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
padding: 20px;
z-index: 555;
}
</style>
</head> </head>
<body> <body>
<h2>Présences en Assemblée Générale</h2> <h2>Présences en Assemblée Générale</h2>
@ -18,8 +31,15 @@
<button type="submit">enregistrer</button> <button type="submit">enregistrer</button>
</form> </form>
<button hx-get="/decompte" hx-target="#app-dialog" hx-on:click="document.getElementById('app-dialog').style.display = 'block';">Afficher décompte</button>
<div id="app-dialog" style="display: none;">
</div>
<div id="app-content"> <div id="app-content">
</div> </div>
</body> </body>
</html> </html>
{{ end }} {{ end }}

View file

@ -1,3 +1,4 @@
{{ define "scan-html" }} {{ define "scan-html" }}
<h3>{{ .Message }}</h3> <h3>{{ .Message }}</h3>
{{ if .Error }}<h3>{{ .Error }}</h3>{{ end }}
{{ end }} {{ end }}

View file

@ -13,6 +13,8 @@ import (
func DeclareRoutes(e *echo.Echo, h *WebHandler) { func DeclareRoutes(e *echo.Echo, h *WebHandler) {
e.GET("/", h.IndexGET) e.GET("/", h.IndexGET)
e.POST("/scan/", h.ScanPOST) e.POST("/scan/", h.ScanPOST)
e.GET("/decompte/", h.DecompteGET)
e.GET("/nothing/", h.NothingGET)
} }
type WebHandler struct { type WebHandler struct {
@ -31,6 +33,19 @@ func (w *WebHandler) IndexGET(c echo.Context) error {
r.Message = "foo" r.Message = "foo"
r.StatusCode = http.StatusOK r.StatusCode = http.StatusOK
/*
decompteResponse, err := w.APIClient.GetDecompte()
if err != nil {
r.Error = err.Error()
r.Message = "Impossible d'obtenir le décompte"
r.StatusCode = http.StatusInternalServerError
return c.Render(r.StatusCode, "index-html", r)
}
r.Data.Decompte = decompteResponse.Data.Decompte
*/
return c.Render(r.StatusCode, "index-html", r) return c.Render(r.StatusCode, "index-html", r)
} }
@ -44,6 +59,19 @@ func (w *WebHandler) ScanPOST(c echo.Context) error {
r.StatusCode = http.StatusOK r.StatusCode = http.StatusOK
/*
decompteResponse, err := w.APIClient.GetDecompte()
if err != nil {
r.Error = err.Error()
r.Message = "Impossible d'obtenir le décompte"
r.StatusCode = http.StatusInternalServerError
return c.Render(r.StatusCode, "index-html", r)
}
r.Data.Decompte = decompteResponse.Data.Decompte
*/
scanResponse, err := w.APIClient.Scan(membreID) scanResponse, err := w.APIClient.Scan(membreID)
r.Error = scanResponse.Error r.Error = scanResponse.Error
if err != nil { if err != nil {
@ -54,3 +82,27 @@ func (w *WebHandler) ScanPOST(c echo.Context) error {
return c.Render(r.StatusCode, "scan-html", r) return c.Render(r.StatusCode, "scan-html", r)
} }
func (w *WebHandler) DecompteGET(c echo.Context) error {
var r webresponse.DecompteGET
decompteResponse, err := w.APIClient.GetDecompte()
if err != nil {
r.Error = err.Error()
r.Message = "Impossible d'obtenir le décompte"
r.StatusCode = http.StatusInternalServerError
return c.Render(r.StatusCode, "decompte-html", r)
}
r.Data.Decompte = decompteResponse.Data.Decompte
r.StatusCode = http.StatusOK
r.Message = "ok"
return c.Render(r.StatusCode, "decompte-html", r)
}
func (w *WebHandler) NothingGET(c echo.Context) error {
return c.JSON(http.StatusOK, nil)
}

View file

@ -9,3 +9,10 @@ type IndexGET struct {
type ScanPOST struct { type ScanPOST struct {
response.ResponseWithError response.ResponseWithError
} }
type DecompteGET struct {
response.ResponseWithError
Data struct {
Decompte int
}
}