sendRemoteDtoToServer method

Future<EntryReceivedDto?> sendRemoteDtoToServer(
  1. RemoteDto remoteDto,
  2. int version, {
  3. String? serverDatabase,
  4. String? testPassword,
})

Implementation

Future<EntryReceivedDto?> sendRemoteDtoToServer(RemoteDto remoteDto,
    int version, {String? serverDatabase, String? testPassword}) async {
  if (!initialized) throw ArgumentError(AbstractDao.C_MUST_INIT);
  Map<String, String> params = Map();
  Map<String, dynamic> tableData;
  EntryReceivedDto? entryReceivedDto;
  try {
    tableData = JsonRemoteDtoTools.getJsonObjectFromRemoteDto(remoteDto, defaults);
    // Now send one record at a time
    UserStoreDto? userStoreDto = await userTools.getCurrentUserStoreDto(smd, transaction);
    UserDto? userDto = await userTools.getCurrentUserDto(smd, transaction);
    signedRequestHelper = SignedRequestHelper2(
        userStoreDto!.email!,
        userDto!.pass_key!);
    params["ts"] = TimeUtils.getNowCustomTs().toString();
    params["version"] = version.toString();

    if (serverDatabase != null) params["database"] = serverDatabase;
    if (testPassword != null) params["test_pass"] = testPassword;
    params["user_id"] =
        (await userTools.getCurrentUserId(smd, transaction)).toString();

    String jsonResponseString;
    try {
      jsonResponseString = await writeClient.postBaseURI(jsonEncode(tableData),
          UrlTools.C_NEW_ROW_POST_URL, signedRequestHelper.sign(params));
    } on TransmitStatusException catch (e) {
      print("WS $e");
      throw TransmitStatusException(
          e.transmitStatus, cause: e.cause, sourceName: "Send Rows");
    }
    late RemoteDto returnedRemoteDto;
    try {
      returnedRemoteDto =
          JsonRemoteDtoTools.getRemoteDtoFromJsonString(jsonResponseString, smdSys, defaults);
      if (returnedRemoteDto.water_table_name == "remote_state") {
        RemoteStatusDto remoteState = returnedRemoteDto as RemoteStatusDto;
        print("State=$remoteState");
        throw TransmitStatusException(
            null, remoteStatus: remoteState.status,
            cause: remoteState.message,
            sourceName: "Send Rows");
      }
    } on RemoteStatusException catch (e) {
      WaterLineDao waterLineDao = WaterLineDao.sep(smdSys, transaction);
      await waterLineDao.init();
      switch (e.remoteStatus) {
        case RemoteStatus.DUPLICATE_ENTRY:
          try {
            await waterLineDao.updateWaterLine(
                remoteDto.waterLineDto!.water_ts!, null, WaterState.CLIENT_SENT,
                WaterError.NONE);
          } on SqlException catch (e) {
            throw TransmitStatusException(
                null, remoteStatus: RemoteStatus.DUPLICATE_ENTRY,
                cause: e.cause,
                sourceName: "Send Rows");
          }
          break;
        default:
          throw TransmitStatusException(
              null, remoteStatus: e.remoteStatus,
              cause: e.cause,
              sourceName: "Send Rows");
      }
    }
    if (returnedRemoteDto.water_table_name == "entry_received") {
      entryReceivedDto = returnedRemoteDto as EntryReceivedDto;
    } else {
      throw TransmitStatusException(
          null, cause: "Unknown remoteDto $returnedRemoteDto");
    }
    await updateOriginalRecordsFromEntryReceivedDto(entryReceivedDto);
    sleep(const Duration(seconds: 2));
  } on ArgumentError catch (e) {
    print("WS $e");
  }
  return entryReceivedDto;
}