restoreBackupOfMenstrualCycleData method

Future<bool> restoreBackupOfMenstrualCycleData({
  1. bool isDecryptData = true,
  2. required Map<String, dynamic> backupData,
  3. required String customerId,
})

Restore backup of user's data

Implementation

Future<bool> restoreBackupOfMenstrualCycleData(
    {bool isDecryptData = true,
    required Map<String, dynamic> backupData,
    required String customerId}) async {
  if (backupData.isEmpty) return false;

  final dbHelper = MenstrualCycleDbHelper.instance;

  Map<String, dynamic> decryptData = {};
  if (isDecryptData) {
    if (backupData.containsKey("encryptedData")) {
      try {
        decryptData = jsonDecode(
            Encryption.instance.decrypt(backupData["encryptedData"]));
      } catch (e) {
        throw "Error decrypting data: $e";
      }
    } else {
      throw "Encrypted data with 'encryptedData' key is required";
    }
  } else {
    decryptData = backupData;
  }
  // Restore Symptom Logs Data
  List<dynamic> symptomsLogsData = decryptData["allTableData"]
          [MenstrualCycleDbHelper.tableDailyUserSymptomsLogsData] ??
      [];
  final encryption = Encryption.instance;

  if (symptomsLogsData.isNotEmpty) {
    dbHelper.clearSymptomsLog(customerId);
    for (var log in symptomsLogsData) {
      UserSymptomsLogs userSymptomLog = UserSymptomsLogs.fromJson(log);
      String encryptedData =
          encryption.encrypt(json.encode(userSymptomLog.symptomData!));

      Map<String, dynamic> userData = {
        MenstrualCycleDbHelper.columnCustomerId:
            encryption.encrypt(customerId),
        MenstrualCycleDbHelper.columnUserEncryptData: encryptedData,
        MenstrualCycleDbHelper.columnMeditationTime:
            encryption.encrypt(userSymptomLog.meditationTime ?? ""),
        MenstrualCycleDbHelper.columnSleepTime:
            encryption.encrypt(userSymptomLog.sleepTime ?? ""),
        MenstrualCycleDbHelper.columnWater:
            encryption.encrypt(userSymptomLog.waterValue ?? ""),
        MenstrualCycleDbHelper.columnWaterUnit:
            encryption.encrypt(userSymptomLog.waterUnit ?? ""),
        MenstrualCycleDbHelper.columnBodyTemperatureUnit:
            encryption.encrypt(userSymptomLog.bodyTemperatureUnit ?? ""),
        MenstrualCycleDbHelper.columnWeightUnit:
            encryption.encrypt(userSymptomLog.weightUnit ?? ""),
        MenstrualCycleDbHelper.columnNotes:
            encryption.encrypt(userSymptomLog.notes ?? ""),
        MenstrualCycleDbHelper.columnWeight:
            encryption.encrypt(userSymptomLog.weight ?? ""),
        MenstrualCycleDbHelper.columnBodyTemperature:
            encryption.encrypt(userSymptomLog.bodyTemperature ?? ""),
        MenstrualCycleDbHelper.columnLogDate: userSymptomLog.logDate,
        MenstrualCycleDbHelper.columnCycleDay: userSymptomLog.cycleDay,
        MenstrualCycleDbHelper.columnCreatedDateTime:
            userSymptomLog.createdDate,
        MenstrualCycleDbHelper.columnIsCustomLog: userSymptomLog.isCustomLog
      };
      await dbHelper.insertDailyLog(
          userData, userSymptomLog.logDate ?? "", customerId);
    }
  }

  // Restore Period Logs Data
  List<dynamic> periodLogsData = decryptData["allTableData"]
          [MenstrualCycleDbHelper.tableUserPeriodsLogsData] ??
      [];
  if (periodLogsData.isNotEmpty) {
    dbHelper.clearPeriodLog(customerId);
    await dbHelper.insertOrUpdatePeriodLog(periodLogsData);
  }

  // Restore Cycle Length and Period Duration
  int cycleLength = decryptData["cycleLength"] ?? 28;
  int periodDuration = decryptData["periodDuration"] ?? 5;

  // Update cycle and period details
  await dbHelper.insertCurrentUserDetails(
      cycleLength: cycleLength,
      periodDuration: periodDuration,
      customerId: customerId);

  return false;
}