(ctx context.Context, scope, kind, ruleID, attr string, body io.Reader, device *userapi.Device, userAPI userapi.ClientUserAPI)
| 217 | } |
| 218 | |
| 219 | func PutPushRuleAttrByRuleID(ctx context.Context, scope, kind, ruleID, attr string, body io.Reader, device *userapi.Device, userAPI userapi.ClientUserAPI) util.JSONResponse { |
| 220 | var newPartialRule pushrules.Rule |
| 221 | if err := json.NewDecoder(body).Decode(&newPartialRule); err != nil { |
| 222 | return util.JSONResponse{ |
| 223 | Code: http.StatusBadRequest, |
| 224 | JSON: jsonerror.BadJSON(err.Error()), |
| 225 | } |
| 226 | } |
| 227 | if newPartialRule.Actions == nil { |
| 228 | // This ensures json.Marshal encodes the empty list as [] rather than null. |
| 229 | newPartialRule.Actions = []*pushrules.Action{} |
| 230 | } |
| 231 | |
| 232 | attrGet, err := pushRuleAttrGetter(attr) |
| 233 | if err != nil { |
| 234 | return errorResponse(ctx, err, "pushRuleAttrGetter failed") |
| 235 | } |
| 236 | attrSet, err := pushRuleAttrSetter(attr) |
| 237 | if err != nil { |
| 238 | return errorResponse(ctx, err, "pushRuleAttrSetter failed") |
| 239 | } |
| 240 | |
| 241 | ruleSets, err := queryPushRules(ctx, device.UserID, userAPI) |
| 242 | if err != nil { |
| 243 | return errorResponse(ctx, err, "queryPushRules failed") |
| 244 | } |
| 245 | ruleSet := pushRuleSetByScope(ruleSets, pushrules.Scope(scope)) |
| 246 | if ruleSet == nil { |
| 247 | return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rule set"), "pushRuleSetByScope failed") |
| 248 | } |
| 249 | rulesPtr := pushRuleSetKindPointer(ruleSet, pushrules.Kind(kind)) |
| 250 | if rulesPtr == nil { |
| 251 | return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rules kind"), "pushRuleSetKindPointer failed") |
| 252 | } |
| 253 | i := pushRuleIndexByID(*rulesPtr, ruleID) |
| 254 | if i < 0 { |
| 255 | return errorResponse(ctx, jsonerror.NotFound("push rule ID not found"), "pushRuleIndexByID failed") |
| 256 | } |
| 257 | |
| 258 | if !reflect.DeepEqual(attrGet((*rulesPtr)[i]), attrGet(&newPartialRule)) { |
| 259 | attrSet((*rulesPtr)[i], &newPartialRule) |
| 260 | |
| 261 | if err := putPushRules(ctx, device.UserID, ruleSets, userAPI); err != nil { |
| 262 | return errorResponse(ctx, err, "putPushRules failed") |
| 263 | } |
| 264 | } |
| 265 | |
| 266 | return util.JSONResponse{Code: http.StatusOK, JSON: struct{}{}} |
| 267 | } |
| 268 | |
| 269 | func queryPushRules(ctx context.Context, userID string, userAPI userapi.ClientUserAPI) (*pushrules.AccountRuleSets, error) { |
| 270 | var res userapi.QueryPushRulesResponse |
no test coverage detected