From e585b65565d82248edc520374de81cd88b0b2b40 Mon Sep 17 00:00:00 2001
From: Victor Lacasse-Beaudoin
Date: Thu, 25 May 2023 22:07:53 -0400
Subject: [PATCH] Permettre au client web de rechercher unE membre
---
v4/cmd/web.go | 7 ++
v4/data/apiclient.go | 116 +++++++++++++++++++++++++++++++++
v4/web/templates/index.html | 17 +++--
v4/web/webhandlers/handlers.go | 53 +++++++++++++++
4 files changed, 188 insertions(+), 5 deletions(-)
create mode 100644 v4/data/apiclient.go
diff --git a/v4/cmd/web.go b/v4/cmd/web.go
index 34f6bc0..c108012 100644
--- a/v4/cmd/web.go
+++ b/v4/cmd/web.go
@@ -70,6 +70,7 @@ var webCmd = &cobra.Command{
// Routes
e.GET("/", webhandlers.GetIndex)
+ e.GET("/membre/", webhandlers.GetMembre)
// Execution
@@ -94,6 +95,12 @@ func init() {
"Remote API server key (config:'web.api.key')")
viper.BindPFlag("web.api.key", webCmd.Flags().Lookup("web-api-key"))
+ // web.api.protocol
+ webCmd.Flags().String(
+ "web-api-protocol", "http",
+ "Remote API server protocol (config:'web.api.protocol')")
+ viper.BindPFlag("web.api.protocol", webCmd.Flags().Lookup("web-api-protocol"))
+
// web.api.port
webCmd.Flags().Int(
"web-api-port", 1312,
diff --git a/v4/data/apiclient.go b/v4/data/apiclient.go
new file mode 100644
index 0000000..c805463
--- /dev/null
+++ b/v4/data/apiclient.go
@@ -0,0 +1,116 @@
+package data
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "net/http"
+
+ "git.agecem.com/agecem/bottin/v4/models"
+)
+
+type ApiClient struct {
+ Key string
+ Host string
+ Port int
+ Protocol string
+}
+
+func NewApiClient(key, host, protocol string, port int) *ApiClient {
+ return &ApiClient{
+ Key: key,
+ Host: host,
+ Port: port,
+ Protocol: protocol,
+ }
+}
+
+func (a *ApiClient) Call(method, route string, requestBody io.Reader, useKey bool) (*http.Response, error) {
+ var response *http.Response
+
+ endpoint := fmt.Sprintf("%s://%s:%d%s",
+ a.Protocol, a.Host, a.Port, route,
+ )
+
+ /*
+ //TODO
+ log.Println("endpoint: ", endpoint)
+ */
+
+ // Create client
+ client := &http.Client{}
+
+ // Create request
+ request, err := http.NewRequest(method, endpoint, requestBody)
+ if err != nil {
+ return response, err
+ }
+
+ if useKey {
+ if a.Key == "" {
+ return response, fmt.Errorf("Call to API required a key but none was provided. See --help for instructions on providing an API key.")
+ }
+
+ request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", a.Key))
+ }
+
+ if requestBody != nil {
+ request.Header.Add("Content-Type", "application/json")
+ }
+
+ // Fetch Request
+ response, err = client.Do(request)
+ if err != nil {
+ return response, err
+ }
+
+ return response, nil
+}
+
+func (a *ApiClient) GetMembre(membreID string) (models.Membre, error) {
+ var getMembreResponse struct {
+ Message string `json:"message"`
+ Data struct {
+ Membre models.Membre `json:"membre"`
+ } `json:"data"`
+ }
+
+ if membreID == "" {
+ return getMembreResponse.Data.Membre, errors.New("Veuillez fournir un numéro étudiant à rechercher")
+ }
+
+ //TODO
+ /*
+ log.Println("ApiClient.GetMembre received membreID: ", membreID)
+ */
+
+ response, err := a.Call(http.MethodGet, fmt.Sprintf("/v4/membres/%s", membreID), nil, true)
+ if err != nil {
+ return getMembreResponse.Data.Membre, err
+ }
+
+ defer response.Body.Close()
+
+ body, err := ioutil.ReadAll(response.Body)
+ if err != nil {
+ return getMembreResponse.Data.Membre, err
+ }
+
+ if err := json.Unmarshal(body, &getMembreResponse); err != nil {
+ return getMembreResponse.Data.Membre, err
+ }
+
+ /*
+ if getMembreResponse.Message != "Read successful" {
+ return getMembreResponse.Data.Membre, errors.New(getMembreResponse.Message)
+ }
+ */
+
+ if getMembreResponse.Data.Membre == *new(models.Membre) {
+ return getMembreResponse.Data.Membre, fmt.Errorf("Ce numéro étudiant ne correspond à aucunE membre")
+ }
+
+ return getMembreResponse.Data.Membre, nil
+}
diff --git a/v4/web/templates/index.html b/v4/web/templates/index.html
index e318199..b5a94a8 100644
--- a/v4/web/templates/index.html
+++ b/v4/web/templates/index.html
@@ -19,12 +19,19 @@
Entrez manuellement le code à 7 chiffres
-
+
+ {{ .Result }}