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