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  }