login method

Future<void> login({
  1. int? accountId,
  2. String? loginUrl,
  3. bool withoutData = false,
})

Selects an account, prepares HTTP, and authenticates with SPH.

For EasyLanisClient.ephemeral, accountId is optional.

Implementation

Future<void> login({
  int? accountId,
  String? loginUrl,
  bool withoutData = false,
}) async {
  _ensureNotDisposed();

  final ClearTextAccount account;
  if (_ephemeral) {
    if (_ephemeralAccount == null) {
      throw ConfigurationException('Ephemeral account not configured');
    }
    account = _ephemeralAccount!;
  } else {
    if (accountId == null) {
      throw ConfigurationException('accountId is required');
    }
    final loaded = await _db.getAccount(accountId);
    if (loaded == null) {
      throw UnknownException('Account $accountId not found');
    }
    account = loaded;
  }

  final previousId = _activeAccount?.localId;
  if (previousId != null && previousId != account.localId) {
    await _clearSession(skipDeauthenticate: false);
  } else if (previousId == account.localId && _session != null) {
    await _clearSession(skipDeauthenticate: false);
  }

  _activeAccount = account;
  _session = LanisSession(
    account: account,
    config: _config,
    connectionChecker: _connection,
  );
  await _session!.prepareDio();
  _rebuildParsers();
  _storageManager = null;

  await _session!.authenticate(
    withLoginUrl: loginUrl,
    withoutData: withoutData,
  );

  if (!_ephemeral) {
    await _db.updateLastLogin(account.localId);
    if (account.accountType == null) {
      final detectedType = _session!.accountTypeOrNull;
      if (detectedType != null) {
        await _db.setAccountType(account.localId, detectedType);
        final updated = await _db.getAccount(account.localId);
        if (updated != null) {
          _activeAccount = updated;
          _rebuildParsers();
        }
      }
    }
  } else if (_activeAccount!.accountType == null) {
    final detected = _session!.accountTypeOrNull;
    if (detected != null) {
      _activeAccount = _activeAccount!.copyWith(accountType: detected);
      _rebuildParsers();
    }
  }

  _authenticated = true;
}