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 }}

diff --git a/v4/web/webhandlers/handlers.go b/v4/web/webhandlers/handlers.go index 8376dd8..34724f9 100644 --- a/v4/web/webhandlers/handlers.go +++ b/v4/web/webhandlers/handlers.go @@ -1,11 +1,64 @@ package webhandlers import ( + "fmt" "net/http" + "git.agecem.com/agecem/bottin/v4/data" "github.com/labstack/echo/v4" + "github.com/spf13/viper" ) func GetIndex(c echo.Context) error { return c.Render(http.StatusOK, "index-html", nil) } + +func GetMembre(c echo.Context) error { + apiClientKey := viper.GetString("web.api.key") + apiClientHost := viper.GetString("web.api.host") + apiClientProtocol := viper.GetString("web.api.protocol") + apiClientPort := viper.GetInt("web.api.port") + + /* + log.Printf(` + apiClientKey: %s + apiClientHost: %s + apiClientProtocol: %s + apiClientPort: %d`, + apiClientKey, apiClientHost, apiClientProtocol, apiClientPort, + ) + */ + + apiClient := data.NewApiClient(apiClientKey, apiClientHost, apiClientProtocol, apiClientPort) + + membreID := c.QueryParam("membre_id") + + /* + // TODO + log.Printf("Requesting membreID: [%s]", membreID) + */ + + membre, err := apiClient.GetMembre(membreID) + if err != nil { + return c.Render(http.StatusBadRequest, "index-html", struct { + Result string + }{ + Result: fmt.Sprintln("👎", err.Error()), + }) + } + + membreResult := fmt.Sprintf(`👍 + Membre trouvéE: [%s]`, membre.ID) + + if membre.PreferedName != "" { + membreResult = fmt.Sprintf("%s -> %s", membreResult, membre.PreferedName) + } else { + membreResult = fmt.Sprintf("%s -> %s, %s", membreResult, membre.LastName, membre.FirstName) + } + + return c.Render(http.StatusOK, "index-html", struct { + Result string + }{ + Result: membreResult, + }) +}