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 }