setStreakInvalid method

Future<void> setStreakInvalid(
  1. String userEmail
)

Sets the user's streak to inactive if they failed to meet the exercise requirement (less than 5 minutes) yesterday.

Implementation

Future<void> setStreakInvalid(String userEmail) async {
  final yesterday = DateTime.now().subtract(const Duration(days: 1));
  final todayStart = DateTime.now().subtract(Duration(
    hours: DateTime.now().hour,
    minutes: DateTime.now().minute,
    seconds: DateTime.now().second,
    milliseconds: DateTime.now().millisecond,
    microseconds: DateTime.now().microsecond,
  ));
  if (await getDoneExercisesInSeconds(userEmail, day: yesterday) < 300) {
    final userRef = await _getUserDocRef(userEmail);
    final streaks = await userRef
        .collection('streaks')
        .where('isActive', isEqualTo: true)
        .limit(1)
        .get();
    if (streaks.docs.isNotEmpty) {
      final docRef = streaks.docs.first;
      final startedAt = (docRef['startedAt'] as Timestamp).toDate();

      final exercises = await userRef
          .collection('exerciseLogs')
          .orderBy('startTime', descending: true)
          .get();

      DateTime failedAtTime = todayStart;

      if (exercises.docs.isNotEmpty) {
        final exerciseDoc = exercises.docs.first;
        final exerciseTime = (exerciseDoc['startTime'] as Timestamp).toDate();

        failedAtTime = DateTime(exerciseTime.year, exerciseTime.month,
            exerciseTime.day, 23, 59, 59);
      }

      if (startedAt.isBefore(todayStart)) {
        await docRef.reference.update({
          'isActive': false,
          'failedAt': Timestamp.fromDate(failedAtTime),
        });
      }
    }
  }
}