syncEngagements method

Future<void> syncEngagements()

Implementation

Future<void> syncEngagements() async {

  var files = await AppticsDataStore.getEngagementFilesByLastModifiedDate();
  var syncCounter = 0;

  if (files == null) {
    return;
  }

  final filesIt = files.iterator;
  while(filesIt.moveNext() && syncCounter < 3) {
    Map<String, dynamic> rawEngagements = jsonDecode(await filesIt.current.readAsString());

    var failCounter = 0;
    if (rawEngagements.containsKey("failCounter")) {
      failCounter = rawEngagements["failCounter"];
      if (failCounter >= 3) {
        await AppticsDataStore.deleteFile(filesIt.current);
        continue;
      }
      rawEngagements.remove("failCounter");
    }

    if (rawEngagements.containsKey("session") && !rawEngagements.containsKey("meta")) {
      rawEngagements.remove("session");
      final syncedDevice = await AppticsDeviceRegistrar().syncDevice();
      final configs = await AppticsConfigs.getValidConfigs();
      if (syncedDevice != null && configs != null) {
        rawEngagements["meta"] = syncedDevice.getDeviceMeta(configs);
      }
    }

    if (!rawEngagements.containsKey("meta")) {
      continue;
    }

    final session = rawEngagements["session"];
    rawEngagements.remove("session");

    String? uid;
    if (rawEngagements.containsKey("uid")) {
      uid = rawEngagements["uid"];
      rawEngagements.remove("uid");
    }

    var response = await AppticsNetwork.callWithDeviceToken(userId: uid, httpCall: (AppticsConfigs validConfigs, String token, AppticsDeviceInfo deviceInfo, String? userId) {

        var body = AppticsUtils.gzippedPayload(jsonEncode(rawEngagements), validConfigs.apikey);

        if (userId == null) {
          return AppticsService.syncEngagements(
            token: token,
            baseUrl: validConfigs.baseurl,
            mapId: validConfigs.mapid.toString(),
            apId: validConfigs.apid.toString(),
            portalId: validConfigs.portalId.toString(),
            projectId: validConfigs.projectId.toString(),
            appVersionId: validConfigs.appVersionId.toString(),
            frameworkId: Apptics.frameworkId,
            anonDeviceId: deviceInfo.anonymousId,
            body: body
          );
        } else {
          return AppticsService.syncEngagements(
            token: token,
            baseUrl: validConfigs.baseurl,
            mapId: validConfigs.mapid.toString(),
            apId: validConfigs.apid.toString(),
            portalId: validConfigs.portalId.toString(),
            projectId: validConfigs.projectId.toString(),
            appVersionId: validConfigs.appVersionId.toString(),
            frameworkId: Apptics.frameworkId,
            deviceId: deviceInfo.deviceId,
            userId: userId,
            body: body
          );
        }


      });

      if (response != null && response.isSuccess) {
        await AppticsDataStore.deleteFile(filesIt.current);
      } else if (response != null && !response.isSuccess) {
        rawEngagements["failCounter"] = failCounter + 1;
        AppticsDataStore.writeToFile(filesIt.current, jsonEncode(rawEngagements));
      }
    syncCounter++;
  }
}