validateOAuthConfig static method

ValidationResult validateOAuthConfig(
  1. OAuthConfig config
)

Validates a complete OAuth2 configuration

Implementation

static ValidationResult validateOAuthConfig(OAuthConfig config) {
  final allIssues = <String>[];
  final suggestions = <String>[];

  // Validate base URL
  final baseUrlIssues = UrlBuilder.validateBaseUrl(config.baseUrl);
  allIssues.addAll(baseUrlIssues);
  if (baseUrlIssues.isNotEmpty) {
    suggestions.add('Ensure base URL is in format: https://your-site.frappe.cloud');
  }

  // Validate client ID
  final clientIdIssues = UrlBuilder.validateClientId(config.clientId);
  allIssues.addAll(clientIdIssues);
  if (clientIdIssues.isNotEmpty) {
    suggestions.add('Check your Frappe OAuth2 client configuration');
  }

  // Validate redirect scheme
  final schemeIssues = UrlBuilder.validateRedirectScheme(config.redirectScheme);
  allIssues.addAll(schemeIssues);
  if (schemeIssues.isNotEmpty) {
    suggestions.add('Use a unique app identifier as redirect scheme (e.g., "myapp")');
  }

  // Validate scopes
  final scopeIssues = UrlBuilder.validateScopes(config.scopes);
  allIssues.addAll(scopeIssues);
  if (scopeIssues.isNotEmpty) {
    suggestions.add('Use valid Frappe scopes like "all", "openid", "profile"');
  }

  // Validate redirect URI
  final redirectUriIssues = UrlBuilder.validateRedirectUri(config.redirectUri);
  allIssues.addAll(redirectUriIssues);

  // Validate timeouts
  if (config.tokenRefreshThreshold.isNegative) {
    allIssues.add('Token refresh threshold cannot be negative');
    suggestions.add('Set token refresh threshold to at least 1 minute');
  }

  if (config.networkTimeout.inSeconds < 1) {
    allIssues.add('Network timeout must be at least 1 second');
    suggestions.add('Set network timeout to at least 10 seconds');
  }

  // Validate custom endpoints if provided
  if (config.customAuthorizationEndpoint != null) {
    final authEndpointIssues = _validateUrl(config.customAuthorizationEndpoint!);
    allIssues.addAll(authEndpointIssues.map((issue) => 'Authorization endpoint: $issue'));
  }

  if (config.customTokenEndpoint != null) {
    final tokenEndpointIssues = _validateUrl(config.customTokenEndpoint!);
    allIssues.addAll(tokenEndpointIssues.map((issue) => 'Token endpoint: $issue'));
  }

  if (config.customUserInfoEndpoint != null) {
    final userInfoEndpointIssues = _validateUrl(config.customUserInfoEndpoint!);
    allIssues.addAll(userInfoEndpointIssues.map((issue) => 'User info endpoint: $issue'));
  }

  if (allIssues.isEmpty) {
    return ValidationResult.success(
      context: {
        'configType': 'oauth2',
        'validatedAt': DateTime.now().toIso8601String(),
      },
    );
  }

  return ValidationResult.failure(
    issues: allIssues,
    suggestions: suggestions,
    context: {
      'configType': 'oauth2',
      'validatedAt': DateTime.now().toIso8601String(),
      'issueCount': allIssues.length,
    },
  );
}