F14: Admin Dashboard Flow (Super-Admin) - Feature Analysis

1. Overview

The Admin Dashboard Flow provides super-administrators with a comprehensive interface to manage all aspects of the Futr Connect platform. This feature enables authorized users to manage users, companies, and content approval workflows from a centralized dashboard. The Admin Dashboard is crucial for maintaining platform integrity, ensuring content quality, and managing user permissions. Only users with the Super-Admin role can access this restricted area of the platform.

2. User Stories

  • As an admin, I want to manage user accounts so I can enforce platform policies
  • As an admin, I want to approve, reject, or suspend company registrations to maintain platform quality
  • As an admin, I want to review and moderate content posted across the platform
  • As an admin, I want to configure global platform settings to control system behavior
  • As an admin, I want to view analytics and reports to monitor platform health
  • As an admin, I want to manage feature flags to control feature rollouts
  • As an admin, I want to view an audit log of administrative actions for accountability
  • As an admin, I want to send system-wide notifications to all users

3. Entry Points

  • Admin Portal URL: /admin (protected route)
  • Special Login: Admin-specific login page with heightened security
  • User Profile Menu: Admin option only visible to Super-Admin role users

4. Access Control

  • Super-Admin Role: Exclusive access to all administrative functions including user management, company approvals, and content moderation
  • Permission Enforcement: Role-based access is enforced through Firebase Auth validation with admin-level claims
  • Access Restrictions: Regular users attempting to access admin routes are redirected to the home page with appropriate error messages
  • Admin Roles Hierarchy:
  • Super-Admin: Full access to all admin functions
  • Content Moderator: Limited to content approval workflows
  • Support Manager: Access to help and support features only

5. API Endpoints

5.1 Authentication and Authorization

5. API Endpoints

5.1 Authentication and Authorization

POST /administrator/login/

5.2 User Management API

5.2.1 List All Users

GET /administrator/admin-user/

5.2.2 Get User Details

GET /administrator/admin-user/{userId}/

5.2.3 Update User

PATCH /administrator/admin-user/{userId}/

5.2.4 Delete User

DELETE /administrator/admin-user/{userId}/

5.3 Company Management API

5.3.1 List All Companies

GET /administrator/admin-company/

5.3.2 Get Company Details

GET /administrator/admin-company/{companyId}/

5.3.3 Update Company

PATCH /administrator/admin-company/{companyId}/

5.3.4 Delete Company

DELETE /administrator/admin-company/{companyId}/

5.4 Content Moderation API

5.4.1 List Content for Moderation

GET /administrator/admin-newsfeed/
GET /administrator/admin-podcasts/
GET /administrator/admin-company-insights-content/

5.4.2 Get Content Details

GET /administrator/admin-newsfeed/{contentId}/
GET /administrator/admin-podcasts/{contentId}/
GET /administrator/admin-company-insights-content/{contentId}/

5.4.3 Update Content Moderation Status

PATCH /administrator/admin-newsfeed/{contentId}/
PATCH /administrator/admin-podcasts/{contentId}/
PATCH /administrator/admin-company-insights-content/{contentId}/

5.5 System Settings API

5.5.1 Get System Settings

GET /administrator/admin-globals/

5.5.2 Update System Settings

PATCH /administrator/admin-globals/{settingId}/

5.6 Analytics and Reporting API

5.6.1 Get Platform Analytics

GET /administrator/dashboard/
GET /administrator/user-graph/
GET /administrator/company-graph/

5.7 System Notifications API

5.7.1 Send System Notification

POST /administrator/admin-notification-messages/

Description: Authenticates an admin user with enhanced security measures
Request Body:

{
  "email": "admin@futrconnect.com",
  "password": "secure-password",
  "mfaCode": "123456"  // Required for admin login
}

Response:

{
  "success": true,
  "token": "admin-firebase-id-token",
  "user": {
    "id": "admin-uuid",
    "name": "Admin User",
    "email": "admin@futrconnect.com",
    "role": "super-admin",
    "last_login": "2025-05-18T08:30:00Z"
  }
}

5.2 User Management API

5.2.1 List All Users

GET /api/admin/users

Description: Retrieves a paginated list of users with filtering options
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Query Parameters:

page: Number (default: 1)
limit: Number (default: 20)
search: String (optional)
role: String (optional)
status: String (optional)

Response:

{
  "data": [
    {
      "id": "user-uuid-1",
      "name": "John Doe",
      "email": "john.doe@example.com",
      "role": "user",
      "company_association": {
        "company_id": "company-uuid-1",
        "role": "owner",
        "company_name": "AI Solutions Inc"
      },
      "status": "active",
      "created_at": "2025-01-15T10:30:00Z",
      "last_login": "2025-05-16T14:20:00Z"
    },
    {
      "id": "user-uuid-2",
      "name": "Jane Smith",
      "email": "jane.smith@example.com",
      "role": "company-admin",
      "company_association": {
        "company_id": "company-uuid-2",
        "role": "admin",
        "company_name": "Tech Innovators"
      },
      "status": "active",
      "created_at": "2025-02-10T09:15:00Z",
      "last_login": "2025-05-17T11:45:00Z"
    }
  ],
  "pagination": {
    "total": 243,
    "page": 1,
    "limit": 20,
    "pages": 13
  }
}

5.2.2 Get User Details

GET /api/admin/users/{userId}

Description: Retrieves detailed information about a specific user
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Response:

{
  "id": "user-uuid-1",
  "name": "John Doe",
  "email": "john.doe@example.com",
  "phone": "+1234567890",
  "role": "user",
  "status": "active",
  "company_associations": [
    {
      "company_id": "company-uuid-1",
      "role": "owner",
      "company_name": "AI Solutions Inc",
      "joined_at": "2025-01-15T10:35:00Z"
    }
  ],
  "created_at": "2025-01-15T10:30:00Z",
  "last_login": "2025-05-16T14:20:00Z",
  "login_history": [
    {
      "timestamp": "2025-05-16T14:20:00Z",
      "ip_address": "192.168.1.1",
      "device": "Chrome on macOS"
    },
    {
      "timestamp": "2025-05-14T09:10:00Z",
      "ip_address": "192.168.1.1",
      "device": "Safari on iOS"
    }
  ],
  "account_activities": [
    {
      "action": "profile_update",
      "timestamp": "2025-05-10T11:20:00Z",
      "details": "Updated profile picture and name"
    }
  ],
  "subscription": {
    "plan": "premium",
    "status": "active",
    "started_at": "2025-03-01T00:00:00Z",
    "next_billing": "2025-06-01T00:00:00Z"
  }
}

5.2.3 Update User Status

PATCH /api/admin/users/{userId}/status

Description: Updates a user’s status (active, suspended, banned)
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true
Content-Type: application/json

Request Body:

{
  "status": "suspended",
  "reason": "Violation of platform terms of service",
  "duration": 7  // Days, optional (for temporary suspensions)
}

Response:

{
  "success": true,
  "user": {
    "id": "user-uuid-1",
    "email": "john.doe@example.com",
    "status": "suspended",
    "suspension_details": {
      "reason": "Violation of platform terms of service",
      "suspended_at": "2025-05-19T10:30:00Z",
      "suspended_until": "2025-05-26T10:30:00Z",
      "suspended_by": "admin-uuid"
    }
  },
  "message": "User suspended successfully"
}

5.2.4 Modify User Role

PATCH /api/admin/users/{userId}/role

Description: Updates a user’s role in the system
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true
Content-Type: application/json

Request Body:

{
  "role": "company-admin",
  "reason": "User promoted to company administrator"
}

Response:

{
  "success": true,
  "user": {
    "id": "user-uuid-1",
    "email": "john.doe@example.com",
    "role": "company-admin",
    "previous_role": "user"
  },
  "message": "User role updated successfully"
}

5.3 Company Management API

5.3.1 List All Companies

GET /api/admin/companies

Description: Retrieves a paginated list of companies with filtering options
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Query Parameters:

page: Number (default: 1)
limit: Number (default: 20)
search: String (optional)
status: String (optional, e.g., "pending", "approved", "rejected")
industry: String (optional)

Response:

{
  "data": [
    {
      "id": "company-uuid-1",
      "name": "AI Solutions Inc",
      "industry": "Technology",
      "status": "approved",
      "owner": {
        "id": "user-uuid-1",
        "name": "John Doe",
        "email": "john.doe@example.com"
      },
      "created_at": "2025-01-15T10:30:00Z",
      "employees_count": 5,
      "subscription_tier": "premium"
    },
    {
      "id": "company-uuid-2",
      "name": "Tech Innovators",
      "industry": "Software Development",
      "status": "pending",
      "owner": {
        "id": "user-uuid-4",
        "name": "Emily Johnson",
        "email": "emily@techinnovators.com"
      },
      "created_at": "2025-05-12T08:45:00Z",
      "employees_count": 0,
      "subscription_tier": "free"
    }
  ],
  "pagination": {
    "total": 78,
    "page": 1,
    "limit": 20,
    "pages": 4
  }
}

5.3.2 Get Company Details

GET /api/admin/companies/{companyId}

Description: Retrieves detailed information about a specific company
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Response:

{
  "id": "company-uuid-1",
  "name": "AI Solutions Inc",
  "description": "Providing cutting-edge AI solutions for businesses",
  "logo_url": "https://storage.futrconnect.com/companies/logos/ai-solutions.png",
  "industry": "Technology",
  "status": "approved",
  "status_history": [
    {
      "status": "pending",
      "timestamp": "2025-01-15T10:30:00Z",
      "by": null
    },
    {
      "status": "approved",
      "timestamp": "2025-01-16T14:20:00Z",
      "by": "admin-uuid-1",
      "comments": "All documentation verified"
    }
  ],
  "location": {
    "address": "123 Tech Street",
    "city": "San Francisco",
    "state": "CA",
    "country": "USA",
    "zip": "94105"
  },
  "contact": {
    "email": "contact@aisolutions.com",
    "phone": "+1234567890",
    "website": "https://aisolutions.com"
  },
  "legal_info": {
    "registration_number": "AI12345",
    "tax_id": "TAX987654321",
    "incorporation_date": "2020-06-10"
  },
  "owner": {
    "id": "user-uuid-1",
    "name": "John Doe",
    "email": "john.doe@example.com"
  },
  "members": [
    {
      "id": "user-uuid-1",
      "name": "John Doe",
      "email": "john.doe@example.com",
      "role": "owner",
      "joined_at": "2025-01-15T10:35:00Z"
    },
    {
      "id": "user-uuid-3",
      "name": "Robert Chen",
      "email": "robert.chen@example.com",
      "role": "member",
      "joined_at": "2025-02-05T09:15:00Z"
    }
  ],
  "subscription": {
    "plan": "premium",
    "status": "active",
    "started_at": "2025-03-01T00:00:00Z",
    "next_billing": "2025-06-01T00:00:00Z"
  },
  "created_at": "2025-01-15T10:30:00Z",
  "last_activity": "2025-05-18T15:40:00Z"
}

5.3.3 Update Company Status

PATCH /api/admin/companies/{companyId}/status

Description: Updates a company’s approval status
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true
Content-Type: application/json

Request Body:

{
  "status": "approved",
  "comments": "All verification criteria met, approved for platform access",
  "notify_owner": true
}

Response:

{
  "success": true,
  "company": {
    "id": "company-uuid-2",
    "name": "Tech Innovators",
    "status": "approved",
    "previous_status": "pending"
  },
  "notification_sent": true,
  "message": "Company status updated successfully"
}

5.4 Content Moderation API

5.4.1 List Content for Moderation

GET /api/admin/moderation/content

Description: Retrieves content items that require moderation
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Query Parameters:

page: Number (default: 1)
limit: Number (default: 20)
status: String (optional, e.g., "pending", "approved", "rejected")
content_type: String (optional, e.g., "post", "comment", "profile")
reported: Boolean (optional)

Response:

{
  "data": [
    {
      "id": "content-uuid-1",
      "type": "post",
      "status": "pending",
      "title": "New AI Innovation",
      "excerpt": "This groundbreaking AI technology allows...",
      "author": {
        "id": "user-uuid-2",
        "name": "Jane Smith",
        "company": "Tech Innovators"
      },
      "created_at": "2025-05-18T10:30:00Z",
      "reports_count": 0,
      "priority": "normal"
    },
    {
      "id": "content-uuid-2",
      "type": "comment",
      "status": "pending",
      "excerpt": "This is completely inappropriate content...",
      "author": {
        "id": "user-uuid-5",
        "name": "Anonymous User",
        "company": null
      },
      "created_at": "2025-05-18T14:20:00Z",
      "reports_count": 3,
      "priority": "high"
    }
  ],
  "pagination": {
    "total": 35,
    "page": 1,
    "limit": 20,
    "pages": 2
  }
}

5.4.2 Get Content Details

GET /api/admin/moderation/content/{contentId}

Description: Retrieves detailed information about a specific content item
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Response:

{
  "id": "content-uuid-1",
  "type": "post",
  "status": "pending",
  "title": "New AI Innovation",
  "content": "Full text of the post with all details...",
  "media": [
    {
      "type": "image",
      "url": "https://storage.futrconnect.com/posts/images/ai-innovation.jpg",
      "moderation_flags": []
    }
  ],
  "author": {
    "id": "user-uuid-2",
    "name": "Jane Smith",
    "email": "jane.smith@example.com",
    "company": "Tech Innovators",
    "content_history": {
      "total_posts": 15,
      "rejected_posts": 0,
      "warning_count": 0
    }
  },
  "created_at": "2025-05-18T10:30:00Z",
  "reports": [],
  "moderation_history": [],
  "ai_analysis": {
    "sensitivity_score": 0.05,
    "flagged_categories": [],
    "recommendation": "approve"
  }
}

5.4.3 Update Content Moderation Status

PATCH /api/admin/moderation/content/{contentId}

Description: Updates the moderation status of a content item
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true
Content-Type: application/json

Request Body:

{
  "status": "approved",
  "internal_notes": "Content meets community guidelines",
  "notify_author": true
}

Response:

{
  "success": true,
  "content": {
    "id": "content-uuid-1",
    "type": "post",
    "status": "approved",
    "previous_status": "pending"
  },
  "notification_sent": true,
  "message": "Content moderation status updated successfully"
}

5.5 System Settings API

5.5.1 Get System Settings

GET /api/admin/settings

Description: Retrieves current system-wide settings
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Response:

{
  "registration": {
    "open": true,
    "require_email_verification": true,
    "allow_company_registration": true
  },
  "content": {
    "require_moderation": true,
    "auto_moderation_enabled": true,
    "max_file_size_mb": 10,
    "allowed_file_types": ["jpg", "png", "pdf", "docx"]
  },
  "security": {
    "password_policy": {
      "min_length": 10,
      "require_uppercase": true,
      "require_number": true,
      "require_special_char": true
    },
    "session_timeout_minutes": 30,
    "mfa_required_for_admins": true
  },
  "notifications": {
    "system_maintenance_message": "",
    "global_announcement": "Platform updates scheduled for May 25th, 2025"
  },
  "feature_flags": {
    "advanced_analytics": true,
    "ai_recommendations": true,
    "realtime_chat": false
  }
}

5.5.2 Update System Settings

PATCH /api/admin/settings

Description: Updates system-wide settings
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true
Content-Type: application/json

Request Body:

{
  "notifications": {
    "global_announcement": "Platform updates scheduled for May 25th, 2025"
  },
  "feature_flags": {
    "realtime_chat": true
  }
}

Response:

{
  "success": true,
  "updated_settings": {
    "notifications": {
      "global_announcement": "Platform updates scheduled for May 25th, 2025"
    },
    "feature_flags": {
      "realtime_chat": true
    }
  },
  "message": "System settings updated successfully"
}

5.6 Analytics and Reporting API

5.6.1 Get Platform Analytics

GET /api/admin/analytics/platform

Description: Retrieves platform-wide analytics and metrics
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Query Parameters:

period: String (optional, e.g., "day", "week", "month", "year")
start_date: String (optional, ISO format)
end_date: String (optional, ISO format)

Response:

{
  "period": "month",
  "start_date": "2025-04-19T00:00:00Z",
  "end_date": "2025-05-19T00:00:00Z",
  "users": {
    "total": 2450,
    "new": 120,
    "active": 890,
    "growth_rate": 5.15
  },
  "companies": {
    "total": 78,
    "new": 5,
    "active": 65,
    "pending_approval": 8
  },
  "content": {
    "posts_created": 345,
    "comments_created": 1256,
    "content_flagged": 15,
    "content_approved": 330
  },
  "engagement": {
    "average_session_duration": "00:12:45",
    "page_views": 12500,
    "unique_visitors": 950
  },
  "revenue": {
    "total": 25600,
    "by_subscription_tier": {
      "basic": 3200,
      "premium": 15400,
      "enterprise": 7000
    },
    "growth_rate": 12.3
  }
}

5.6.2 Get Admin Audit Log

GET /api/admin/audit-logs

Description: Retrieves a log of administrative actions for accountability
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Query Parameters:

page: Number (default: 1)
limit: Number (default: 20)
action: String (optional)
admin_id: String (optional)
start_date: String (optional, ISO format)
end_date: String (optional, ISO format)

Response:

{
  "data": [
    {
      "id": "log-uuid-1",
      "timestamp": "2025-05-19T10:30:00Z",
      "admin": {
        "id": "admin-uuid-1",
        "name": "Admin User",
        "email": "admin@futrconnect.com"
      },
      "action": "user_suspend",
      "entity_type": "user",
      "entity_id": "user-uuid-1",
      "details": {
        "reason": "Violation of platform terms of service",
        "duration": 7
      },
      "ip_address": "192.168.1.1"
    },
    {
      "id": "log-uuid-2",
      "timestamp": "2025-05-19T09:15:00Z",
      "admin": {
        "id": "admin-uuid-1",
        "name": "Admin User",
        "email": "admin@futrconnect.com"
      },
      "action": "company_approve",
      "entity_type": "company",
      "entity_id": "company-uuid-2",
      "details": {
        "previous_status": "pending",
        "new_status": "approved",
        "comments": "All verification criteria met"
      },
      "ip_address": "192.168.1.1"
    }
  ],
  "pagination": {
    "total": 152,
    "page": 1,
    "limit": 20,
    "pages": 8
  }
}

5.7 System Notifications API

5.7.1 Send System Notification

POST /api/admin/notifications

Description: Sends system-wide or targeted notifications
Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true
Content-Type: application/json

Request Body:

{
  "type": "announcement",
  "title": "Platform Maintenance",
  "message": "Scheduled maintenance on May 25th from 2:00 AM to 4:00 AM UTC.",
  "target": {
    "all_users": true,
    "specific_users": [],
    "specific_companies": [],
    "user_roles": []
  },
  "action": {
    "type": "link",
    "label": "Learn More",
    "url": "/announcements/maintenance-may-2025"
  },
  "expiry": "2025-05-25T04:00:00Z"
}

Response:

{
  "success": true,
  "notification_id": "notification-uuid-1",
  "recipients_count": 2450,
  "message": "Notification scheduled successfully"
}

6. User Flow

6.1 Admin Login Flow

  1. Admin navigates to the admin portal login page
  2. Admin enters credentials (email, password) and MFA code
  3. System validates credentials and MFA with enhanced security checks
  4. On successful authentication, admin is redirected to the admin dashboard
  5. System logs the admin login activity in the audit log

6.2 User Management Flow

  1. Admin navigates to User Management section from the dashboard
  2. Admin can search, filter, and paginate through user records
  3. Admin can select a user to view detailed information
  4. Admin can perform actions such as:
    - Updating user status (activate, suspend, ban)
    - Modifying user roles
    - Resetting user passwords
    - Viewing user activity logs
  5. All admin actions are recorded in the audit log

6.3 Company Management Flow

  1. Admin navigates to Company Management section from the dashboard
  2. Admin can view a list of companies with status indicators
  3. Admin can filter companies by status (pending, approved, rejected)
  4. For pending companies, admin can:
    - Review company details and verification documents
    - Approve or reject the company registration
    - Request additional information
  5. For approved companies, admin can:
    - View company details and member list
    - Suspend or ban companies for policy violations
    - Manage company subscription tiers
  6. All company status changes are recorded in the audit log

6.4 Content Moderation Flow

  1. Admin navigates to Content Moderation section from the dashboard
  2. System displays content pending moderation, with priority flags for reported content
  3. Admin can filter content by type (posts, comments, profiles)
  4. Admin can review content details including:
    - Full content text and media
    - Author information and history
    - AI-powered content analysis
    - User reports (if any)
  5. Admin can approve, reject, or flag content for further review
  6. For rejected content, admin provides a reason that will be sent to the author
  7. All moderation decisions are recorded in the audit log

6.5 System Settings Flow

  1. Admin navigates to System Settings section from the dashboard
  2. Admin can view and modify platform-wide settings such as:
    - Registration settings
    - Content moderation rules
    - Security policies
    - Feature flags
  3. Admin can publish system-wide notifications and announcements
  4. All settings changes are recorded in the audit log

6.6 Analytics and Reporting Flow

  1. Admin navigates to Analytics section from the dashboard
  2. Admin can view real-time platform metrics and visualizations
  3. Admin can filter analytics by date range and metrics
  4. Admin can export reports in various formats (CSV, PDF)
  5. Admin can configure automated report delivery

7. UI Components

7.1 Admin Dashboard Layout

  • AdminNavigation: Left sidebar with navigation links to all admin sections
  • AdminHeader: Top header with admin profile, notifications, and quick actions
  • AdminContent: Main content area for displaying active section
  • AdminFooter: Bottom footer with version information and support links

7.2 User Management Components

  • UserList: Table with user records, sortable columns, and search functionality
  • UserFilters: Filter controls for user role, status, and date range
  • UserDetailsCard: Expandable card with detailed user information
  • UserActionsMenu: Dropdown menu with available actions for each user
  • UserStatusBadge: Visual indicator of user status with appropriate colors

7.3 Company Management Components

  • CompanyList: Table with company records, sortable columns, and search functionality
  • CompanyFilters: Filter controls for company status, industry, and date range
  • CompanyDetailsCard: Expandable card with detailed company information
  • VerificationDocumentsViewer: Secure viewer for company verification documents
  • CompanyApprovalForm: Form for providing approval decision and comments

7.4 Content Moderation Components

  • ContentModerationQueue: Prioritized list of content requiring moderation
  • ContentPreview: Content display with sensitive content warnings
  • ContentAnalysisPanel: AI-powered analysis results and sensitivity scores
  • ReportsDisplay: Summary of user reports for flagged content
  • ModerationActionForm: Form for moderation decision and feedback

7.5 System Settings Components

  • SettingsCategoryTabs: Tab navigation for different settings categories
  • SettingsForm: Form controls for various platform settings
  • FeatureFlagToggle: Toggle switches for enabling/disabling features
  • NotificationComposer: Rich text editor for creating system notifications
  • MaintenanceScheduler: Interface for scheduling system maintenance

7.6 Analytics Components

  • MetricsDashboard: Overview of key platform metrics with visualizations
  • AnalyticsChart: Interactive charts for various metrics (line, bar, pie)
  • TimeRangePicker: Date range selection for filtering analytics
  • ExportControls: Controls for exporting analytics in different formats
  • ReportScheduler: Interface for scheduling automated analytics reports

8. State Management

The Admin Dashboard uses MobX-State-Tree (MST) for state management, with separate stores for each major functional area.

8.1 Admin Authentication Store

const AdminAuthStore = types
  .model('AdminAuthStore', {
    currentAdmin: types.maybe(
      types.model('AdminUser', {
        id: types.identifier,
        name: types.string,
        email: types.string,
        role: types.enumeration(['super-admin', 'content-moderator', 'support-manager']),
        lastLogin: types.string
      })
    ),
    isAuthenticated: types.optional(types.boolean, false),
    isLoading: types.optional(types.boolean, false),
    error: types.optional(types.string, '')
  })
  .views(self => ({
    get isSuperAdmin() {
      return self.currentAdmin?.role === 'super-admin';
    },

    get canModerateContent() {
      return self.currentAdmin?.role === 'super-admin' || 
             self.currentAdmin?.role === 'content-moderator';
    }
  }))
  .actions(self => ({
    login: flow(function* (credentials) {
      self.isLoading = true;
      self.error = '';

      try {
        const response = yield adminApiClient.post('/api/admin/login', credentials);

        // Set token in secure storage
        setAuthToken(response.data.token);

        // Update state
        self.currentAdmin = {
          id: response.data.user.id,
          name: response.data.user.name,
          email: response.data.user.email,
          role: response.data.user.role,
          lastLogin: response.data.user.last_login
        };

        self.isAuthenticated = true;
        return true;
      } catch (error) {
        self.error = error.response?.data?.message || 'Authentication failed';
        return false;
      } finally {
        self.isLoading = false;
      }
    }),

    logout: flow(function* () {
      try {
        yield adminApiClient.post('/api/admin/logout');
      } catch (error) {
        console.error('Logout error:', error);
      } finally {
        // Clear token
        clearAuthToken();

        // Reset state
        self.currentAdmin = null;
        self.isAuthenticated = false;
      }
    }),

    checkAuthStatus: flow(function* () {
      self.isLoading = true;

      try {
        const response = yield adminApiClient.get('/api/admin/me');

        // Update state
        self.currentAdmin = {
          id: response.data.id,
          name: response.data.name,
          email: response.data.email,
          role: response.data.role,
          lastLogin: response.data.last_login
        };

        self.isAuthenticated = true;
      } catch (error) {
        // Token expired or invalid
        self.currentAdmin = null;
        self.isAuthenticated = false;
        clearAuthToken();
      } finally {
        self.isLoading = false;
      }
    })
  }));

8.2 User Management Store

const UserManagementStore = types
  .model('UserManagementStore', {
    users: types.array(
      types.model('User', {
        id: types.identifier,
        name: types.string,
        email: types.string,
        role: types.string,
        status: types.enumeration(['active', 'pending', 'suspended', 'banned']),
        companyAssociation: types.maybe(types.frozen()),
        createdAt: types.string,
        lastLogin: types.maybe(types.string)
      })
    ),
    selectedUserId: types.maybe(types.string),
    isLoading: types.optional(types.boolean, false),
    isSubmitting: types.optional(types.boolean, false),
    error: types.optional(types.string, ''),
    pagination: types.optional(
      types.model({
        total: types.number,
        page: types.number,
        limit: types.number,
        pages: types.number
      }), 
      { total: 0, page: 1, limit: 20, pages: 0 }
    ),
    filters: types.optional(
      types.model({
        search: types.optional(types.string, ''),
        role: types.optional(types.string, ''),
        status: types.optional(types.string, '')
      }),
      {}
    )
  })
  .views(self => ({
    get selectedUser() {
      return self.selectedUserId 
        ? self.users.find(user => user.id === self.selectedUserId) 
        : null;
    }
  }))
  .actions(self => ({
    setFilters(filters) {
      self.filters = { ...self.filters, ...filters };
    },

    setPage(page) {
      self.pagination.page = page;
      this.fetchUsers();
    },

    setSelectedUserId(id) {
      self.selectedUserId = id;
    },

    fetchUsers: flow(function* () {
      self.isLoading = true;

      try {
        const response = yield adminApiClient.get('/api/admin/users', {
          params: {
            page: self.pagination.page,
            limit: self.pagination.limit,
            ...self.filters
          }
        });

        self.users = response.data.data;
        self.pagination = {
          total: response.data.pagination.total,
          page: response.data.pagination.page,
          limit: response.data.pagination.limit,
          pages: response.data.pagination.pages
        };
      } catch (error) {
        self.error = error.response?.data?.message || 'Failed to fetch users';
      } finally {
        self.isLoading = false;
      }
    }),

    fetchUserDetails: flow(function* (userId) {
      if (!userId) return;

      try {
        const response = yield adminApiClient.get(`/api/admin/users/${userId}`);

        // Find and update the user in the list
        const userIndex = self.users.findIndex(user => user.id === userId);

        if (userIndex >= 0) {
          self.users[userIndex] = {
            ...self.users[userIndex],
            ...response.data
          };
        }

        self.selectedUserId = userId;
        return response.data;
      } catch (error) {
        self.error = error.response?.data?.message || 'Failed to fetch user details';
        return null;
      }
    }),

    updateUserStatus: flow(function* (userId, statusData) {
      self.isSubmitting = true;

      try {
        const response = yield adminApiClient.patch(
          `/api/admin/users/${userId}/status`,
          statusData
        );

        // Update the user in the list
        const userIndex = self.users.findIndex(user => user.id === userId);

        if (userIndex >= 0) {
          self.users[userIndex] = {
            ...self.users[userIndex],
            status: response.data.user.status
          };
        }

        return response.data;
      } catch (error) {
        self.error = error.response?.data?.message || 'Failed to update user status';
        throw error;
      } finally {
        self.isSubmitting = false;
      }
    }),

    updateUserRole: flow(function* (userId, roleData) {
      self.isSubmitting = true;

      try {
        const response = yield adminApiClient.patch(
          `/api/admin/users/${userId}/role`,
          roleData
        );

        // Update the user in the list
        const userIndex = self.users.findIndex(user => user.id === userId);

        if (userIndex >= 0) {
          self.users[userIndex] = {
            ...self.users[userIndex],
            role: response.data.user.role
          };
        }

        return response.data;
      } catch (error) {
        self.error = error.response?.data?.message || 'Failed to update user role';
        throw error;
      } finally {
        self.isSubmitting = false;
      }
    })
  }));

8.3 Additional Stores

The Admin Dashboard also includes the following stores:

  • CompanyManagementStore: For managing company approvals and operations
  • ContentModerationStore: For reviewing and moderating content
  • SystemSettingsStore: For managing platform-wide settings
  • AnalyticsStore: For retrieving and displaying platform analytics
  • AuditLogStore: For tracking and displaying admin actions
  • NotificationStore: For sending system-wide notifications

9. Database Models

9.1 PostgreSQL Models

Adminfeedback

  • id (UUID, primary key)
  • user (ForeignKey to User, nullable)
  • rating (DecimalField, required)
  • message (text, required)
  • is_active (boolean, default: false)

10. Validation Rules

10.1 User Management Validation

User Status Update

  • Status: Required, must be one of: “active”, “suspended”, “banned”
  • Reason: Required when status is “suspended” or “banned”, minimum 10 characters
  • Duration: Optional, required when status is “suspended”, must be a positive integer

User Role Update

  • Role: Required, must be one of the predefined system roles
  • Reason: Required, minimum 10 characters for audit purposes

10.2 Company Management Validation

Company Approval

  • Status: Required, must be one of: “approved”, “rejected”
  • Comments: Required when status is “rejected”, minimum 10 characters
  • Verification Check: All required verification documents must be reviewed

10.3 Content Moderation Validation

  • Status: Required, must be one of: “approved”, “rejected”
  • Internal Notes: Optional, maximum 500 characters
  • Rejection Reason: Required when status is “rejected”, minimum 10 characters

10.4 System Settings Validation

  • Settings values must conform to predefined schemas for each setting category
  • Feature flags can only be enabled after proper testing in staging environment
  • System notifications must include a title (max 100 chars) and message (max 1000 chars)

11. Security Considerations

11.1 Authentication Security

  • Enforced Multi-Factor Authentication (MFA) for all admin users
  • Advanced password complexity requirements (min 12 chars, uppercase, lowercase, numbers, special chars)
  • Session expiration after 30 minutes of inactivity
  • IP-based login restrictions for admin accounts
  • Automatic lockout after multiple failed login attempts

11.2 Authorization Controls

  • Fine-grained role-based access control (RBAC)
  • Principle of least privilege applied to all admin roles
  • All actions go through authorization middleware
  • Regular permission audits through automated tests

11.3 Data Security

  • Sensitive user data is encrypted at rest and in transit
  • Admin actions on PII are specially logged for GDPR compliance
  • Company verification documents are stored with enhanced encryption
  • Regular security audits and penetration testing

11.4 Audit and Accountability

  • Comprehensive audit logging of all admin actions
  • Logs are immutable and stored securely
  • Regular audit log reviews for security anomalies
  • Email alerts for sensitive admin actions (user bans, bulk operations)

12. Performance Considerations

12.1 Dashboard Optimization

  • Real-time metrics use incremental updates rather than full reloads
  • Heavy operations (reports, analytics) are calculated asynchronously
  • Admin dashboard uses efficient data pagination and virtualized lists
  • API response data is structured for minimal payload size

12.2 Caching Strategy

  • Redis cache for frequently accessed read-only data
  • User and company lists use cursor-based pagination for better performance
  • Analytics data is pre-aggregated for common time periods
  • Admin audit logs use time-partitioned storage for faster queries

12.3 Background Processing

  • Heavy administrative operations run as background jobs
  • Bulk user operations are processed in batches
  • System-wide notifications are queued for reliable delivery
  • Regular background maintenance tasks (data pruning, analytics computation)

13. Accessibility Features

13.1 Admin Interface Accessibility

  • Admin dashboard complies with WCAG 2.1 AA standards
  • Keyboard navigation supported for all administrative functions
  • Screen reader compatibility with proper ARIA labels
  • Color contrast meets accessibility requirements
  • Support for increased text size and zoom level

13.2 Admin Tools

  • Accessible data tables with proper row and column headers
  • Form fields have clear labels and error states
  • Interactive components have keyboard and screen reader support
  • Status changes are announced to screen readers
  • Critical actions require confirmation to prevent mistakes

14. Future Enhancements

14.1 Advanced Administration Features

  • AI-powered anomaly detection for unusual platform activity
  • Advanced user behavior analytics for fraud prevention
  • Customizable admin dashboard with drag-and-drop widgets
  • Bulk operations wizard for mass updates with validation
  • Automated content moderation with human review

14.2 Integration Enhancements

  • Admin-focused mobile app for on-the-go moderation tasks
  • Integration with third-party compliance and security tools
  • Advanced API for custom administrative integrations
  • Webhook support for external system notifications
  • Enhanced reporting engine with custom report builder

14.3 Performance and Scalability

  • Advanced caching strategies for larger user bases
  • Sharded database approach for horizontal scaling
  • Multi-region deployment support for global administration
  • Real-time collaborative administrative features
  • Enhanced analytics with predictive modeling
    “last_login”: “2025-05-18T14:25:00Z”
    }
    ],
    “pagination”: {
    “total”: 543,
    “page”: 1,
    “limit”: 20,
    “pages”: 28
    }
    }
    ### 2. User Role Management
    

    PATCH /api/admin/users/{user_id}/role
    **Request Headers:**
    

    Authorization: Bearer (required)
    Content-Type: application/json
    X-Admin-Access: true
    **Request Body:**
    ```json
    {
      "role": "super_admin",
      "reason": "Promoting user to manage content approval workflows"
    }
    

Response:

{
  "success": true,
  "user": {
    "id": "user-uuid-1",
    "name": "John Doe",
    "email": "john.doe@example.com",
    "role": "super_admin",
    "updated_at": "2025-05-19T11:30:00Z"
  },
  "audit_log": {
    "id": "log-uuid-1",
    "action": "role_update",
    "performed_by": "admin-uuid-1",
    "timestamp": "2025-05-19T11:30:00Z"
  }
}

3. User Status Management

PATCH /api/admin/users/{user_id}/status

Request Headers:

Authorization: Bearer <firebase-id-token> (required)
Content-Type: application/json
X-Admin-Access: true

Request Body:

{
  "status": "suspended",
  "reason": "Multiple violations of community guidelines",
  "duration": "30_days"
}

Response:

{
  "success": true,
  "user": {
    "id": "user-uuid-1",
    "name": "John Doe",
    "email": "john.doe@example.com",
    "status": "suspended",
    "suspension_ends": "2025-06-19T11:30:00Z",
    "updated_at": "2025-05-19T11:30:00Z"
  },
  "audit_log": {
    "id": "log-uuid-2",
    "action": "status_update",
    "performed_by": "admin-uuid-1",
    "timestamp": "2025-05-19T11:30:00Z"
  }
}

4. Company Management API

GET /api/admin/companies

Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Query Parameters:

page: Number (default: 1)
limit: Number (default: 20)
search: String (optional)
status: String (optional - 'pending', 'approved', 'rejected', 'featured')

Response:

{
  "data": [
    {
      "id": "company-uuid-1",
      "name": "AI Solutions Inc",
      "email": "contact@aisolutions.com",
      "status": "pending",
      "created_at": "2025-05-15T10:30:00Z",
      "claimed_by": {
        "user_id": "user-uuid-1",
        "name": "John Doe",
        "email": "john.doe@example.com"
      },
      "is_featured": false
    }
  ],
  "pagination": {
    "total": 125,
    "page": 1,
    "limit": 20,
    "pages": 7
  }
}

5. Company Approval API

PATCH /api/admin/companies/{company_id}/status

Request Headers:

Authorization: Bearer <firebase-id-token> (required)
Content-Type: application/json
X-Admin-Access: true

Request Body:

{
  "status": "approved",
  "featured": true,
  "admin_notes": "Verified company information and approved for featuring on the platform"
}

Response:

{
  "success": true,
  "company": {
    "id": "company-uuid-1",
    "name": "AI Solutions Inc",
    "status": "approved",
    "is_featured": true,
    "updated_at": "2025-05-19T11:45:00Z"
  },
  "notification": {
    "sent_to": "user-uuid-1",
    "message": "Your company 'AI Solutions Inc' has been approved and is now live on Futr Connect."
  },
  "audit_log": {
    "id": "log-uuid-3",
    "action": "company_approval",
    "performed_by": "admin-uuid-1",
    "timestamp": "2025-05-19T11:45:00Z"
  }
}

6. Content Approval API - News

GET /api/admin/content/news

Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Query Parameters:

page: Number (default: 1)
limit: Number (default: 20)
status: String (optional - 'pending', 'approved', 'rejected')

Response:

{
  "data": [
    {
      "id": "news-uuid-1",
      "title": "Revolutionary AI Framework Released",
      "source": "AI Today",
      "source_url": "https://aitoday.example.com/article-123",
      "summary": "A groundbreaking AI framework has been released...",
      "tags": ["AI", "Framework", "Development"],
      "status": "pending",
      "submitted_at": "2025-05-18T09:30:00Z"
    }
  ],
  "pagination": {
    "total": 87,
    "page": 1,
    "limit": 20,
    "pages": 5
  }
}

7. News Approval API

PATCH /api/admin/content/news/{news_id}

Request Headers:

Authorization: Bearer <firebase-id-token> (required)
Content-Type: application/json
X-Admin-Access: true

Request Body:

{
  "status": "approved",
  "edited_title": "Revolutionary AI Framework Released for Enterprise Use",
  "edited_tags": ["AI", "Framework", "Development", "Enterprise"],
  "admin_notes": "Verified source and content. Added Enterprise tag."
}

Response:

{
  "success": true,
  "news": {
    "id": "news-uuid-1",
    "title": "Revolutionary AI Framework Released for Enterprise Use",
    "status": "approved",
    "tags": ["AI", "Framework", "Development", "Enterprise"],
    "updated_at": "2025-05-19T12:15:00Z",
    "published_at": "2025-05-19T12:15:00Z"
  },
  "audit_log": {
    "id": "log-uuid-4",
    "action": "news_approval",
    "performed_by": "admin-uuid-1",
    "timestamp": "2025-05-19T12:15:00Z"
  }
}

8. Content Approval API - Podcasts

GET /api/admin/content/podcasts

Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Query Parameters:

page: Number (default: 1)
limit: Number (default: 20)
status: String (optional - 'pending', 'approved', 'rejected')

Response:

{
  "data": [
    {
      "id": "podcast-uuid-1",
      "title": "The Future of AI in Healthcare",
      "youtube_embed_id": "abc12345xyz",
      "duration": "45:30",
      "summary": "Exploring how artificial intelligence is transforming healthcare...",
      "tags": ["AI", "Healthcare", "Innovation"],
      "status": "pending",
      "submitted_at": "2025-05-17T14:30:00Z"
    }
  ],
  "pagination": {
    "total": 42,
    "page": 1,
    "limit": 20,
    "pages": 3
  }
}

9. Podcast Approval API

PATCH /api/admin/content/podcasts/{podcast_id}

Request Headers:

Authorization: Bearer <firebase-id-token> (required)
Content-Type: application/json
X-Admin-Access: true

Request Body:

{
  "status": "approved",
  "edited_title": "The Future of AI in Healthcare: Expert Insights",
  "edited_tags": ["AI", "Healthcare", "Innovation", "Expert Panel"],
  "admin_notes": "High-quality content with industry experts."
}

Response:

{
  "success": true,
  "podcast": {
    "id": "podcast-uuid-1",
    "title": "The Future of AI in Healthcare: Expert Insights",
    "status": "approved",
    "tags": ["AI", "Healthcare", "Innovation", "Expert Panel"],
    "updated_at": "2025-05-19T12:30:00Z",
    "published_at": "2025-05-19T12:30:00Z"
  },
  "audit_log": {
    "id": "log-uuid-5",
    "action": "podcast_approval",
    "performed_by": "admin-uuid-1",
    "timestamp": "2025-05-19T12:30:00Z"
  }
}

10. Content Approval API - Insights

GET /api/admin/content/insights

Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Query Parameters:

page: Number (default: 1)
limit: Number (default: 20)
company_id: String (optional)
status: String (optional - 'pending', 'approved', 'rejected')
type: String (optional - 'product', 'people', 'finance', etc.)

Response:

{
  "data": [
    {
      "id": "insight-uuid-1",
      "title": "AI Solutions Product Launch",
      "type": "product",
      "company": {
        "id": "company-uuid-1",
        "name": "AI Solutions Inc"
      },
      "submitted_by": {
        "id": "user-uuid-1",
        "name": "John Doe",
        "email": "john.doe@example.com"
      },
      "status": "pending",
      "submitted_at": "2025-05-18T16:45:00Z"
    }
  ],
  "pagination": {
    "total": 156,
    "page": 1,
    "limit": 20,
    "pages": 8
  }
}

11. Insight Approval API

PATCH /api/admin/content/insights/{insight_id}

Request Headers:

Authorization: Bearer <firebase-id-token> (required)
Content-Type: application/json
X-Admin-Access: true

Request Body:

{
  "status": "approved",
  "edited_content": {
    "title": "AI Solutions Revolutionary Product Launch",
    "tags": ["AI", "Product Launch", "Enterprise"]
  },
  "admin_notes": "Appropriate content for company profile."
}

Response:

{
  "success": true,
  "insight": {
    "id": "insight-uuid-1",
    "title": "AI Solutions Revolutionary Product Launch",
    "status": "approved",
    "updated_at": "2025-05-19T12:45:00Z",
    "published_at": "2025-05-19T12:45:00Z"
  },
  "notification": {
    "sent_to": "user-uuid-1",
    "message": "Your insight 'AI Solutions Revolutionary Product Launch' has been approved and published."
  },
  "audit_log": {
    "id": "log-uuid-6",
    "action": "insight_approval",
    "performed_by": "admin-uuid-1",
    "timestamp": "2025-05-19T12:45:00Z"
  }
}

12. System Metrics API

GET /api/admin/metrics

Request Headers:

Authorization: Bearer <firebase-id-token> (required)
X-Admin-Access: true

Query Parameters:

period: String (optional - 'daily', 'weekly', 'monthly', default: 'daily')
start_date: String (optional - ISO format)
end_date: String (optional - ISO format)

Response:

{
  "user_metrics": {
    "total_users": 5432,
    "new_users": 123,
    "active_users": 3890,
    "growth_rate": 2.3
  },
  "content_metrics": {
    "pending_approvals": {
      "companies": 15,
      "news": 28,
      "podcasts": 12,
      "insights": 34
    },
    "approved_content": {
      "companies": 1254,
      "news": 3421,
      "podcasts": 567,
      "insights": 2134
    }
  },
  "engagement_metrics": {
    "follows": 12453,
    "likes": 34521,
    "favorites": 5632,
    "trial_clicks": 3421,
    "meeting_bookings": 567
  },
  "period": {
    "type": "daily",
    "start_date": "2025-05-12T00:00:00Z",
    "end_date": "2025-05-19T00:00:00Z"
  }
}

Feature Components

1. Admin Dashboard Layout

  • Top Navigation Bar:
  • Platform logo (links to admin dashboard home)
  • Admin user information
  • Notifications icon
  • Logout button

  • Sidebar Navigation:

  • Dashboard overview (default landing page)
  • User management
  • Company management
  • Content approval
    • News
    • Podcasts
    • Insights
  • System metrics
  • Settings

  • Main Content Area:

  • Changes based on selected navigation item
  • Typically includes a header with section title and action buttons
  • Content display (tables, cards, or detailed views)
  • Pagination controls when applicable

2. Dashboard Overview

  • Summary Cards:
  • Total users
  • New registrations (last 7 days)
  • Active companies
  • Content pending approval
  • Recent approvals

  • Quick Action Buttons:

  • Manage users
  • Review pending companies
  • Approve content

  • Recent Activity Feed:

  • Chronological list of recent admin actions
  • Each item includes:
    • Action type (e.g., “User role update”, “Company approval”)
    • Timestamp
    • Admin who performed the action
    • Target (user/company/content affected)

3. User Management Section

  • User Search & Filter Controls:
  • Search by name or email
  • Filter by role (all, user, company owner, editor, super admin)
  • Filter by status (all, active, suspended, banned)
  • Date range selector

  • User List Table:

  • Columns:
    • User name
    • Email
    • Role
    • Company association
    • Status
    • Registration date
    • Last login
    • Actions
  • Sortable columns
  • Pagination controls

  • User Detail View:

  • Accessed by clicking on a user in the list
  • Complete user profile information
  • Activity history
  • Role management controls
  • Status management controls
  • Associated companies (if any)
  • Communication log

  • Bulk Action Controls:

  • Select multiple users
  • Apply actions (change status, export data)

4. Company Management Section

  • Company Search & Filter Controls:
  • Search by name
  • Filter by status (all, pending, approved, rejected, featured)
  • Date range selector

  • Company List Table:

  • Columns:
    • Company name
    • Status
    • Owner/claimed by
    • Creation date
    • Featured status
    • Actions
  • Sortable columns
  • Pagination controls

  • Company Detail View:

  • Complete company profile information
  • Claiming user information
  • Approval/rejection controls
  • Feature status toggle
  • Content published by company
  • Admin notes
  • Communication log

5. Content Approval Sections

5.1 News Approval

  • News List Table:
  • Columns:
    • Title
    • Source
    • Submission date
    • Status
    • Tags
    • Actions
  • Filter by status
  • Pagination controls

  • News Detail View:

  • Full article preview
  • Source verification
  • Tag management
  • Approval controls (approve, reject, edit)
  • Admin notes

5.2 Podcast Approval

  • Podcast List Table:
  • Columns:
    • Title
    • Duration
    • Submission date
    • Status
    • Tags
    • Actions
  • Filter by status
  • Pagination controls

  • Podcast Detail View:

  • Video player for preview
  • Content summary
  • Tag management
  • Approval controls (approve, reject, edit)
  • Admin notes

5.3 Insight Approval

  • Insight List Table:
  • Columns:
    • Title
    • Type (product, people, finance, etc.)
    • Company
    • Submitted by
    • Submission date
    • Status
    • Actions
  • Filter by status, type, company
  • Pagination controls

  • Insight Detail View:

  • Complete content preview
  • Rich text/media display
  • Tag management
  • Approval controls (approve, reject, edit)
  • Admin notes
  • Communication with submitter

6. System Metrics Section

  • Time Period Selector:
  • Daily, weekly, monthly views
  • Custom date range selector

  • User Growth Metrics:

  • Graph showing user registrations over time
  • Retention statistics
  • Active user counts

  • Content Metrics:

  • Approval rates
  • Content submission trends
  • Most active companies

  • Engagement Metrics:

  • Follow actions
  • Likes and favorites
  • Trial clicks
  • Meeting bookings

  • Export Controls:

  • Download metrics as CSV
  • Generate PDF reports

User Flow

1. Admin Authentication Flow

  1. Super-Admin navigates to the admin login page (typically /admin or /admin/login)
  2. Enters credentials (email and password)
  3. System validates credentials against Firebase Auth with admin claims
  4. Upon successful authentication, admin is redirected to dashboard overview
  5. Failed authentication shows appropriate error messages

2. User Management Flow

  1. Admin navigates to User Management section from sidebar
  2. Views list of users with search and filter options
  3. To manage a specific user:
    - Clicks on user row to view detailed profile
    - Can update role (e.g., promote to admin, demote from admin)
    - Can change status (suspend or ban user with reason)
    - Can view associated companies and content
  4. Changes are saved and audit logged
  5. System sends notifications to affected users when appropriate

3. Company Management Flow

  1. Admin navigates to Company Management section from sidebar
  2. Views list of companies with filter options (focusing on pending approvals)
  3. To manage a specific company:
    - Clicks on company row to view detailed profile
    - Reviews company information, including claimed user
    - Can approve, reject, or request changes
    - Can toggle featured status
    - Can add admin notes for internal reference
  4. Decision is saved and audit logged
  5. System sends notifications to company owners

4. Content Approval Flow

4.1 News Approval

  1. Admin navigates to Content Approval > News section
  2. Views list of pending news articles
  3. Clicks on an article to review:
    - Verifies source and content quality
    - Can edit title, summary, or tags if needed
    - Makes approval decision (approve/reject)
  4. Decision is saved and the article is published or rejected

4.2 Podcast Approval

  1. Admin navigates to Content Approval > Podcasts section
  2. Views list of pending podcast submissions
  3. Clicks on a podcast to review:
    - Watches video to verify content quality
    - Can edit title, summary, or tags if needed
    - Makes approval decision (approve/reject)
  4. Decision is saved and the podcast is published or rejected

4.3 Insight Approval

  1. Admin navigates to Content Approval > Insights section
  2. Views list of pending insights from companies
  3. Clicks on an insight to review:
    - Verifies content appropriateness and quality
    - Can edit content details if needed
    - Makes approval decision (approve/reject)
  4. Decision is saved and insight is published or rejected
  5. System notifies the submitting user of the decision

5. System Metrics Flow

  1. Admin navigates to System Metrics section
  2. Views default dashboard showing current day’s metrics
  3. Can adjust time period (daily, weekly, monthly) or set custom range
  4. Explores different metric categories:
    - User metrics
    - Content metrics
    - Engagement metrics
  5. Can export reports for offline analysis or presentations

UI Components

1. Navigation Components

  • AdminSidebar: Vertical navigation menu with icon and text labels
  • AdminHeader: Top bar with user info, notifications, and logout
  • BreadcrumbNav: Shows current location in admin hierarchy

2. Data Display Components

  • DataTable: Multi-column table with sorting, filtering, and pagination
  • DetailCard: Expandable card showing detailed information
  • StatusBadge: Color-coded badge showing approval status
  • ActivityFeed: Real-time or historical feed of admin activities
  • MetricsChart: Various chart types (line, bar, pie) for displaying metrics

3. Action Components

  • ActionButton: Primary and secondary action buttons
  • BulkActionMenu: Dropdown for actions on multiple selected items
  • ApprovalControls: Button group for approve/reject/edit actions
  • FilterControls: Expandable filter panel with multiple filter options
  • SearchInput: Search field with suggestions and clear button

4. Form Components

  • EditableField: Text field that can toggle between view and edit modes
  • TagEditor: Interface for adding, editing, and removing content tags
  • RoleSelector: Dropdown for changing user roles
  • StatusSelector: Radio buttons or dropdown for changing content status
  • AdminNotes: Text area for internal admin notes
  • DateRangePicker: Calendar interface for selecting date ranges

5. Feedback Components

  • ConfirmationModal: Dialog to confirm important actions
  • NotificationToast: Temporary notification showing action results
  • ValidationError: Inline error messages for form validation
  • LoadingIndicator: Visual indicator for async operations
  • EmptyState: Placeholder for empty lists or sections

State Management

1. MobX-State-Tree Admin Store

// Admin Dashboard Store
const AdminDashboardStore = types
  .model('AdminDashboardStore', {
    isLoading: types.optional(types.boolean, false),
    summaryData: types.optional(types.frozen(), {
      totalUsers: 0,
      newUsers: 0,
      activeCompanies: 0,
      pendingApprovals: {
        companies: 0,
        news: 0,
        podcasts: 0,
        insights: 0
      }
    }),
    recentActivity: types.array(types.frozen()),
    currentSection: types.optional(types.string, 'overview')
  })
  .actions(self => ({
    setCurrentSection(section) {
      self.currentSection = section;
    },
    fetchDashboardData: flow(function* () {
      self.isLoading = true;
      try {
        const response = yield apiClient.get('/api/admin/dashboard');
        self.summaryData = response.data.summary;
        self.recentActivity = response.data.recentActivity;
      } catch (error) {
        console.error('Error fetching admin dashboard data:', error);
      } finally {
        self.isLoading = false;
      }
    })
  }));

// User Management Store
const AdminUserStore = types
  .model('AdminUserStore', {
    users: types.array(types.frozen()),
    selectedUserId: types.maybe(types.string),
    selectedUserDetails: types.maybe(types.frozen()),
    filters: types.optional(types.model({
      search: types.optional(types.string, ''),
      role: types.optional(types.string, 'all'),
      status: types.optional(types.string, 'all'),
      dateRange: types.optional(types.frozen(), { start: null, end: null })
    }), {}),
    pagination: types.optional(types.model({
      page: types.optional(types.number, 1),
      limit: types.optional(types.number, 20),
      total: types.optional(types.number, 0)
    }), {}),
    isLoading: types.optional(types.boolean, false),
    isUpdating: types.optional(types.boolean, false)
  })
  .views(self => ({
    get totalPages() {
      return Math.ceil(self.pagination.total / self.pagination.limit);
    }
  }))
  .actions(self => ({
    setFilter(key, value) {
      self.filters[key] = value;
      self.pagination.page = 1; // Reset to first page when filters change
    },
    setPage(page) {
      self.pagination.page = page;
    },
    setSelectedUserId(id) {
      self.selectedUserId = id;
      if (id) {
        this.fetchUserDetails(id);
      } else {
        self.selectedUserDetails = null;
      }
    },
    fetchUsers: flow(function* () {
      self.isLoading = true;
      try {
        const response = yield apiClient.get('/api/admin/users', {
          params: {
            page: self.pagination.page,
            limit: self.pagination.limit,
            search: self.filters.search || undefined,
            role: self.filters.role !== 'all' ? self.filters.role : undefined,
            status: self.filters.status !== 'all' ? self.filters.status : undefined,
            start_date: self.filters.dateRange.start,
            end_date: self.filters.dateRange.end
          }
        });
        self.users = response.data.data;
        self.pagination.total = response.data.pagination.total;
      } catch (error) {
        console.error('Error fetching users:', error);
      } finally {
        self.isLoading = false;
      }
    }),
    fetchUserDetails: flow(function* (userId) {
      if (!userId) return;

      self.isLoading = true;
      try {
        const response = yield apiClient.get(`/api/admin/users/${userId}`);
        self.selectedUserDetails = response.data;
      } catch (error) {
        console.error('Error fetching user details:', error);
        self.selectedUserDetails = null;
      } finally {
        self.isLoading = false;
      }
    }),
    updateUserRole: flow(function* (userId, role, reason) {
      self.isUpdating = true;
      try {
        const response = yield apiClient.patch(`/api/admin/users/${userId}/role`, {
          role,
          reason
        });

        // Update local data
        if (self.selectedUserDetails && self.selectedUserDetails.id === userId) {
          self.selectedUserDetails = {
            ...self.selectedUserDetails,
            role: response.data.user.role
          };
        }

        // Update user in list if present
        const userIndex = self.users.findIndex(u => u.id === userId);
        if (userIndex >= 0) {
          self.users[userIndex] = {
            ...self.users[userIndex],
            role: response.data.user.role
          };
        }

        return response.data;
      } catch (error) {
        console.error('Error updating user role:', error);
        throw error;
      } finally {
        self.isUpdating = false;
      }
    }),
    updateUserStatus: flow(function* (userId, status, reason, duration) {
      self.isUpdating = true;
      try {
        const response = yield apiClient.patch(`/api/admin/users/${userId}/status`, {
          status,
          reason,
          duration
        });

        // Update local data
        if (self.selectedUserDetails && self.selectedUserDetails.id === userId) {
          self.selectedUserDetails = {
            ...self.selectedUserDetails,
            status: response.data.user.status
          };
        }

        // Update user in list if present
        const userIndex = self.users.findIndex(u => u.id === userId);
        if (userIndex >= 0) {
          self.users[userIndex] = {
            ...self.users[userIndex],
            status: response.data.user.status
          };
        }

        return response.data;
      } catch (error) {
        console.error('Error updating user status:', error);
        throw error;
      } finally {
        self.isUpdating = false;
      }
    })
  }));

// Content Approval Store
const ContentApprovalStore = types
  .model('ContentApprovalStore', {
    contentType: types.optional(
      types.enumeration(['news', 'podcasts', 'insights']), 
      'news'
    ),
    items: types.array(types.frozen()),
    selectedItemId: types.maybe(types.string),
    selectedItemDetails: types.maybe(types.frozen()),
    filters: types.optional(types.model({
      status: types.optional(types.string, 'pending'),
      search: types.optional(types.string, ''),
      companyId: types.maybe(types.string),
      dateRange: types.optional(types.frozen(), { start: null, end: null })
    }), {}),
    pagination: types.optional(types.model({
      page: types.optional(types.number, 1),
      limit: types.optional(types.number, 20),
      total: types.optional(types.number, 0)
    }), {}),
    isLoading: types.optional(types.boolean, false),
    isUpdating: types.optional(types.boolean, false),
    editedContent: types.maybe(types.frozen())
  })
  .views(self => ({
    get totalPages() {
      return Math.ceil(self.pagination.total / self.pagination.limit);
    },
    get apiEndpoint() {
      return `/api/admin/content/${self.contentType}`;
    }
  }))
  .actions(self => ({
    setContentType(type) {
      self.contentType = type;
      self.items = [];
      self.selectedItemId = null;
      self.selectedItemDetails = null;
      self.pagination.page = 1;
      this.fetchItems();
    },
    setFilter(key, value) {
      self.filters[key] = value;
      self.pagination.page = 1; // Reset to first page when filters change
    },
    setPage(page) {
      self.pagination.page = page;
    },
    setSelectedItemId(id) {
      self.selectedItemId = id;
      if (id) {
        this.fetchItemDetails(id);
      } else {
        self.selectedItemDetails = null;
        self.editedContent = null;
      }
    },
    setEditedContent(content) {
      self.editedContent = content;
    },
    fetchItems: flow(function* () {
      self.isLoading = true;
      try {
        const response = yield apiClient.get(self.apiEndpoint, {
          params: {
            page: self.pagination.page,
            limit: self.pagination.limit,
            status: self.filters.status,
            search: self.filters.search || undefined,
            company_id: self.filters.companyId,
            start_date: self.filters.dateRange.start,
            end_date: self.filters.dateRange.end
          }
        });
        self.items = response.data.data;
        self.pagination.total = response.data.pagination.total;
      } catch (error) {
        console.error(`Error fetching ${self.contentType}:`, error);
      } finally {
        self.isLoading = false;
      }
    }),
    fetchItemDetails: flow(function* (itemId) {
      if (!itemId) return;

      self.isLoading = true;
      try {
        const response = yield apiClient.get(`${self.apiEndpoint}/${itemId}`);
        self.selectedItemDetails = response.data;
        self.editedContent = null; // Reset edited content
      } catch (error) {
        console.error(`Error fetching ${self.contentType} details:`, error);
        self.selectedItemDetails = null;
      } finally {
        self.isLoading = false;
      }
    }),
    approveItem: flow(function* (itemId, editedContent, adminNotes) {
      self.isUpdating = true;
      try {
        const payload = {
          status: 'approved',
          admin_notes: adminNotes
        };

        if (editedContent) {
          payload.edited_content = editedContent;
        }

        const response = yield apiClient.patch(`${self.apiEndpoint}/${itemId}`, payload);

        // Update the item in the list
        const itemIndex = self.items.findIndex(item => item.id === itemId);
        if (itemIndex >= 0) {
          self.items[itemIndex] = {
            ...self.items[itemIndex],
            status: 'approved'
          };
        }

        // Update selected item if this is the one currently selected
        if (self.selectedItemId === itemId) {
          self.selectedItemDetails = {
            ...self.selectedItemDetails,
            status: 'approved',
            ...response.data[self.contentType.slice(0, -1)] // Remove 's' from contentType to get singular form
          };
        }

        return response.data;
      } catch (error) {
        console.error(`Error approving ${self.contentType.slice(0, -1)}:`, error);
        throw error;
      } finally {
        self.isUpdating = false;
      }
    }),
    rejectItem: flow(function* (itemId, reason) {
      self.isUpdating = true;
      try {
        const response = yield apiClient.patch(`${self.apiEndpoint}/${itemId}`, {
          status: 'rejected',
          admin_notes: reason
        });

        // Update the item in the list
        const itemIndex = self.items.findIndex(item => item.id === itemId);
        if (itemIndex >= 0) {
          self.items[itemIndex] = {
            ...self.items[itemIndex],
            status: 'rejected'
          };
        }

        // Update selected item if this is the one currently selected
        if (self.selectedItemId === itemId) {
          self.selectedItemDetails = {
            ...self.selectedItemDetails,
            status: 'rejected'
          };
        }

        return response.data;
      } catch (error) {
        console.error(`Error rejecting ${self.contentType.slice(0, -1)}:`, error);
        throw error;
      } finally {
        self.isUpdating = false;
      }
    })
  }));

2. React Components with Store Integration

// Admin Dashboard Overview Component
const AdminDashboard = observer(() => {
  const { adminDashboardStore } = useStores();
  const { isLoading, summaryData, recentActivity } = adminDashboardStore;

  useEffect(() => {
    adminDashboardStore.fetchDashboardData();

    // Set up interval to refresh data every 5 minutes
    const refreshInterval = setInterval(() => {
      adminDashboardStore.fetchDashboardData();
    }, 5 * 60 * 1000);

    return () => clearInterval(refreshInterval);
  }, []);

  return (
    <div className="admin-dashboard">
      <h1>Admin Dashboard</h1>

      {isLoading && <LoadingIndicator />}

      <div className="summary-cards">
        <SummaryCard 
          title="Total Users" 
          value={summaryData.totalUsers} 
          icon={<UserIcon />} 
        />
        <SummaryCard 
          title="New Users (7 days)" 
          value={summaryData.newUsers} 
          icon={<NewUserIcon />} 
        />
        <SummaryCard 
          title="Active Companies" 
          value={summaryData.activeCompanies} 
          icon={<CompanyIcon />} 
        />
        <SummaryCard 
          title="Pending Approvals" 
          value={Object.values(summaryData.pendingApprovals).reduce((a, b) => a + b, 0)} 
          icon={<ApprovalIcon />} 
        />
      </div>

      <div className="quick-actions">
        <h2>Quick Actions</h2>
        <div className="action-buttons">
          <Button 
            onClick={() => router.push('/admin/users')} 
            icon={<UserManageIcon />}
          >
            Manage Users
          </Button>
          <Button 
            onClick={() => router.push('/admin/companies?status=pending')} 
            icon={<CompanyApproveIcon />}
          >
            Review Companies
          </Button>
          <Button 
            onClick={() => router.push('/admin/content/news?status=pending')} 
            icon={<ContentApproveIcon />}
          >
            Approve Content
          </Button>
        </div>
      </div>

      <div className="recent-activity">
        <h2>Recent Activity</h2>
        <ActivityFeed activities={recentActivity} />
      </div>
    </div>
  );
});

// User Management Component
const UserManagement = observer(() => {
  const { adminUserStore } = useStores();
  const { 
    users, 
    filters, 
    pagination, 
    isLoading, 
    totalPages,
    selectedUserId,
    selectedUserDetails
  } = adminUserStore;

  useEffect(() => {
    adminUserStore.fetchUsers();
  }, [
    pagination.page,
    filters.search,
    filters.role,
    filters.status,
    filters.dateRange
  ]);

  const handleSearch = debounce((value) => {
    adminUserStore.setFilter('search', value);
  }, 300);

  const handleRoleChange = (userId, newRole) => {
    if (!userId) return;

    modal.confirm({
      title: 'Change User Role',
      content: (
        <div>
          <p>Are you sure you want to change this user's role to {newRole}?</p>
          <TextArea 
            placeholder="Provide a reason for this change (required)"
            id="roleChangeReason"
          />
        </div>
      ),
      onOk: async () => {
        const reason = document.getElementById('roleChangeReason').value;
        if (!reason) {
          notification.error({ message: 'A reason is required' });
          return false;
        }

        try {
          await adminUserStore.updateUserRole(userId, newRole, reason);
          notification.success({ message: 'User role updated successfully' });
        } catch (error) {
          notification.error({ message: 'Failed to update user role' });
        }
      }
    });
  };

  return (
    <div className="admin-user-management">
      <h1>User Management</h1>

      <div className="filter-toolbar">
        <Input.Search 
          placeholder="Search users..." 
          allowClear
          defaultValue={filters.search}
          onChange={(e) => handleSearch(e.target.value)}
        />

        <Select 
          defaultValue={filters.role}
          onChange={(value) => adminUserStore.setFilter('role', value)}
        >
          <Select.Option value="all">All Roles</Select.Option>
          <Select.Option value="user">User</Select.Option>
          <Select.Option value="company_owner">Company Owner</Select.Option>
          <Select.Option value="editor">Editor</Select.Option>
          <Select.Option value="super_admin">Super Admin</Select.Option>
        </Select>

        <Select
          defaultValue={filters.status}
          onChange={(value) => adminUserStore.setFilter('status', value)}
        >
          <Select.Option value="all">All Status</Select.Option>
          <Select.Option value="active">Active</Select.Option>
          <Select.Option value="suspended">Suspended</Select.Option>
          <Select.Option value="banned">Banned</Select.Option>
        </Select>

        <DateRangePicker
          value={[filters.dateRange.start, filters.dateRange.end]}
          onChange={([start, end]) => 
            adminUserStore.setFilter('dateRange', { start, end })
          }
        />
      </div>

      {isLoading && !users.length ? (
        <LoadingIndicator />
      ) : (
        <div className="user-data-container">
          <DataTable
            columns={[
              {
                title: 'Name',
                dataIndex: 'name',
                sorter: true
              },
              {
                title: 'Email',
                dataIndex: 'email'
              },
              {
                title: 'Role',
                dataIndex: 'role',
                render: (role) => <RoleBadge role={role} />
              },
              {
                title: 'Company',
                dataIndex: 'company_association',
                render: (assoc) => assoc ? assoc.company_name : '-'
              },
              {
                title: 'Status',
                dataIndex: 'status',
                render: (status) => <StatusBadge status={status} />
              },
              {
                title: 'Registered',
                dataIndex: 'created_at',
                render: (date) => formatDate(date)
              },
              {
                title: 'Actions',
                render: (_, record) => (
                  <Space>
                    <Button 
                      onClick={() => adminUserStore.setSelectedUserId(record.id)}
                    >
                      View
                    </Button>
                  </Space>
                )
              }
            ]}
            dataSource={users}
            rowKey="id"
            pagination={false}
            onRow={(record) => ({
              onClick: () => adminUserStore.setSelectedUserId(record.id)
            })}
          />

          <Pagination
            current={pagination.page}
            pageSize={pagination.limit}
            total={pagination.total}
            onChange={(page) => adminUserStore.setPage(page)}
          />
        </div>
      )}

      {selectedUserId && (
        <Drawer
          title="User Details"
          width={600}
          visible={!!selectedUserId}
          onClose={() => adminUserStore.setSelectedUserId(null)}
        >
          {selectedUserDetails ? (
            <div className="user-details">
              <div className="user-header">
                <Avatar size={64} src={selectedUserDetails.avatar} />
                <div>
                  <h2>{selectedUserDetails.name}</h2>
                  <p>{selectedUserDetails.email}</p>
                  <RoleBadge role={selectedUserDetails.role} />
                  <StatusBadge status={selectedUserDetails.status} />
                </div>
              </div>

              <Divider />

              <div className="user-actions">
                <h3>Manage User</h3>

                <div className="action-group">
                  <h4>Role Management</h4>
                  <Select
                    value={selectedUserDetails.role}
                    onChange={(value) => handleRoleChange(selectedUserId, value)}
                    disabled={adminUserStore.isUpdating}
                  >
                    <Select.Option value="user">User</Select.Option>
                    <Select.Option value="company_owner">Company Owner</Select.Option>
                    <Select.Option value="editor">Editor</Select.Option>
                    <Select.Option value="super_admin">Super Admin</Select.Option>
                  </Select>
                </div>

                <div className="action-group">
                  <h4>Status Management</h4>
                  <Button 
                    type={selectedUserDetails.status === 'active' ? 'primary' : 'default'}
                    onClick={() => handleStatusChange(selectedUserId, 'active')}
                    disabled={adminUserStore.isUpdating}
                  >
                    Activate
                  </Button>
                  <Button 
                    type={selectedUserDetails.status === 'suspended' ? 'warning' : 'default'}
                    onClick={() => handleStatusChange(selectedUserId, 'suspended')}
                    disabled={adminUserStore.isUpdating}
                  >
                    Suspend
                  </Button>
                  <Button 
                    type={selectedUserDetails.status === 'banned' ? 'danger' : 'default'}
                    onClick={() => handleStatusChange(selectedUserId, 'banned')}
                    disabled={adminUserStore.isUpdating}
                  >
                    Ban
                  </Button>
                </div>
              </div>

              <Divider />

              <div className="user-companies">
                <h3>Associated Companies</h3>
                {selectedUserDetails.companies && selectedUserDetails.companies.length > 0 ? (
                  <List
                    dataSource={selectedUserDetails.companies}
                    renderItem={(company) => (
                      <List.Item>
                        <List.Item.Meta
                          avatar={<Avatar src={company.logo} />}
                          title={company.name}
                          description={`Role: ${company.role}`}
                        />
                        <Button onClick={() => viewCompany(company.id)}>
                          View
                        </Button>
                      </List.Item>
                    )}
                  />
                ) : (
                  <EmptyState message="No associated companies" />
                )}
              </div>

              <Divider />

              <div className="user-activity">
                <h3>Activity Log</h3>
                <Timeline>
                  {selectedUserDetails.activity && selectedUserDetails.activity.map(item => (
                    <Timeline.Item key={item.id}>
                      <p>{item.action}</p>
                      <p className="timeline-date">{formatDate(item.timestamp)}</p>
                    </Timeline.Item>
                  ))}
                </Timeline>
              </div>
            </div>
          ) : (
            <LoadingIndicator />
          )}
        </Drawer>
      )}
    </div>
  );
});

Database Models

PostgreSQL Models

AdminAuditLog

  • id (UUID, primary key)
  • admin_id (ForeignKey to User)
  • action (varchar, required)
  • entity_type (varchar, required - ‘user’, ‘company’, ‘news’, ‘podcast’, ‘insight’)
  • entity_id (UUID, required)
  • previous_state (jsonb, optional)
  • new_state (jsonb, optional)
  • reason (text, optional)
  • ip_address (varchar, optional)
  • created_at (datetime)

AdminNotification

  • id (UUID, primary key)
  • admin_id (ForeignKey to User, nullable)
  • is_global (boolean, default: false)
  • title (varchar, required)
  • message (text, required)
  • action_url (varchar, nullable)
  • is_read (boolean, default: false)
  • priority (varchar, options: low, medium, high)
  • created_at (datetime)

AdminDashboardSetting

  • id (UUID, primary key)
  • admin_id (ForeignKey to User)
  • section_preferences (jsonb)
  • visible_metrics (array of strings)
  • custom_date_ranges (jsonb, array)
  • last_updated (datetime)

User

  • id (UUID, primary key)
  • firebase_uid (varchar, unique)
  • name (varchar, required)
  • email (varchar, required, unique)
  • role (varchar, options: user, company_owner, editor, super_admin)
  • status (varchar, options: active, suspended, banned)
  • suspension_reason (text, nullable)
  • suspension_ends (datetime, nullable)
  • company_associations (array of jsonb, containing company_id, role)
  • created_at (datetime)
  • updated_at (datetime)
  • last_login (datetime, nullable)

Company

  • id (UUID, primary key)
  • name (varchar, required)
  • email (varchar, required)
  • status (varchar, options: pending, approved, rejected)
  • is_featured (boolean, default: false)
  • featured_order (integer, nullable)
  • claimed_by (ForeignKey to User, nullable)
  • rejected_reason (text, nullable)
  • admin_notes (text, nullable)
  • created_at (datetime)
  • updated_at (datetime)
  • approved_at (datetime, nullable)
  • approved_by (ForeignKey to User, nullable)

News

  • id (UUID, primary key)
  • title (varchar, required)
  • original_title (varchar, required)
  • source (varchar, required)
  • source_url (URL, required)
  • summary (text, required)
  • tags (array of strings)
  • status (varchar, options: pending, approved, rejected)
  • admin_notes (text, nullable)
  • approved_by (ForeignKey to User, nullable)
  • approved_at (datetime, nullable)
  • created_at (datetime)
  • updated_at (datetime)

Podcast

  • id (UUID, primary key)
  • title (varchar, required)
  • original_title (varchar, required)
  • youtube_embed_id (varchar, required)
  • duration (varchar, required)
  • summary (text, required)
  • tags (array of strings)
  • status (varchar, options: pending, approved, rejected)
  • admin_notes (text, nullable)
  • approved_by (ForeignKey to User, nullable)
  • approved_at (datetime, nullable)
  • created_at (datetime)
  • updated_at (datetime)

CompanyInsight

  • id (UUID, primary key)
  • company_id (ForeignKey to Company)
  • type (varchar, options: product, people, finance, metrics, content, news, awards, references, feedback)
  • title (varchar, required)
  • content (jsonb, required)
  • submitted_by (ForeignKey to User)
  • status (varchar, options: pending, approved, rejected)
  • admin_notes (text, nullable)
  • approved_by (ForeignKey to User, nullable)
  • approved_at (datetime, nullable)
  • created_at (datetime)
  • updated_at (datetime)

Firebase Collections

  • admin_sessions: Used for tracking admin login sessions
  • admin_preferences: Stores individual admin UI preferences
  • real_time_notifications: Used for push notifications to admins

Validation Rules

1. User Management Validations

  • User Role Update:
  • Only super-admins can change user roles
  • Reason is required when changing a user’s role
  • Cannot demote self from super-admin
  • Audit logging is mandatory for all role changes

  • User Status Update:

  • Reason is required for suspension or ban
  • If suspending, duration must be specified (1 day, 7 days, 30 days, permanent)
  • Cannot suspend or ban self
  • System must send notification to affected user

2. Company Management Validations

  • Company Approval:
  • Validation of company information is required before approval
  • Featured companies must include admin notes explaining the decision
  • Rejection requires a specific reason that will be sent to the company owner
  • Company edits by admin must maintain original metadata for auditing

3. Content Approval Validations

  • News Approval:
  • Source URL must be valid and accessible
  • Content must be relevant to AI industry
  • Title edits should maintain original meaning
  • Tags must be appropriate and industry-standard

  • Podcast Approval:

  • YouTube embed ID must be valid and video must be playable
  • Content must be relevant to AI industry
  • Must adhere to platform content guidelines
  • Duration should be accurately recorded

  • Insight Approval:

  • Content must not violate platform guidelines
  • Must be relevant to the company’s line of business
  • No excessive promotional language
  • No competitor disparagement

4. Form Validation

// User Role Change Validation
const validateRoleChange = (values) => {
  const errors = {};

  if (!values.role) {
    errors.role = 'Role is required';
  }

  if (!values.reason) {
    errors.reason = 'Reason for role change is required';
  } else if (values.reason.length < 10) {
    errors.reason = 'Reason must be at least 10 characters';
  }

  if (values.role === 'super_admin' && !values.confirmationPassword) {
    errors.confirmationPassword = 'Please enter your password to confirm this sensitive change';
  }

  return errors;
};

// Company Approval Validation
const validateCompanyApproval = (values) => {
  const errors = {};

  if (!values.status) {
    errors.status = 'Approval status is required';
  }

  if (values.status === 'rejected' && !values.rejectionReason) {
    errors.rejectionReason = 'Rejection reason is required';
  } else if (values.status === 'rejected' && values.rejectionReason.length < 20) {
    errors.rejectionReason = 'Please provide a more detailed rejection reason (at least 20 characters)';
  }

  if (values.status === 'approved' && values.isFeatured && !values.adminNotes) {
    errors.adminNotes = 'Admin notes are required when featuring a company';
  }

  return errors;
};

// Content Approval Validation
const validateContentApproval = (values, contentType) => {
  const errors = {};

  if (!values.status) {
    errors.status = 'Approval status is required';
  }

  if (values.status === 'rejected' && !values.rejectionReason) {
    errors.rejectionReason = 'Rejection reason is required';
  }

  if (values.status === 'approved' && values.editedContent) {
    if (contentType === 'news' || contentType === 'podcast') {
      if (!values.editedContent.title) {
        errors.editedTitle = 'Title is required';
      }

      if (!values.editedContent.tags || values.editedContent.tags.length === 0) {
        errors.editedTags = 'At least one tag is required';
      }
    }

    if (contentType === 'insight') {
      if (!values.editedContent.title) {
        errors.editedTitle = 'Title is required';
      }

      if (!values.editedContent.content || values.editedContent.content.trim() === '') {
        errors.editedContent = 'Content is required';
      }
    }
  }

  return errors;
};

Security Considerations

1. Authentication and Authorization

  • Firebase Auth Integration:
  • Admin authentication uses Firebase Auth with custom claims
  • Token verification on all admin API endpoints
  • Session invalidation on suspicious activities
  • Time-limited admin sessions with refresh mechanism

  • Role-Based Access Control:

  • Granular permissions system for different admin functions
  • Backend validation for all sensitive operations
  • UI elements hidden for unauthorized access attempts
  • Special security measures for critical actions (password re-authentication)

2. API Security

  • Request Validation:
  • All admin API endpoints have strict input validation
  • Rate limiting to prevent abuse
  • CSRF protection for all POST/PATCH/DELETE requests
  • IP address logging for sensitive operations

  • Data Protection:

  • PII (personally identifiable information) is masked where appropriate
  • Sensitive fields are redacted in logs
  • Field-level permissions for data access
  • Data encryption for sensitive information in database

3. Audit Logging

  • Comprehensive Logging:
  • All administrative actions are logged with details:
    • Admin performing the action
    • IP address
    • Timestamp
    • Action type and target
    • Previous and new state for changes
    • Reason for action
  • Logs are immutable and cannot be altered by admins
  • Regular audit log reviews for security monitoring

4. Secure Communication

  • HTTPS Only:
  • All admin communication happens over HTTPS/TLS
  • HTTP Strict Transport Security (HSTS) enabled
  • Modern TLS configuration with secure ciphers
  • Certificate pinning for API communication

Performance Considerations

1. Admin Dashboard Optimization

  • Efficient Data Loading:
  • Dashboard metrics are cached with a short TTL (time-to-live)
  • Background refresh for non-critical data
  • Progressive loading of dashboard sections
  • Data aggregation happens at the database level, not in application code

2. List View Optimization

  • Pagination and Virtual Scrolling:
  • All list views implement pagination or virtual scrolling
  • Default limit of 20 items per page
  • Lazy loading of additional details
  • Both server-side and client-side filtering to minimize data transfer

  • Search Optimization:

  • Debounced search input to prevent excessive API calls
  • Server-side search with indexing for large datasets
  • Typeahead suggestions for common searches
  • Search highlights in results

3. Resource Handling

  • Image and Media Optimization:
  • Company logos and user avatars are cached
  • Lazy loading of media content
  • Responsive images with appropriate sizes
  • Content previews use thumbnails rather than full-size assets

  • Background Processing:

  • Long-running tasks use queues and background workers
  • Bulk operations are processed asynchronously with progress indicators
  • Export functions run in the background with notification upon completion

4. Caching Strategy

  • Multi-layer Caching:
  • Browser cache for static assets
  • API response caching for frequently accessed data
  • Redis cache for shared application state
  • Database query result caching
  • Cache invalidation on relevant data updates

Accessibility Features

1. Screen Reader Support

  • ARIA Attributes:
  • All interactive elements have proper ARIA roles and labels
  • Dynamic content updates announce changes to screen readers
  • Data tables include appropriate ARIA attributes for row/column headers
  • Modal dialogs use correct focus management

2. Keyboard Navigation

  • Full Keyboard Support:
  • All functions are accessible via keyboard
  • Focus indicators are clearly visible
  • Logical tab order through the admin interface
  • Keyboard shortcuts for common actions with documented key bindings

3. Color and Visual Design

  • High Contrast Support:
  • Color is not the only means of conveying information
  • Sufficient contrast ratios for text and UI elements
  • Support for system high contrast modes
  • Status indicators use both color and icons/text

4. Responsive Design

  • Multi-device Support:
  • Admin interface adapts to different screen sizes
  • Touch-friendly controls for tablet administration
  • Alternative layouts for narrow viewports
  • Critical functions remain accessible on all devices

Future Enhancements

1. Advanced Analytics

  • Enhanced Metrics Dashboard:
  • More detailed analytics on user engagement
  • Conversion tracking for CTAs (Call-to-Action buttons)
  • Advanced filtering and segmentation
  • Custom report builder

2. Bulk Operations

  • Efficient Content Management:
  • Bulk approval/rejection of content
  • Batch user management
  • Mass email capabilities to user segments
  • Bulk company status updates

3. Advanced Content Moderation

  • AI-Assisted Moderation:
  • Content sentiment analysis
  • Automatic inappropriate content detection
  • Suggested tags based on content analysis
  • Duplicate content detection

4. Enhanced Security

  • Advanced Security Features:
  • Two-factor authentication for admin accounts
  • IP-based access restrictions
  • Advanced user activity monitoring
  • Security alerts for suspicious activities

5. Workflow Improvements

  • Task Management:
  • Assignable approval tasks between admins
  • Approval workflows with multiple steps
  • Due dates and reminders for pending items
  • Admin collaboration features