Files
biblical-guide.com/admin-dashboard-implementation-plan.md
Andrei 39b6899315 Complete admin dashboard implementation with comprehensive features
🚀 Major Update: v2.0.0 - Complete Administrative Dashboard

## Phase 1: Dashboard Overview & Authentication 
- Secure admin authentication with JWT tokens
- Beautiful overview dashboard with key metrics
- Role-based access control (admin, moderator permissions)
- Professional MUI design with responsive layout

## Phase 2: User Management & Content Moderation 
- Complete user management with advanced data grid
- Prayer request content moderation system
- User actions: view, suspend, activate, promote, delete
- Content approval/rejection workflows

## Phase 3: Analytics Dashboard 
- Comprehensive analytics with interactive charts (Recharts)
- User activity analytics with retention tracking
- Content engagement metrics and trends
- Real-time statistics and performance monitoring

## Phase 4: Chat Monitoring & System Administration 
- Advanced conversation monitoring with content analysis
- System health monitoring and backup management
- Security oversight and automated alerts
- Complete administrative control panel

## Key Features Added:
 **32 new API endpoints** for complete admin functionality
 **Material-UI DataGrid** with advanced filtering and pagination
 **Interactive Charts** using Recharts library
 **Real-time Monitoring** with auto-refresh capabilities
 **System Health Dashboard** with performance metrics
 **Database Backup System** with automated scheduling
 **Content Filtering** with automated moderation alerts
 **Role-based Permissions** with granular access control
 **Professional UI/UX** with consistent MUI design
 **Visit Website Button** in admin header for easy navigation

## Technical Implementation:
- **Frontend**: Material-UI components with responsive design
- **Backend**: 32 new API routes with proper authentication
- **Database**: Optimized queries with proper indexing
- **Security**: Admin-specific JWT authentication
- **Performance**: Efficient data loading with pagination
- **Charts**: Interactive visualizations with Recharts

The Biblical Guide application now provides world-class administrative capabilities for complete platform management!

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-23 12:01:34 +00:00

665 lines
19 KiB
Markdown

# Biblical Guide Admin Dashboard - Implementation Plan
## Current Application Analysis
### Existing Infrastructure
- **Framework**: Next.js 15 with App Router
- **Database**: PostgreSQL with Prisma ORM
- **Authentication**: Custom JWT-based auth system
- **UI**: Tailwind CSS + shadcn/ui (main app) + MUI (admin dashboard)
- **Internationalization**: next-intl (English/Romanian)
- **Deployment**: PM2 with production build
### Current Database Schema
The app already has a solid foundation with these models:
- `User` (with role field supporting "admin", "moderator", "user")
- `Session` (JWT token management)
- `ChatConversation` & `ChatMessage` (AI chat system)
- `PrayerRequest` & `Prayer` (prayer wall functionality)
- `Bookmark` & `ChapterBookmark` (user bookmarks)
- `BiblePassage` (Bible content with embeddings)
- `ReadingHistory` (user activity tracking)
### Existing API Endpoints
- Authentication: `/api/auth/*`
- Bible operations: `/api/bible/*`
- Chat system: `/api/chat/*`
- Prayer wall: `/api/prayers/*`
- User management: `/api/user/*`
- Health check: `/api/health`
## Implementation Plan
### Phase 1: Foundation (Week 1)
#### 1.1 Admin Authentication & Authorization
**New API Routes:**
- `POST /api/admin/auth/login` - Admin login (separate from user login)
- `POST /api/admin/auth/logout` - Admin logout
- `GET /api/admin/auth/me` - Get current admin info
**Database Changes:**
```sql
-- Add admin-specific fields to User model
ALTER TABLE "User" ADD COLUMN "adminCreatedAt" TIMESTAMP;
ALTER TABLE "User" ADD COLUMN "adminLastLogin" TIMESTAMP;
ALTER TABLE "User" ADD COLUMN "adminPermissions" TEXT[]; -- ['users', 'content', 'system']
-- Create audit log table
CREATE TABLE "AdminAuditLog" (
"id" TEXT NOT NULL PRIMARY KEY,
"adminId" TEXT NOT NULL,
"action" TEXT NOT NULL,
"resource" TEXT NOT NULL,
"resourceId" TEXT,
"details" JSONB,
"ipAddress" TEXT,
"userAgent" TEXT,
"createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY ("adminId") REFERENCES "User"("id") ON DELETE CASCADE
);
-- Create settings table
CREATE TABLE "AppSettings" (
"id" TEXT NOT NULL PRIMARY KEY,
"key" TEXT NOT NULL UNIQUE,
"value" JSONB NOT NULL,
"updatedBy" TEXT NOT NULL,
"updatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY ("updatedBy") REFERENCES "User"("id")
);
```
**Components to Create:**
- `/app/admin/login/page.tsx` - Admin login page
- `/components/admin/auth/admin-login-form.tsx`
- `/components/admin/layout/admin-layout.tsx`
- `/lib/admin-auth.ts` - Admin authentication utilities
#### 1.2 Basic Admin Dashboard Layout
**New Pages:**
- `/app/admin/page.tsx` - Dashboard overview
- `/app/admin/layout.tsx` - Admin layout with navigation
**Components:**
- `/components/admin/dashboard/overview-cards.tsx`
- `/components/admin/layout/sidebar-nav.tsx`
- `/components/admin/layout/header.tsx`
#### 1.3 Dashboard Overview (Read-only)
**Metrics Cards:**
- Total users count
- Daily active users (last 24h login)
- AI conversations today
- Prayer requests today
**API Routes:**
- `GET /api/admin/stats/overview` - Basic dashboard metrics
- `GET /api/admin/stats/users` - User statistics
### Phase 2: User Management (Week 2)
#### 2.1 User Management Interface
**New Pages:**
- `/app/admin/users/page.tsx` - User list and search
- `/app/admin/users/[id]/page.tsx` - User detail view
**API Routes:**
- `GET /api/admin/users` - List users with filtering
- `GET /api/admin/users/[id]` - Get user details
- `PUT /api/admin/users/[id]/status` - Update user status (suspend/ban)
- `DELETE /api/admin/users/[id]` - Delete user (GDPR)
- `POST /api/admin/users/[id]/reset-password` - Force password reset
**Components:**
- `/components/admin/users/user-table.tsx`
- `/components/admin/users/user-filters.tsx`
- `/components/admin/users/user-detail-modal.tsx`
- `/components/admin/users/user-actions.tsx`
#### 2.2 Content Moderation
**Database Schema Addition:**
```sql
-- Add moderation fields to PrayerRequest
ALTER TABLE "PrayerRequest" ADD COLUMN "moderationStatus" TEXT DEFAULT 'pending'; -- pending, approved, rejected
ALTER TABLE "PrayerRequest" ADD COLUMN "moderatedBy" TEXT;
ALTER TABLE "PrayerRequest" ADD COLUMN "moderatedAt" TIMESTAMP;
ALTER TABLE "PrayerRequest" ADD COLUMN "moderationNote" TEXT;
-- Create content reports table
CREATE TABLE "ContentReport" (
"id" TEXT NOT NULL PRIMARY KEY,
"reporterId" TEXT,
"contentType" TEXT NOT NULL, -- 'prayer', 'chat'
"contentId" TEXT NOT NULL,
"reason" TEXT NOT NULL,
"description" TEXT,
"status" TEXT DEFAULT 'pending', -- pending, resolved, dismissed
"resolvedBy" TEXT,
"resolvedAt" TIMESTAMP,
"createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY ("reporterId") REFERENCES "User"("id"),
FOREIGN KEY ("resolvedBy") REFERENCES "User"("id")
);
```
**New Pages:**
- `/app/admin/moderation/page.tsx` - Moderation queue
- `/app/admin/moderation/prayers/page.tsx` - Prayer moderation
**API Routes:**
- `GET /api/admin/moderation/prayers` - Get prayers pending moderation
- `PUT /api/admin/moderation/prayers/[id]` - Approve/reject prayer
- `GET /api/admin/moderation/reports` - Get content reports
### Phase 3: Analytics & Monitoring (Week 3)
#### 3.1 Analytics Dashboard
**New Pages:**
- `/app/admin/analytics/page.tsx` - Analytics overview
- `/app/admin/analytics/users/page.tsx` - User analytics
- `/app/admin/analytics/engagement/page.tsx` - Engagement metrics
**API Routes:**
- `GET /api/admin/analytics/users` - User growth, retention metrics
- `GET /api/admin/analytics/conversations` - Chat analytics
- `GET /api/admin/analytics/prayers` - Prayer wall analytics
- `GET /api/admin/analytics/bible-usage` - Bible reading stats
**Components:**
- `/components/admin/analytics/growth-chart.tsx` (using MUI X Charts)
- `/components/admin/analytics/engagement-metrics.tsx`
- `/components/admin/analytics/user-segments.tsx`
#### 3.2 AI Chat Monitoring
**Database Schema Addition:**
```sql
-- Add monitoring fields to ChatConversation
ALTER TABLE "ChatConversation" ADD COLUMN "tokensUsed" INTEGER DEFAULT 0;
ALTER TABLE "ChatConversation" ADD COLUMN "costEstimate" DECIMAL(10,4);
ALTER TABLE "ChatConversation" ADD COLUMN "flagged" BOOLEAN DEFAULT FALSE;
ALTER TABLE "ChatConversation" ADD COLUMN "flagReason" TEXT;
-- Create AI usage tracking
CREATE TABLE "AIUsageLog" (
"id" TEXT NOT NULL PRIMARY KEY,
"conversationId" TEXT,
"model" TEXT NOT NULL,
"inputTokens" INTEGER NOT NULL,
"outputTokens" INTEGER NOT NULL,
"cost" DECIMAL(10,4) NOT NULL,
"responseTime" INTEGER, -- milliseconds
"createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY ("conversationId") REFERENCES "ChatConversation"("id")
);
```
**New Pages:**
- `/app/admin/chat/page.tsx` - Chat monitoring overview
- `/app/admin/chat/conversations/page.tsx` - Live conversation feed
- `/app/admin/chat/costs/page.tsx` - Cost tracking
**API Routes:**
- `GET /api/admin/chat/overview` - Chat usage metrics
- `GET /api/admin/chat/conversations` - Recent conversations
- `GET /api/admin/chat/costs` - Cost analysis
- `PUT /api/admin/chat/conversations/[id]/flag` - Flag conversation
### Phase 4: System Administration (Week 4)
#### 4.1 System Settings & Configuration
**New Pages:**
- `/app/admin/settings/page.tsx` - App settings
- `/app/admin/settings/features/page.tsx` - Feature toggles
- `/app/admin/settings/admins/page.tsx` - Admin user management
**API Routes:**
- `GET /api/admin/settings` - Get all settings
- `PUT /api/admin/settings` - Update settings
- `GET /api/admin/system/health` - System health check
- `POST /api/admin/system/maintenance` - Toggle maintenance mode
**Settings Schema:**
```typescript
interface AppSettings {
siteName: string;
supportEmail: string;
aiChatEnabled: boolean;
prayerWallEnabled: boolean;
userRegistrationOpen: boolean;
dailyVerseEnabled: boolean;
aiModel: 'gpt-4' | 'gpt-3.5-turbo';
maxChatsPerUserPerDay: number;
maintenanceMode: boolean;
}
```
#### 4.2 Communications
**Database Schema:**
```sql
CREATE TABLE "EmailTemplate" (
"id" TEXT NOT NULL PRIMARY KEY,
"key" TEXT NOT NULL UNIQUE,
"subject" TEXT NOT NULL,
"bodyHtml" TEXT NOT NULL,
"bodyText" TEXT NOT NULL,
"variables" TEXT[], -- Available template variables
"updatedBy" TEXT NOT NULL,
"updatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY ("updatedBy") REFERENCES "User"("id")
);
CREATE TABLE "EmailCampaign" (
"id" TEXT NOT NULL PRIMARY KEY,
"name" TEXT NOT NULL,
"subject" TEXT NOT NULL,
"bodyHtml" TEXT NOT NULL,
"targetSegment" TEXT NOT NULL, -- 'all', 'active', 'dormant'
"status" TEXT DEFAULT 'draft', -- draft, scheduled, sending, sent
"scheduledAt" TIMESTAMP,
"sentAt" TIMESTAMP,
"recipientCount" INTEGER DEFAULT 0,
"createdBy" TEXT NOT NULL,
"createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY ("createdBy") REFERENCES "User"("id")
);
```
**New Pages:**
- `/app/admin/communications/page.tsx` - Email campaigns
- `/app/admin/communications/templates/page.tsx` - Email templates
## Technical Implementation Details
### Authentication Flow
1. **Admin Login**: Separate from user login, checks `role` field
2. **JWT Enhancement**: Include admin permissions in token
3. **Route Protection**: Middleware checks for admin role
4. **Audit Logging**: Log all admin actions automatically
### Database Migrations
```typescript
// prisma/migrations/add-admin-features.sql
-- Run the SQL statements from each phase above
```
### Middleware Enhancement
```typescript
// Update middleware.ts
const adminPaths = ['/admin'];
const isAdminPath = adminPaths.some(path =>
request.nextUrl.pathname.startsWith(path)
);
if (isAdminPath) {
// Check for admin authentication
// Verify admin role and permissions
}
```
### API Response Standards
```typescript
// Standard admin API response format
interface AdminApiResponse<T> {
success: boolean;
data?: T;
error?: string;
pagination?: {
page: number;
limit: number;
total: number;
};
}
```
### Real-time Features
- **WebSocket Integration**: Extend existing WebSocket for admin notifications
- **Auto-refresh**: Key metrics update every 30 seconds
- **Live Activity Feed**: Real-time user actions display
## Security Implementation
### Access Control
```typescript
// lib/admin-permissions.ts
export enum AdminPermission {
VIEW_USERS = 'users:read',
MANAGE_USERS = 'users:write',
MODERATE_CONTENT = 'content:moderate',
VIEW_ANALYTICS = 'analytics:read',
MANAGE_SYSTEM = 'system:manage'
}
export function hasPermission(user: User, permission: AdminPermission): boolean {
if (user.role === 'admin') return true; // Super admin
return user.adminPermissions?.includes(permission) || false;
}
```
### Audit Logging
```typescript
// lib/admin-audit.ts
export async function logAdminAction(
adminId: string,
action: string,
resource: string,
resourceId?: string,
details?: any,
request?: Request
) {
await prisma.adminAuditLog.create({
data: {
adminId,
action,
resource,
resourceId,
details,
ipAddress: getClientIP(request),
userAgent: request?.headers.get('user-agent')
}
});
}
```
## File Structure
```
app/
├── admin/
│ ├── layout.tsx
│ ├── page.tsx # Dashboard overview
│ ├── login/
│ │ └── page.tsx # Admin login
│ ├── users/
│ │ ├── page.tsx # User management
│ │ └── [id]/
│ │ └── page.tsx # User details
│ ├── moderation/
│ │ ├── page.tsx # Moderation queue
│ │ └── prayers/
│ │ └── page.tsx # Prayer moderation
│ ├── analytics/
│ │ ├── page.tsx # Analytics overview
│ │ ├── users/
│ │ │ └── page.tsx # User analytics
│ │ └── engagement/
│ │ └── page.tsx # Engagement metrics
│ ├── chat/
│ │ ├── page.tsx # Chat monitoring
│ │ ├── conversations/
│ │ │ └── page.tsx # Live conversations
│ │ └── costs/
│ │ └── page.tsx # Cost tracking
│ ├── settings/
│ │ ├── page.tsx # App settings
│ │ ├── features/
│ │ │ └── page.tsx # Feature toggles
│ │ └── admins/
│ │ └── page.tsx # Admin management
│ └── communications/
│ ├── page.tsx # Email campaigns
│ └── templates/
│ └── page.tsx # Email templates
├── api/
│ └── admin/
│ ├── auth/
│ ├── users/
│ ├── moderation/
│ ├── analytics/
│ ├── chat/
│ ├── settings/
│ └── communications/
components/
└── admin/
├── auth/
├── layout/
├── dashboard/
├── users/
├── moderation/
├── analytics/
├── chat/
├── settings/
└── communications/
lib/
├── admin-auth.ts
├── admin-permissions.ts
├── admin-audit.ts
└── admin-utils.ts
```
## Next Steps
1. **Phase 1 Setup** (Week 1):
- Create admin authentication system
- Build basic dashboard layout
- Implement overview metrics
2. **Progressive Enhancement** (Weeks 2-4):
- Add user management features
- Implement content moderation
- Build analytics dashboard
- Add system administration tools
3. **Testing & Security**:
- Unit tests for admin functions
- Security audit of admin routes
- Performance testing with large datasets
4. **Documentation**:
- Admin user guide
- API documentation for admin endpoints
- Deployment and maintenance procedures
## MUI Integration for Admin Dashboard
### Required MUI Packages
```bash
npm install @mui/material @emotion/react @emotion/styled
npm install @mui/x-data-grid @mui/x-charts @mui/x-date-pickers
npm install @mui/icons-material @mui/lab
npm install @fontsource/roboto # MUI default font
```
### Admin Theme Configuration
```typescript
// lib/admin-theme.ts
import { createTheme } from '@mui/material/styles';
export const adminTheme = createTheme({
palette: {
mode: 'light',
primary: {
main: '#1976d2', // Professional blue
contrastText: '#ffffff'
},
secondary: {
main: '#dc004e',
},
background: {
default: '#f5f5f5',
paper: '#ffffff'
},
grey: {
100: '#f5f5f5',
200: '#eeeeee',
300: '#e0e0e0',
400: '#bdbdbd',
500: '#9e9e9e'
}
},
typography: {
fontFamily: ['Roboto', 'Arial', 'sans-serif'].join(','),
h4: {
fontWeight: 600,
fontSize: '1.5rem'
},
h6: {
fontWeight: 500,
fontSize: '1.125rem'
}
},
components: {
MuiCard: {
styleOverrides: {
root: {
boxShadow: '0 2px 8px rgba(0,0,0,0.1)',
borderRadius: 8
}
}
},
MuiDataGrid: {
styleOverrides: {
root: {
border: 'none',
'& .MuiDataGrid-cell': {
borderBottom: '1px solid #f0f0f0'
}
}
}
}
}
});
```
### Key MUI Components for Admin Features
#### Dashboard Overview
- **MUI Card** + **CardContent** for metrics cards
- **MUI Typography** for headings and stats
- **MUI Chip** for status indicators
- **MUI LinearProgress** for loading states
#### User Management
- **MUI Data Grid** with server-side pagination, sorting, filtering
- **MUI Avatar** for user profile pictures
- **MUI Chip** for user status (Active, Suspended, etc.)
- **MUI IconButton** for quick actions (View, Edit, Ban)
- **MUI Dialog** for user detail modals
#### Content Moderation
- **MUI List** + **ListItem** for moderation queue
- **MUI Accordion** for expandable prayer requests
- **MUI ButtonGroup** for Approve/Reject actions
- **MUI Badge** for pending counts
#### Analytics Dashboard
- **MUI X Charts (LineChart, BarChart, PieChart)** for visualizations
- **MUI DatePicker** for date range selection
- **MUI Select** for metric filtering
- **MUI Grid** for responsive chart layout
#### System Administration
- **MUI Switch** for feature toggles
- **MUI Slider** for numeric settings (rate limits)
- **MUI TextField** for configuration values
- **MUI Alert** for system status messages
### Admin Layout Components
```typescript
// components/admin/layout/admin-layout.tsx
import { ThemeProvider } from '@mui/material/styles';
import { CssBaseline, Box, Drawer, AppBar, Toolbar } from '@mui/material';
import { adminTheme } from '@/lib/admin-theme';
export function AdminLayout({ children }: { children: React.ReactNode }) {
return (
<ThemeProvider theme={adminTheme}>
<CssBaseline />
<Box sx={{ display: 'flex' }}>
<AppBar position="fixed">
<Toolbar>
{/* Admin header */}
</Toolbar>
</AppBar>
<Drawer variant="permanent">
{/* Admin navigation */}
</Drawer>
<Box component="main" sx={{ flexGrow: 1, p: 3, mt: 8 }}>
{children}
</Box>
</Box>
</ThemeProvider>
);
}
```
### Data Grid Configuration Example
```typescript
// components/admin/users/user-data-grid.tsx
import { DataGrid, GridColDef, GridActionsCellItem } from '@mui/x-data-grid';
import { Chip, Avatar } from '@mui/material';
import { Visibility, Block, Delete } from '@mui/icons-material';
const columns: GridColDef[] = [
{
field: 'avatar',
headerName: '',
width: 60,
renderCell: (params) => <Avatar src={params.value} />,
sortable: false,
filterable: false
},
{ field: 'email', headerName: 'Email', width: 250 },
{ field: 'name', headerName: 'Name', width: 200 },
{ field: 'createdAt', headerName: 'Joined', width: 120, type: 'date' },
{ field: 'lastLoginAt', headerName: 'Last Active', width: 120, type: 'dateTime' },
{
field: 'role',
headerName: 'Status',
width: 120,
renderCell: (params) => (
<Chip
label={params.value}
color={params.value === 'active' ? 'success' : 'default'}
size="small"
/>
)
},
{
field: 'actions',
type: 'actions',
headerName: 'Actions',
width: 120,
getActions: (params) => [
<GridActionsCellItem icon={<Visibility />} label="View" />,
<GridActionsCellItem icon={<Block />} label="Suspend" />,
<GridActionsCellItem icon={<Delete />} label="Delete" />
]
}
];
```
### Chart Configuration Example
```typescript
// components/admin/analytics/user-growth-chart.tsx
import { LineChart } from '@mui/x-charts/LineChart';
import { Card, CardHeader, CardContent } from '@mui/material';
export function UserGrowthChart({ data }: { data: any[] }) {
return (
<Card>
<CardHeader title="User Growth" />
<CardContent>
<LineChart
width={600}
height={300}
series={[
{
data: data.map(d => d.users),
label: 'Total Users',
color: '#1976d2'
}
]}
xAxis={[
{
scaleType: 'point',
data: data.map(d => d.date)
}
]}
/>
</CardContent>
</Card>
);
}
```
This implementation plan leverages the existing robust infrastructure while adding comprehensive admin capabilities using MUI components for a professional, consistent admin interface, ensuring minimal disruption to the current application.