github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/model/app/maintenance.go (about)

     1  package app
     2  
     3  import (
     4  	"encoding/json"
     5  
     6  	"github.com/cozy/cozy-stack/pkg/consts"
     7  	"github.com/cozy/cozy-stack/pkg/couchdb"
     8  	"github.com/cozy/cozy-stack/pkg/prefixer"
     9  )
    10  
    11  // ActivateMaintenance activates maintenance for the given konnector.
    12  func ActivateMaintenance(slug string, opts map[string]interface{}) error {
    13  	doc, err := loadMaintenance(slug)
    14  	if err != nil {
    15  		return err
    16  	}
    17  	doc.M = opts
    18  	if doc.M == nil {
    19  		doc.M = map[string]interface{}{}
    20  	}
    21  	doc.M["flag_infra_maintenance"] = true
    22  	doc.SetID(slug)
    23  	return couchdb.Upsert(prefixer.GlobalPrefixer, &doc)
    24  }
    25  
    26  // DeactivateMaintenance disables maintenance for the given konnector.
    27  func DeactivateMaintenance(slug string) error {
    28  	doc, err := loadMaintenance(slug)
    29  	if err != nil {
    30  		return err
    31  	}
    32  	if doc.M == nil {
    33  		doc.M = map[string]interface{}{}
    34  	}
    35  	doc.SetID(slug)
    36  	return couchdb.DeleteDoc(prefixer.GlobalPrefixer, &doc)
    37  }
    38  
    39  func loadMaintenance(slug string) (couchdb.JSONDoc, error) {
    40  	var doc couchdb.JSONDoc
    41  	err := couchdb.GetDoc(prefixer.GlobalPrefixer, consts.KonnectorsMaintenance, slug, &doc)
    42  	if err != nil && !couchdb.IsNotFoundError(err) {
    43  		return doc, err
    44  	}
    45  	doc.Type = consts.KonnectorsMaintenance
    46  	return doc, nil
    47  }
    48  
    49  // GetMaintenanceOptions will return the maintenance options for the given
    50  // konnector if it is in maintenance on this stack.
    51  func GetMaintenanceOptions(slug string) (map[string]interface{}, error) {
    52  	var doc couchdb.JSONDoc
    53  	err := couchdb.GetDoc(prefixer.GlobalPrefixer, consts.KonnectorsMaintenance, slug, &doc)
    54  	if couchdb.IsNotFoundError(err) {
    55  		return nil, nil
    56  	}
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  	delete(doc.M, "_id")
    61  	delete(doc.M, "_rev")
    62  	return doc.M, nil
    63  }
    64  
    65  // ListMaintenance returns the list of konnectors in maintenance for the stack
    66  // (not from apps registry).
    67  func ListMaintenance() ([]map[string]interface{}, error) {
    68  	list := []map[string]interface{}{}
    69  	err := couchdb.ForeachDocs(prefixer.GlobalPrefixer, consts.KonnectorsMaintenance, func(id string, raw json.RawMessage) error {
    70  		var opts map[string]interface{}
    71  		if err := json.Unmarshal(raw, &opts); err != nil {
    72  			return err
    73  		}
    74  		delete(opts, "_id")
    75  		delete(opts, "_rev")
    76  		doc := map[string]interface{}{
    77  			"slug":                  id,
    78  			"type":                  "konnector",
    79  			"maintenance_activated": true,
    80  			"maintenance_options":   opts,
    81  		}
    82  		list = append(list, doc)
    83  		return nil
    84  	})
    85  	if err != nil && !couchdb.IsNotFoundError(err) {
    86  		return nil, err
    87  	}
    88  	return list, nil
    89  }