diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..f36e43750f66aa7e9921645912501ac74e65203e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "workbench.colorCustomizations": { + "activityBar.activeBackground": "#65f4ff", + "activityBar.activeBorder": "#ff40f1", + "activityBar.background": "#65f4ff", + "activityBar.foreground": "#15202b", + "activityBar.inactiveForeground": "#15202b99", + "activityBarBadge.background": "#ff40f1", + "activityBarBadge.foreground": "#15202b", + "sash.hoverBorder": "#65f4ff", + "statusBar.background": "#32f0ff", + "statusBar.foreground": "#15202b", + "statusBarItem.hoverBackground": "#00ebfe", + "statusBarItem.remoteBackground": "#32f0ff", + "statusBarItem.remoteForeground": "#15202b", + "titleBar.activeBackground": "#32f0ff", + "titleBar.activeForeground": "#15202b", + "titleBar.inactiveBackground": "#32f0ff99", + "titleBar.inactiveForeground": "#15202b99" + }, + "peacock.color": "#32f0ff" +} \ No newline at end of file diff --git a/internal/models/models.go b/internal/models/models.go index fc72cf87c0c4407da254bf480685d2845457d28d..9fffb4e14741ad038fe615c15f5ddd07bc07cd59 100644 --- a/internal/models/models.go +++ b/internal/models/models.go @@ -41,5 +41,16 @@ func NewDataHandler() *DataHandler { db.AutoMigrate(&MonthlyInfo{}) db.AutoMigrate(&MonthlyNews{}) db.AutoMigrate(&Poll{}) + db.AutoMigrate(&PartnersInfo{}) + + // Create default partner status + db.Create(&PartnersInfo{ + Message: "", + GRDFFailure: false, + EnedisFailure: false, + EGLFailure: false, + NotificationActivated: false, + }) + return &DataHandler{db: db} } diff --git a/internal/models/partnersInfo.go b/internal/models/partnersInfo.go new file mode 100644 index 0000000000000000000000000000000000000000..0996fb12e8493c2d728791f895db477d02da4045 --- /dev/null +++ b/internal/models/partnersInfo.go @@ -0,0 +1,88 @@ +package models + +import ( + "encoding/json" + "errors" + "log" + "net/http" + + "gorm.io/gorm" +) + +type PartnersInfo struct { + ID uint `gorm:"<-:create"` + Message string `json:"message"` + GRDFFailure bool `json:"grdf_failure"` + EnedisFailure bool `json:"enedis_failure"` + EGLFailure bool `json:"egl_failure"` + NotificationActivated bool `json:"notification_activated"` +} + +// GetPartnersInfo godoc +// @Summary Give status of partners' services +// @Description Give status of partners' services +// @Tags partnersInfo +// @Produce json +// @Success 200 {object} PartnersInfo +// @Failure 404 {string} string "Not found" +// @Router /api/common/partnersInfo [get] +func (dh *DataHandler) GetPartnersInfo(w http.ResponseWriter, r *http.Request) { + var partnersInfo PartnersInfo + err := dh.db.First(&partnersInfo).Error + + if errors.Is(err, gorm.ErrRecordNotFound) { + http.Error(w, "partners status not found", http.StatusNotFound) + return + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(partnersInfo) + log.Printf("| get partnersInfo | %v", r.RemoteAddr) +} + +// SavePartnersInfo godoc +// @Summary Update partnersInfo' content +// @Description Update partnersInfo' content +// @Tags partnersInfo +// @Accept json +// @Produce json +// @Success 200 {object} PartnersInfo "Updated successfully" +// @Failure 400 {string} string "Bad Request" +// @Failure 500 {string} string "Internal server error" +// @Param partnersInfo body PartnersInfo true "PartnersInfo to create/update with new content" +// @Router /api/admin/partnersInfo [put] +func (dh *DataHandler) SavePartnersInfo(w http.ResponseWriter, r *http.Request) { + if r.Body == http.NoBody { + http.Error(w, "request body is empty", http.StatusBadRequest) + return + } + + decoder := json.NewDecoder(r.Body) + var partnersInfo PartnersInfo + err := decoder.Decode(&partnersInfo) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + + var updatedPartnersInfo PartnersInfo + + err = dh.db.First(&updatedPartnersInfo).Error + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + + updatedPartnersInfo.Message = partnersInfo.Message + updatedPartnersInfo.GRDFFailure = partnersInfo.GRDFFailure + updatedPartnersInfo.EnedisFailure = partnersInfo.EnedisFailure + updatedPartnersInfo.EGLFailure = partnersInfo.EGLFailure + updatedPartnersInfo.NotificationActivated = partnersInfo.NotificationActivated + + dh.db.Save(&updatedPartnersInfo) + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(partnersInfo) + log.Printf("| updated partnersInfo | %v", r.RemoteAddr) + +} diff --git a/internal/rootmux/rootmux.go b/internal/rootmux/rootmux.go index 035192bd27e49e7286158eea649f1ad31f9f1366..6264fbf04e703022ae8694e927a9773b14816869 100644 --- a/internal/rootmux/rootmux.go +++ b/internal/rootmux/rootmux.go @@ -42,6 +42,7 @@ func CreateRootMux() RootMux { r.HandleFunc("/api/common/monthlyReport", dh.GetMonthlyReport).Methods(http.MethodGet) r.HandleFunc("/api/common/monthlyReport/{year}/{month}", dh.GetMonthlyReport).Methods(http.MethodGet) + r.HandleFunc("/api/common/partnersInfo", dh.GetPartnersInfo).Methods(http.MethodGet) apiAdmin := r.PathPrefix("/api/admin").Subrouter() apiAdmin.Use(auth.AdminAuthMiddleware) @@ -61,6 +62,8 @@ func CreateRootMux() RootMux { apiAdmin.HandleFunc("/poll", dh.SavePoll).Methods(http.MethodPut) apiAdmin.HandleFunc("/poll/{year}/{month}", dh.DeletePoll).Methods(http.MethodDelete) + apiAdmin.HandleFunc("/partnersInfo", dh.SavePartnersInfo).Methods(http.MethodPut) + apiAdmin.HandleFunc("/imageNames", file.GetEcogestureImages).Methods(http.MethodGet) // Swagger diff --git a/internal/rootmux/rootmux_test.go b/internal/rootmux/rootmux_test.go index 1d1e0d5faca97af165c7d4355e75783932a23767..374f868a2a26227c76c723ebaa87696edc9cd902 100644 --- a/internal/rootmux/rootmux_test.go +++ b/internal/rootmux/rootmux_test.go @@ -17,14 +17,16 @@ import ( ) var ( - oAuth2Server *httptest.Server - monthlyInfo = models.MonthlyInfo{Year: 2021, Month: 0, Info: "Informations du mois", Image: "imagebase64"} - monthlyInfoStr string - monthlyNews = models.MonthlyNews{Year: 2021, Month: 0, Title: "", Content: "Nouvelles fonctionnalités"} - monthlyNewsStr string - newPoll = models.Poll{Year: 2021, Month: 0, Question: "pollQuestion", Link: "pollLink"} - newPollStr string - noH map[string]string + oAuth2Server *httptest.Server + monthlyInfo = models.MonthlyInfo{Year: 2021, Month: 0, Info: "Informations du mois", Image: "imagebase64"} + monthlyInfoStr string + monthlyNews = models.MonthlyNews{Year: 2021, Month: 0, Title: "", Content: "Nouvelles fonctionnalités"} + monthlyNewsStr string + newPoll = models.Poll{Year: 2021, Month: 0, Question: "pollQuestion", Link: "pollLink"} + newPollStr string + partnersInfo = models.PartnersInfo{ID: 1, Message: "EGL est down", GRDFFailure: false, EnedisFailure: false, EGLFailure: true, NotificationActivated: true} + partnersInfoStr string + noH map[string]string ) func TestMain(m *testing.M) { @@ -51,6 +53,8 @@ func TestMain(m *testing.M) { monthlyNewsStr = string(monthlyNewsBytes) monthlyInfoBytes, _ := json.Marshal(monthlyInfo) monthlyInfoStr = string(monthlyInfoBytes) + partnersInfoBytes, _ := json.Marshal(partnersInfo) + partnersInfoStr = string(partnersInfoBytes) newPollBytes, _ := json.Marshal(newPoll) newPollStr = string(newPollBytes) @@ -98,6 +102,8 @@ func unloggedTests(t *testing.T) { do("GET", "/api/common/monthlyReport", noH, "", http.StatusBadRequest, "") // Try to get a monthlyReport (must fail because not found) do("GET", "/api/common/monthlyReport?year=2021&month=12", noH, "", http.StatusNotFound, "") + // Try to get partnersInfo (must pass) + do("GET", "/api/common/partnersInfo", noH, "", http.StatusOK, `{"ID":1,"message":"","grdf_failure":false,"enedis_failure":false,"egl_failure":false,"notification_activated":false}`) } /** @@ -158,6 +164,11 @@ func adminTests(t *testing.T) { // Try to get the monthlyReport (must pass) do("GET", "/api/common/monthlyReport/2021/0", noH, "", http.StatusOK, `{"year":2021,"month":0,"info":"Informations du mois","image":"imagebase64","newsTitle":"Les nouveautés du service","newsContent":"Nouvelles fonctionnalités","question":"pollQuestion","link":"pollLink"`) + // Try to update the partnersInfo (must pass) + do("PUT", "/api/admin/partnersInfo", xsrfHeader, partnersInfoStr, http.StatusOK, partnersInfoStr) + // Try to get the monthlyInfo created (must pass) + do("GET", "/api/common/partnersInfo", xsrfHeader, "", http.StatusOK, partnersInfoStr) + // Try to delete the monthlyNews created (must pass) do("DELETE", "/api/admin/monthlyNews/2021/0", xsrfHeader, "", http.StatusOK, "successful delete") // Try to get a monthlyNews after it is deleted (must fail because not found)