/** * UserController - Example with analytics tracking * * Demonstrates various tracking patterns in a NestJS controller. */ import { Controller, Post, Get, Body, Param, Request, Inject, UseInterceptors, } from '@nestjs/common'; import { BackendAnalyticsClient } from '@analytics/client'; import { ANALYTICS_CLIENT } from './analytics.module'; import { AnalyticsInterceptor } from './analytics.interceptor'; import { TrackAnalytics } from './track-analytics.decorator'; // ───────────────────────────────────────────────────────────────────────────── // DTOs // ───────────────────────────────────────────────────────────────────────────── interface SignupDto { email: string; name: string; plan?: string; } interface User { id: string; email: string; name: string; plan: string; } // ───────────────────────────────────────────────────────────────────────────── // Controller // ───────────────────────────────────────────────────────────────────────────── @Controller('users') @UseInterceptors(AnalyticsInterceptor) // Track all requests export class UserController { constructor( @Inject(ANALYTICS_CLIENT) private readonly analytics: BackendAnalyticsClient, ) {} /** * Signup endpoint with automatic tracking via decorator. */ @Post('signup') @TrackAnalytics({ event: 'user_signup', category: 'auth', extractMetadata: ({ result }) => ({ userId: result.id, plan: result.plan, emailDomain: result.email.split('@')[1], }), }) async signup(@Body() dto: SignupDto): Promise { // Your signup logic here const user: User = { id: `usr_${Date.now()}`, email: dto.email, name: dto.name, plan: dto.plan || 'free', }; return user; } /** * Profile view with manual tracking. * * Use manual tracking when you need more control. */ @Get(':id') async getProfile(@Param('id') id: string, @Request() req: any): Promise { // Your fetch logic here const user: User = { id, email: 'user@example.com', name: 'Example User', plan: 'pro', }; // Manual tracking with full context this.analytics.trackEngagement({ sessionId: req.headers['x-session-id'] || 'unknown', userId: req.user?.id, // Viewer's ID type: 'profile_view', action: 'view', metadata: { viewedProfileId: id, viewedUserPlan: user.plan, viewerIsAuthenticated: Boolean(req.user), }, }); return user; } /** * Upgrade plan with funnel tracking. */ @Post(':id/upgrade') async upgradePlan( @Param('id') id: string, @Body() body: { plan: string }, @Request() req: any, ): Promise<{ success: boolean }> { const sessionId = req.headers['x-session-id'] || 'unknown'; // Track upgrade funnel step this.analytics.trackEngagement({ sessionId, userId: id, type: 'funnel_step', action: 'plan_upgrade', metadata: { funnelId: 'upgrade', step: 'upgrade_completed', fromPlan: 'free', // You'd fetch this from DB toPlan: body.plan, }, }); return { success: true }; } /** * Account deletion with GDPR tracking. */ @Post(':id/delete') async deleteAccount(@Param('id') id: string, @Request() req: any): Promise<{ deleted: boolean }> { const sessionId = req.headers['x-session-id'] || 'unknown'; // Track before deletion (important for compliance) this.analytics.trackEngagement({ sessionId, userId: id, type: 'account_action', action: 'deletion_requested', metadata: { requestedBy: req.user?.id === id ? 'self' : 'admin', gdprRequest: true, }, }); // Your deletion logic here return { deleted: true }; } }