MCPcopy Create free account
hub / github.com/daodst/chat / PutPushRuleByRuleID

Function PutPushRuleByRuleID

clientapi/routing/pushrules.go:101–161  ·  view source on GitHub ↗
(ctx context.Context, scope, kind, ruleID, afterRuleID, beforeRuleID string, body io.Reader, device *userapi.Device, userAPI userapi.ClientUserAPI)

Source from the content-addressed store, hash-verified

99}
100
101func PutPushRuleByRuleID(ctx context.Context, scope, kind, ruleID, afterRuleID, beforeRuleID string, body io.Reader, device *userapi.Device, userAPI userapi.ClientUserAPI) util.JSONResponse {
102 var newRule pushrules.Rule
103 if err := json.NewDecoder(body).Decode(&newRule); err != nil {
104 return errorResponse(ctx, err, "JSON Decode failed")
105 }
106 newRule.RuleID = ruleID
107
108 errs := pushrules.ValidateRule(pushrules.Kind(kind), &newRule)
109 if len(errs) > 0 {
110 return errorResponse(ctx, jsonerror.InvalidArgumentValue(errs[0].Error()), "rule sanity check failed: %v", errs)
111 }
112
113 ruleSets, err := queryPushRules(ctx, device.UserID, userAPI)
114 if err != nil {
115 return errorResponse(ctx, err, "queryPushRules failed")
116 }
117 ruleSet := pushRuleSetByScope(ruleSets, pushrules.Scope(scope))
118 if ruleSet == nil {
119 return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rule set"), "pushRuleSetByScope failed")
120 }
121 rulesPtr := pushRuleSetKindPointer(ruleSet, pushrules.Kind(kind))
122 if rulesPtr == nil {
123 return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rules kind"), "pushRuleSetKindPointer failed")
124 }
125 i := pushRuleIndexByID(*rulesPtr, ruleID)
126 if i >= 0 && afterRuleID == "" && beforeRuleID == "" {
127 // Modify rule at the same index.
128
129 // TODO: The spec does not say what to do in this case, but
130 // this feels reasonable.
131 *((*rulesPtr)[i]) = newRule
132 util.GetLogger(ctx).Infof("Modified existing push rule at %d", i)
133 } else {
134 if i >= 0 {
135 // Delete old rule.
136 *rulesPtr = append((*rulesPtr)[:i], (*rulesPtr)[i+1:]...)
137 util.GetLogger(ctx).Infof("Deleted old push rule at %d", i)
138 } else {
139 // SPEC: When creating push rules, they MUST be enabled by default.
140
141 // TODO: it's unclear if we must reject disabled rules, or force
142 // the value to true. Sytests fail if we don't force it.
143 newRule.Enabled = true
144 }
145
146 // Add new rule.
147 i, err := findPushRuleInsertionIndex(*rulesPtr, afterRuleID, beforeRuleID)
148 if err != nil {
149 return errorResponse(ctx, err, "findPushRuleInsertionIndex failed")
150 }
151
152 *rulesPtr = append((*rulesPtr)[:i], append([]*pushrules.Rule{&newRule}, (*rulesPtr)[i:]...)...)
153 util.GetLogger(ctx).WithField("after", afterRuleID).WithField("before", beforeRuleID).Infof("Added new push rule at %d", i)
154 }
155
156 if err := putPushRules(ctx, device.UserID, ruleSets, userAPI); err != nil {
157 return errorResponse(ctx, err, "putPushRules failed")
158 }

Callers 1

SetupFunction · 0.85

Calls 9

errorResponseFunction · 0.85
queryPushRulesFunction · 0.85
pushRuleSetByScopeFunction · 0.85
pushRuleSetKindPointerFunction · 0.85
pushRuleIndexByIDFunction · 0.85
putPushRulesFunction · 0.85
InfofMethod · 0.80
ErrorMethod · 0.45

Tested by

no test coverage detected