2023-09-15 17:10:57 -04:00
// Package apihandler provides handlers for API routes
package apihandler
2023-09-15 18:13:48 -04:00
import (
2023-09-16 15:05:13 -04:00
"fmt"
2023-09-15 18:13:48 -04:00
"net/http"
"git.agecem.com/agecem/bottin-ag/apiresponse"
2023-09-16 17:22:12 -04:00
"git.agecem.com/agecem/bottin-ag/dbclient"
2023-09-16 23:07:52 -04:00
"git.agecem.com/agecem/bottin-ag/dbstruct"
2024-02-14 16:48:20 -05:00
bottindata "git.agecem.com/agecem/bottin/v6/data"
2023-09-15 18:13:48 -04:00
"github.com/labstack/echo/v4"
)
// DeclareRoutes declares the API server endpoints for the specified Group
func DeclareRoutes ( e * echo . Group , h * APIHandler ) {
e . GET ( "/health/" , h . HealthGET )
2023-09-16 15:05:13 -04:00
e . GET ( "/scan/:membre_id/" , h . ScanGET )
2023-09-16 23:07:52 -04:00
e . POST ( "/scan/:membre_id/" , h . ScanPOST )
2023-09-19 18:25:12 -04:00
e . GET ( "/decompte/" , h . DecompteGET )
2023-10-02 14:08:03 -04:00
e . GET ( "/presences/" , h . PresencesGET )
2023-09-15 18:13:48 -04:00
}
2023-09-16 17:44:38 -04:00
/ *
New retourne un nouveau APIHandler contenant des pointers vers les clients
nécessaires à l ' exécution du API server
* /
func New ( bottinAPIClient * bottindata . ApiClient , dbClient * dbclient . DBClient ) APIHandler {
return APIHandler {
BottinAPIClient : bottinAPIClient ,
DBClient : dbClient ,
}
2023-09-15 18:13:48 -04:00
}
/ *
APIHandler is the struct that implements the actual logic for the API server
routes
* /
2023-09-16 15:05:13 -04:00
type APIHandler struct {
BottinAPIClient * bottindata . ApiClient
2023-09-16 17:22:12 -04:00
DBClient * dbclient . DBClient
2023-09-16 15:05:13 -04:00
}
2023-09-15 18:13:48 -04:00
// HealthGET is the handler for `GET /v:version/health/ http/1.1`
func ( a * APIHandler ) HealthGET ( c echo . Context ) error {
var r apiresponse . HealthGET
2023-09-16 19:16:43 -04:00
r . Message = "not ok"
2023-09-16 15:05:13 -04:00
bottinStatus , err := a . BottinAPIClient . GetHealth ( )
if err != nil {
r . StatusCode = http . StatusInternalServerError
r . Data . BottinStatus = err . Error ( )
} else {
r . Data . BottinStatus = bottinStatus
}
2023-09-15 18:13:48 -04:00
2023-09-16 19:16:43 -04:00
switch r . Data . BottinStatus {
2024-02-14 16:48:20 -05:00
case "Bottin API v6 is ready" :
2023-09-16 19:16:43 -04:00
r . Message = "ok"
r . StatusCode = http . StatusOK
default :
r . StatusCode = http . StatusInternalServerError
}
2023-09-15 18:13:48 -04:00
return c . JSON ( r . StatusCode , r )
}
2023-09-16 15:05:13 -04:00
/ *
ScanGET is the handler for ` GET /v { version}/scan/ { membre_id}/ http/1.1 `
It returns the scanned status of a membre , without affecting the database .
* /
func ( a * APIHandler ) ScanGET ( c echo . Context ) error {
var r apiresponse . ScanGET
r . StatusCode = http . StatusOK
membreID := c . Param ( "membre_id" )
membre , err := a . BottinAPIClient . GetMembre ( membreID )
if err != nil {
switch err . Error ( ) {
2024-02-14 17:03:24 -05:00
case "Ce numéro étudiant ne correspond à aucunE membre" , "Not Found" :
2023-09-16 15:05:13 -04:00
r . Message = fmt . Sprintf ( "%s n'est pas membre de l'AGECEM" , membreID )
r . StatusCode = http . StatusNotFound
case "Veuillez fournir un numéro étudiant à rechercher" :
r . Error = "membre_id ne peut pas être vide"
r . StatusCode = http . StatusBadRequest
r . Message = err . Error ( )
default :
r . Error = err . Error ( )
r . Message = "Erreur lors de BottinAPIClient.GetMembre"
r . StatusCode = http . StatusInternalServerError
return c . JSON ( r . StatusCode , r )
}
}
if membre . ID == membreID && membre . ID != "" {
r . Message = fmt . Sprintf ( "%s est membre de l'AGECEM" , membreID )
}
2023-09-16 23:07:52 -04:00
//TODO remplir r.Data.IsScanned
2023-09-16 15:05:13 -04:00
return c . JSON ( r . StatusCode , r )
}
2023-09-16 15:07:36 -04:00
// ScanPOST is the handler for `POST /v{version}/scan/{membre_id}/ http/1.1`
func ( a * APIHandler ) ScanPOST ( c echo . Context ) error {
var r apiresponse . ScanPOST
2023-09-16 23:07:52 -04:00
membreID := c . Param ( "membre_id" )
2023-09-16 15:07:36 -04:00
2023-09-16 23:07:52 -04:00
membre , err := a . BottinAPIClient . GetMembre ( membreID )
if err != nil {
switch err . Error ( ) {
2024-02-14 17:03:24 -05:00
case "Ce numéro étudiant ne correspond à aucunE membre" , "Not Found" :
2023-09-17 16:39:54 -04:00
r . Message = fmt . Sprintf ( "👎 %s n'est pas membre de l'AGECEM" , membreID )
2023-09-16 23:07:52 -04:00
r . Error = err . Error ( )
r . StatusCode = http . StatusNotFound
return c . JSON ( r . StatusCode , r )
case "Veuillez fournir un numéro étudiant à rechercher" :
r . Error = "membre_id ne peut pas être vide"
r . StatusCode = http . StatusBadRequest
r . Message = err . Error ( )
return c . JSON ( r . StatusCode , r )
default :
r . Error = err . Error ( )
r . Message = "Erreur lors de BottinAPIClient.GetMembre"
r . StatusCode = http . StatusInternalServerError
return c . JSON ( r . StatusCode , r )
}
}
var presence dbstruct . Presence
presence . ID = membre . ID
presence . ProgrammeID = membre . ProgrammeID
switch membre . PreferedName != "" {
case true :
presence . Name = membre . PreferedName
case false :
presence . Name = fmt . Sprintf ( "%s, %s" , membre . LastName , membre . FirstName )
}
insertedPresence , err := a . DBClient . InsertPresence ( presence )
if err != nil {
r . Error = err . Error ( )
2023-09-17 16:39:54 -04:00
r . Message = "👎 Erreur lors de DBClient.InsertPresence"
2023-09-16 23:07:52 -04:00
r . StatusCode = http . StatusInternalServerError
return c . JSON ( r . StatusCode , r )
}
if insertedPresence . ID == "" {
r . Error = "Membre déjà enregistré·e"
2023-09-17 16:39:54 -04:00
r . Message = fmt . Sprintf ( "👎 Membre '%s' (%s) déjà enregistré·e." , presence . Name , presence . ID )
2023-09-16 23:07:52 -04:00
r . StatusCode = http . StatusBadRequest
return c . JSON ( r . StatusCode , r )
}
r . StatusCode = http . StatusOK
2023-09-17 16:39:54 -04:00
r . Message = fmt . Sprintf ( "👍 Membre '%s' (%s) enregistré·e avec succès, veuillez lui donner son carton de vote. Bonne assemblée!" , insertedPresence . Name , insertedPresence . ID )
2023-09-16 23:07:52 -04:00
return c . JSON ( r . StatusCode , r )
2023-09-16 15:07:36 -04:00
}
2023-09-19 18:25:12 -04:00
// 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 )
}
2023-10-02 14:08:03 -04:00
// PresencesGET is the handler for `GET /v:version/presences/ http/1.1`
func ( a * APIHandler ) PresencesGET ( c echo . Context ) error {
var r apiresponse . PresencesGET
presences , err := a . DBClient . GetPresences ( )
if err != nil {
r . Error = err . Error ( )
r . StatusCode = http . StatusInternalServerError
r . Message = "Error during a.DBClient.GetPresences"
return c . JSON ( r . StatusCode , r )
}
r . Data . Presences = presences
r . StatusCode = http . StatusOK
r . Message = "ok"
return c . JSON ( r . StatusCode , r )
}