| 62 | @Throttle({ signup: { limit: 20, ttl: 3600000 } }) // 20 signups per hour |
| 63 | @Post('signup') |
| 64 | async signup(@Request() req, @Response() res, @Body() signupDto: SignupDto) { |
| 65 | const ipAddress = req.ip || req.connection.remoteAddress; |
| 66 | const userAgent = req.get('User-Agent'); |
| 67 | |
| 68 | const result = await this.authService.signup( |
| 69 | signupDto, |
| 70 | ipAddress, |
| 71 | userAgent, |
| 72 | ); |
| 73 | |
| 74 | // Set httpOnly cookies |
| 75 | res.cookie('access_token', result.access_token, { |
| 76 | httpOnly: true, |
| 77 | secure: process.env.NODE_ENV === 'production', |
| 78 | sameSite: process.env.NODE_ENV === 'production' ? 'none' : 'lax', |
| 79 | maxAge: 15 * 60 * 1000, // 15 minutes |
| 80 | }); |
| 81 | |
| 82 | res.cookie('refresh_token', result.refresh_token, { |
| 83 | httpOnly: true, |
| 84 | secure: process.env.NODE_ENV === 'production', |
| 85 | sameSite: process.env.NODE_ENV === 'production' ? 'none' : 'lax', |
| 86 | maxAge: 7 * 24 * 60 * 60 * 1000, // 7 days |
| 87 | }); |
| 88 | |
| 89 | return res.json({ user: result.user }); |
| 90 | } |
| 91 | |
| 92 | @UseGuards(JwtAuthGuard) |
| 93 | @Get('me') |