Future API design for partner dashboard features
// Current approach const { data: students } = await supabase .from('student_school_interactions') .select('*, students(*)') .eq('school_id', currentSchoolId) .order('created_at', { ascending: false });
// Future API approach const analytics = await api.get('/partner/analytics', { period: '30d', metrics: ['engagement', 'geography', 'quality'] });
// Send message to multiple students await api.post('/partner/messages/bulk', { studentIds: selectedStudents, template: 'scholarship_reminder', personalize: true });
// Get campaign performance const campaign = await api.get('/partner/campaigns/current', { include: ['demographics', 'engagement_funnel', 'top_interests'] });
GET /partner/analytics/overview GET /partner/analytics/students GET /partner/analytics/engagement GET /partner/analytics/geographic POST /partner/analytics/export
GET /partner/students GET /partner/students/:id GET /partner/students/:id/interactions POST /partner/students/filter GET /partner/campaigns/:id/students
GET /partner/conversations GET /partner/conversations/:id/messages POST /partner/messages POST /partner/messages/bulk POST /partner/messages/templates
GET /partner/profile PATCH /partner/profile POST /partner/profile/sections POST /partner/media/upload DELETE /partner/media/:id
GET /partner/scholarships POST /partner/scholarships PATCH /partner/scholarships/:id GET /partner/scholarships/:id/analytics POST /partner/scholarships/:id/archive
GET /partner/team/members POST /partner/team/invite PATCH /partner/team/members/:id DELETE /partner/team/members/:id GET /partner/team/permissions
// 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'); } }
// 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[]; }; }
interface WebhookEvent { event: 'student.liked' | 'message.received' | 'scholarship.saved'; timestamp: Date; data: { studentId: string; entityId: string; metadata: Record<string, any>; }; }