Move the constraint check for number of presets not to exceed the num… (#35167)

* Move the constraint check for number of presets not to exceed the number of presets supported from the atomic write commit command handling to the write request

* Minor fix

* Do not check if totalExpectedCount > 0 since its an unsigned integer

- Also no need to check if numberOfPresetsSupported is 0.

* Update src/app/clusters/thermostat-server/thermostat-server-presets.cpp

* Update src/app/clusters/thermostat-server/thermostat-server-presets.cpp

---------

Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>
diff --git a/src/app/clusters/thermostat-server/thermostat-server-presets.cpp b/src/app/clusters/thermostat-server/thermostat-server-presets.cpp
index e57c2f9..a56c94f 100644
--- a/src/app/clusters/thermostat-server/thermostat-server-presets.cpp
+++ b/src/app/clusters/thermostat-server/thermostat-server-presets.cpp
@@ -402,6 +402,20 @@
         return CHIP_IM_GLOBAL_STATUS(ConstraintError);
     }
 
+    // Before adding this preset to the pending presets, if the expected length of the pending presets' list
+    // exceeds the total number of presets supported, return RESOURCE_EXHAUSTED. Note that the preset has not been appended yet.
+
+    uint8_t numberOfPendingPresets = CountNumberOfPendingPresets(delegate);
+
+    // We will be adding one more preset, so reject if the length is already at max.
+    if (numberOfPendingPresets >= delegate->GetNumberOfPresets())
+    {
+        return CHIP_IM_GLOBAL_STATUS(ResourceExhausted);
+    }
+
+    // TODO #34556 : Check if the number of presets for each presetScenario exceeds the max number of presets supported for that
+    // scenario. We plan to support only one preset for each presetScenario for our use cases so defer this for re-evaluation.
+
     return delegate->AppendToPendingPresetList(preset);
 }
 
@@ -504,25 +518,6 @@
         }
     }
 
-    uint8_t totalCount = CountNumberOfPendingPresets(delegate);
-
-    uint8_t numberOfPresetsSupported = delegate->GetNumberOfPresets();
-
-    if (numberOfPresetsSupported == 0)
-    {
-        ChipLogError(Zcl, "emberAfThermostatClusterCommitPresetsSchedulesRequestCallback: Failed to get NumberOfPresets");
-        return Status::InvalidInState;
-    }
-
-    // If the expected length of the presets attribute with the applied changes exceeds the total number of presets supported,
-    // return RESOURCE_EXHAUSTED. Note that the changes are not yet applied.
-    if (numberOfPresetsSupported > 0 && totalCount > numberOfPresetsSupported)
-    {
-        return Status::ResourceExhausted;
-    }
-
-    // TODO: Check if the number of presets for each presetScenario exceeds the max number of presets supported for that
-    // scenario. We plan to support only one preset for each presetScenario for our use cases so defer this for re-evaluation.
     return Status::Success;
 }