Partner Dashboard API Vision
This document outlines a potential future API design for partner features. Currently, the partner dashboard communicates directly with Supabase.
This is a design reference document. These endpoints do not currently exist. The partner dashboard uses Supabase SDK for all operations.
Current Implementation
The partner dashboard currently:
- Uses Supabase JavaScript SDK
- Implements Row Level Security (RLS) for permissions
- Queries database tables directly
- Handles real-time subscriptions via Supabase
// Current approach
const { data: students } = await supabase
.from('student_school_interactions')
.select('*, students(*)')
.eq('school_id', currentSchoolId)
.order('created_at', { ascending: false });
Future API Benefits
A dedicated Partner API could provide:
1. Simplified Analytics
Instead of complex joins:
// Future API approach
const analytics = await api.get('/partner/analytics', {
period: '30d',
metrics: ['engagement', 'geography', 'quality']
});
2. Batch Operations
Enable bulk messaging and actions:
// Send message to multiple students
await api.post('/partner/messages/bulk', {
studentIds: selectedStudents,
template: 'scholarship_reminder',
personalize: true
});
3. Aggregated Data
Pre-computed metrics and insights:
// Get campaign performance
const campaign = await api.get('/partner/campaigns/current', {
include: ['demographics', 'engagement_funnel', 'top_interests']
});
Proposed Endpoint Structure
Analytics & Reporting
GET /partner/analytics/overview
GET /partner/analytics/students
GET /partner/analytics/engagement
GET /partner/analytics/geographic
POST /partner/analytics/export
Student Management
GET /partner/students
GET /partner/students/:id
GET /partner/students/:id/interactions
POST /partner/students/filter
GET /partner/campaigns/:id/students
Messaging
GET /partner/conversations
GET /partner/conversations/:id/messages
POST /partner/messages
POST /partner/messages/bulk
POST /partner/messages/templates
Profile & Content
GET /partner/profile
PATCH /partner/profile
POST /partner/profile/sections
POST /partner/media/upload
DELETE /partner/media/:id
Scholarships
GET /partner/scholarships
POST /partner/scholarships
PATCH /partner/scholarships/:id
GET /partner/scholarships/:id/analytics
POST /partner/scholarships/:id/archive
Team Management
GET /partner/team/members
POST /partner/team/invite
PATCH /partner/team/members/:id
DELETE /partner/team/members/:id
GET /partner/team/permissions
Design Patterns
Permission Scoping
// Middleware to handle entity permissions
async function checkEntityAccess(req: Request) {
const entityId = req.headers['x-entity-id'];
const userId = req.user.id;
const hasAccess = await checkUserEntityPermission(userId, entityId);
if (!hasAccess) {
throw new ForbiddenError('No access to this entity');
}
}
Response Enrichment
// Enrich student data with computed fields
interface EnrichedStudent {
id: string;
profile: StudentProfile;
interaction: {
type: 'view' | 'like' | 'dislike';
date: Date;
matchScore: number;
matchGrade: string;
};
insights: {
engagementLevel: 'high' | 'medium' | 'low';
responseRate: number;
interests: string[];
};
}
Webhook Events
Partners could subscribe to events:
interface WebhookEvent {
event: 'student.liked' | 'message.received' | 'scholarship.saved';
timestamp: Date;
data: {
studentId: string;
entityId: string;
metadata: Record<string, any>;
};
}
Implementation Considerations
- Cache frequently accessed data (analytics, school profiles)
- Use database views for complex queries
- Implement pagination for large datasets
- Queue bulk operations
Security
- Entity-based access control
- Rate limiting per organization
- Audit logging for all actions
- Input validation and sanitization
Developer Experience
- TypeScript SDK with full type safety
- Comprehensive error messages
- Request/response examples
- Interactive API documentation
Migration Path
If implementing this API:
-
Phase 1: Create read-only endpoints
- Analytics and reporting
- Student lists and profiles
-
Phase 2: Add write operations
- Messaging
- Profile updates
- Scholarship management
-
Phase 3: Advanced features
- Webhooks
- Bulk operations
- Custom integrations
Current Alternative
For now, partners can achieve similar functionality using:
- Supabase RPC functions for complex queries
- Database views for aggregated data
- Edge Functions for custom logic
- Real-time subscriptions for live updates
See Web App Architecture for current implementation details.