verifyPin method

Future<VerifyPinResult> verifyPin({
  1. required String userId,
  2. required String pin,
  3. required String businessId,
  4. String population = 'External',
})

Verifies a PIN for authentication purposes.

Not used by the auth manager itself, but available for host app use (e.g. a custom PIN login flow).

Implementation

Future<VerifyPinResult> verifyPin({
  required String userId,
  required String pin,
  required String businessId,
  String population = 'External',
}) async {
  final trace = await monitoringService.createTrace(name: 'verifyPin', operation: 'PIN_VERIFY');

  try {
    _ensureInitialised();

    final response = await client.post(
      url: '$_iamServiceUrl/iam/api/v1/iam/pin/verify',
      requestData: {
        'userId': userId,
        'pin': pin,
        'businessId': businessId,
        'population': population,
      },
      user: _user,
    );

    if (response?.statusCode == 200 && response?.data != null) {
      final data = response!.data as Map<String, dynamic>;
      return VerifyPinResult(
        verified: data['verified'] ?? false,
        hasPin: data['hasPin'] ?? false,
        locked: data['locked'] ?? false,
        remainingAttempts: data['remainingAttempts'] ?? 0,
      );
    }

    if (response?.statusCode == 403 && response?.data != null) {
      final data = response!.data as Map<String, dynamic>;
      return VerifyPinResult(
        verified: data['verified'] ?? false,
        hasPin: data['hasPin'] ?? false,
        locked: data['locked'] ?? false,
        remainingAttempts: data['remainingAttempts'] ?? 0,
      );
    }

    return VerifyPinResult(
      verified: false,
      hasPin: false,
      locked: false,
      remainingAttempts: 0,
    );
  } on AuthException catch (e) {
    logger.error(this, 'AuthException verifying PIN: ${e.message}', error: e);
    return VerifyPinResult(
      verified: false,
      hasPin: false,
      locked: false,
      remainingAttempts: 0,
    );
  } catch (e, s) {
    logger.error(this, 'Error verifying PIN', error: e, stackTrace: s);
    return VerifyPinResult(
      verified: false,
      hasPin: false,
      locked: false,
      remainingAttempts: 0,
    );
  } finally {
    trace.stop();
  }
}