increment method

FirestoreDynamicDocumentModel increment(
  1. String key,
  2. num value, {
  3. List<CounterUpdaterInterval> intervals = const [],
})

The value of key can be increased (or decreased by minus) by value.

It is possible to increase within a period of time with intervals.

When creating monthly rankings, etc., specify intervals.

Execute save to apply the changes.

Implementation

FirestoreDynamicDocumentModel increment(
  String key,
  num value, {
  List<CounterUpdaterInterval> intervals = const [],
}) {
  this[key] = FieldValue.increment(value);
  if (intervals.isEmpty) {
    return this;
  }
  final now = DateTime.now();
  for (final interval in intervals) {
    switch (interval) {
      case CounterUpdaterInterval.daily:
        this[dailyKey(key, now)] = FieldValue.increment(value);
        for (var i = 0; i < 30; i++) {
          this[dailyKey(
            key,
            DateTime(now.year, now.month, now.day - 60 + i),
          )] = FieldValue.delete();
        }
        break;
      case CounterUpdaterInterval.monthly:
        this[monthlyKey(key, now)] = FieldValue.increment(value);
        for (var i = 0; i < 12; i++) {
          this[monthlyKey(
            key,
            DateTime(now.year, now.month - 24 + i),
          )] = FieldValue.delete();
        }
        break;
      case CounterUpdaterInterval.yearly:
        this[yearlyKey(key, now)] = FieldValue.increment(value);
        for (var i = 0; i < 5; i++) {
          this[yearlyKey(key, DateTime(now.year, now.month - 10 + i))] =
              FieldValue.delete();
        }
        break;
      case CounterUpdaterInterval.weekly:
        this[weeklyKey(key, now)] = FieldValue.increment(value);
        for (var i = 0; i < 4; i++) {
          this[weeklyKey(
            key,
            DateTime(now.year, now.month, now.day - ((8 - i) * 7)),
          )] = FieldValue.delete();
        }
        break;
    }
  }
  return this;
}