logoutExtension method

Future<String> logoutExtension({
  1. required SipInfoData sipInfoData,
  2. required PushNotifParams pushNotifParams,
})

Implementation

Future<String> logoutExtension({
  required SipInfoData sipInfoData,
  required PushNotifParams pushNotifParams,
}) async {
  final deviceTokenRes = await PushVoipNotif.getDeviceToken();
  final fcmToken = await PushVoipNotif.getFCMToken();

  final pnPushParams = PnPushParams(
    pnProvider: Platform.isAndroid ? 'fcm' : 'apns',
    pnParam: Platform.isAndroid
        ? pushNotifParams.bundleId
        : '${pushNotifParams.teamId}.${pushNotifParams.bundleId}.voip',
    pnPrid: deviceTokenRes,
    fcmToken: fcmToken,
  );

  await deleteExtRegisterAor(
    sipInfoData: sipInfoData,
    pnPushParams: pnPushParams,
  );

  await removeDeviceToken(
    deviceToken: deviceTokenRes,
    domain: sipInfoData.registerServer,
    extension: sipInfoData.accountName.toString(),
  );

  final String authString = base64Encode(utf8.encode(
      '${sipInfoData.userName}@${sipInfoData.registerServer}:${sipInfoData.authPass}'));
  final String authorization = 'Basic $authString';

  // Check how many devices are currently online for this extension.
  // Only call logoutPbx if this is the last remaining device (total_device_online == 1),
  // to avoid logging out other active sessions on different devices.
  final checkRes = await checkDeviceOnline(
    domain: sipInfoData.registerServer,
    extension: sipInfoData.accountName.toString(),
  );
  final totalDeviceOnline = checkRes?.data.totalDeviceOnline ?? 1;
  if (totalDeviceOnline <= 1) {
    await logoutPbx(
      extension: sipInfoData.accountName.toString(),
      authorization: authorization,
      apiUrl: sipInfoData.apiUrl,
      unregisterPbx: true,
    );
  } else {
    _logger.info(
      'Skip logoutPbx: extension ${sipInfoData.accountName} still has $totalDeviceOnline devices online.',
    );
  }

  return 'UNREGISTER';
}