import 'dart:convert'; class AuditLogEntry { final String eventId; final DateTime timestamp; final String userId; final String eventType; final String status; final String authMethod; final String ipAddress; final String userAgent; final String sessionId; final String details; final String source; final String clientId; final String appName; final String parentSessionId; AuditLogEntry({ required this.eventId, required this.timestamp, required this.userId, required this.eventType, required this.status, required this.authMethod, required this.ipAddress, required this.userAgent, required this.sessionId, required this.details, required this.source, required this.clientId, required this.appName, required this.parentSessionId, }); factory AuditLogEntry.fromJson(Map json) { final timestampRaw = json['timestamp']?.toString() ?? ''; DateTime parsedTimestamp; try { parsedTimestamp = DateTime.parse(timestampRaw).toLocal(); } catch (_) { parsedTimestamp = DateTime.now(); } return AuditLogEntry( eventId: json['event_id'] ?? '', timestamp: parsedTimestamp, userId: json['user_id'] ?? '', eventType: json['event_type'] ?? '', status: json['status'] ?? '', authMethod: json['auth_method'] ?? '', ipAddress: json['ip_address'] ?? '', userAgent: json['user_agent'] ?? '', sessionId: json['session_id'] ?? '', details: json['details'] ?? '', source: json['source'] ?? '', clientId: json['client_id'] ?? '', appName: json['app_name'] ?? '', parentSessionId: json['parent_session_id'] ?? '', ); } Map get detailMap { if (details.isEmpty) { return {}; } try { return jsonDecode(details) as Map; } catch (_) { return {}; } } String get path { final detailPath = detailMap['path']?.toString(); if (detailPath != null && detailPath.isNotEmpty) { return detailPath; } final parts = eventType.split(' '); if (parts.length >= 2) { return parts.sublist(1).join(' '); } return '-'; } } class AuditPage { final List items; final String? nextCursor; const AuditPage({required this.items, this.nextCursor}); } class LinkedRp { final String id; final String name; final String logo; final String url; final String status; final List scopes; final DateTime? lastAuthenticatedAt; LinkedRp({ required this.id, required this.name, required this.logo, required this.url, required this.status, required this.scopes, this.lastAuthenticatedAt, }); factory LinkedRp.fromJson(Map json) { DateTime? parsedLastAuth; final rawLastAuth = json['lastAuthenticatedAt']?.toString(); if (rawLastAuth != null && rawLastAuth.isNotEmpty) { try { parsedLastAuth = DateTime.parse(rawLastAuth).toLocal(); } catch (_) { parsedLastAuth = null; } } return LinkedRp( id: json['id']?.toString() ?? '', name: json['name']?.toString() ?? '', logo: json['logo']?.toString() ?? '', url: json['url']?.toString() ?? '', status: json['status']?.toString() ?? '', scopes: (json['scopes'] as List?)?.whereType().toList() ?? [], lastAuthenticatedAt: parsedLastAuth, ); } } class RpHistoryItem { final String clientId; final String clientName; final List scopes; final DateTime? lastApprovedAt; final DateTime? lastRevokedAt; final String status; RpHistoryItem({ required this.clientId, required this.clientName, required this.scopes, this.lastApprovedAt, this.lastRevokedAt, required this.status, }); factory RpHistoryItem.fromJson(Map json) { DateTime? parseDate(String? raw) { if (raw == null || raw.isEmpty) return null; try { return DateTime.parse(raw).toLocal(); } catch (_) { return null; } } return RpHistoryItem( clientId: json['client_id']?.toString() ?? '', clientName: json['client_name']?.toString() ?? '', scopes: (json['scopes'] as List?)?.whereType().toList() ?? [], lastApprovedAt: parseDate(json['last_approved_at']?.toString()), lastRevokedAt: parseDate(json['last_revoked_at']?.toString()), status: json['status']?.toString() ?? 'unknown', ); } }