resolveAuthCallbackRouteDecision function

AuthCallbackRouteDecision resolveAuthCallbackRouteDecision({
  1. required String? providerId,
  2. required AuthProvider? provider,
  3. required Map<String, dynamic> query,
})

Resolves callback branching decisions used by auth route handlers.

Missing or empty providerId returns missing_provider; a null provider returns unknown_provider. OAuth requires a non-empty code and preserves optional state. Magic-link callbacks require a non-empty token and an email, falling back to identifier only when email is null. A CallbackProvider selects the custom branch; other types return unsupported_provider. Query values use toString() and are not trimmed.

Implementation

AuthCallbackRouteDecision resolveAuthCallbackRouteDecision({
  required String? providerId,
  required AuthProvider? provider,
  required Map<String, dynamic> query,
}) {
  if (providerId == null || providerId.isEmpty) {
    return const AuthCallbackRouteDecision.error('missing_provider');
  }

  if (provider == null) {
    return const AuthCallbackRouteDecision.error('unknown_provider');
  }

  if (provider is OAuthProvider) {
    final code = _stringValue(query['code']);
    if (code == null || code.isEmpty) {
      return const AuthCallbackRouteDecision.error('missing_code');
    }
    return AuthCallbackRouteDecision.oauth(
      code: code,
      state: _stringValue(query['state']),
    );
  }

  if (provider is AuthMagicLinkProvider) {
    final token = _stringValue(query['token']);
    final email =
        _stringValue(query['email']) ?? _stringValue(query['identifier']);
    if (token == null || token.isEmpty || email == null || email.isEmpty) {
      return const AuthCallbackRouteDecision.error('missing_token');
    }
    return AuthCallbackRouteDecision.email(token: token, email: email);
  }

  if (provider is CallbackProvider) {
    return const AuthCallbackRouteDecision.custom();
  }

  return const AuthCallbackRouteDecision.error('unsupported_provider');
}