github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/web/apps/maintenance.go (about) 1 package apps 2 3 import ( 4 "net/http" 5 6 "github.com/cozy/cozy-stack/model/app" 7 "github.com/cozy/cozy-stack/pkg/config/config" 8 "github.com/cozy/cozy-stack/pkg/consts" 9 "github.com/cozy/cozy-stack/pkg/couchdb" 10 "github.com/cozy/cozy-stack/pkg/jsonapi" 11 "github.com/cozy/cozy-stack/pkg/registry" 12 "github.com/labstack/echo/v4" 13 ) 14 15 type apiMaintenance struct { 16 couchdb.JSONDoc 17 } 18 19 // Links is part of the Manifest interface 20 func (man *apiMaintenance) Links() *jsonapi.LinksList { return nil } 21 22 // Relationships is part of the Manifest interface 23 func (man *apiMaintenance) Relationships() jsonapi.RelationshipMap { 24 return jsonapi.RelationshipMap{} 25 } 26 27 // Included is part of the Manifest interface 28 func (man *apiMaintenance) Included() []jsonapi.Object { return nil } 29 30 // apiMaintenance is a jsonapi.Object 31 var _ jsonapi.Object = (*apiMaintenance)(nil) 32 33 func listMaintenance(c echo.Context) error { 34 list, err := app.ListMaintenance() 35 if err != nil { 36 return err 37 } 38 objs := make([]jsonapi.Object, len(list)) 39 for i, item := range list { 40 item["level"] = "stack" 41 doc := couchdb.JSONDoc{ 42 Type: consts.KonnectorsMaintenance, 43 M: item, 44 } 45 objs[i] = &apiMaintenance{doc} 46 } 47 48 if ctx := c.QueryParam("Context"); ctx != "" { 49 contexts := config.GetConfig().Registries 50 registries, ok := contexts[ctx] 51 if !ok { 52 registries = contexts[config.DefaultInstanceContext] 53 } 54 apps, err := registry.ListMaintenance(registries) 55 if err != nil { 56 return err 57 } 58 for _, app := range apps { 59 app.M["level"] = "registry" 60 objs = append(objs, &apiMaintenance{app}) 61 } 62 } 63 64 return jsonapi.DataList(c, http.StatusOK, objs, nil) 65 } 66 67 func activateMaintenance(c echo.Context) error { 68 slug := c.Param("slug") 69 var doc couchdb.JSONDoc 70 if _, err := jsonapi.Bind(c.Request().Body, &doc); err != nil { 71 return err 72 } 73 if err := app.ActivateMaintenance(slug, doc.M); err != nil { 74 return err 75 } 76 return c.NoContent(http.StatusNoContent) 77 } 78 79 func deactivateMaintenance(c echo.Context) error { 80 slug := c.Param("slug") 81 if err := app.DeactivateMaintenance(slug); err != nil { 82 return err 83 } 84 return c.NoContent(http.StatusNoContent) 85 } 86 87 // AdminRoutes sets the routing for the admin interface to configure 88 // maintenance for the konnectors. 89 func AdminRoutes(router *echo.Group) { 90 router.GET("/maintenance", listMaintenance) 91 router.PUT("/maintenance/:slug", activateMaintenance) 92 router.DELETE("/maintenance/:slug", deactivateMaintenance) 93 }