import { Controller, Post, Put, Delete, Body, Param, Get, Query, UseGuards } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiQuery } from '@nestjs/swagger'; import { PushNotificationsService } from './push-notifications.service'; import { RegisterDeviceTokenDto } from './dto/register-device-token.dto'; import { UpdateDeviceTokenDto } from './dto/update-device-token.dto'; import { UpdateTokenUserIdDto } from './dto/update-token-user-id.dto'; import { SendPushNotificationDto } from './dto/send-push-notification.dto'; import { SendPushByTemplateDto } from './dto/send-push-by-template.dto'; import { SendPushToDevicesDto } from './dto/send-push-to-devices.dto'; import { PushResponseDto, BatchPushResponseDto, RegisterTokenResponseDto, UpdateTokenResponseDto, UnregisterTokenResponseDto, UpdateTokenUserIdResponseDto } from './dto/push-response.dto'; import { DevicePushResponseDto, BatchDevicePushResponseDto } from './dto/device-push-response.dto'; import { CurrentUser } from '../common/decorators/current-user.decorator'; import { AccessTokenPayload } from '../users/services/apple-auth.service'; import { JwtAuthGuard } from '../common/guards/jwt-auth.guard'; import { Public } from '../common/decorators/public.decorator'; @ApiTags('推送通知') @Controller('push-notifications') @UseGuards(JwtAuthGuard) export class PushNotificationsController { constructor(private readonly pushNotificationsService: PushNotificationsService) { } @Post('register-token') @ApiOperation({ summary: '注册设备推送令牌' }) @Public() @ApiResponse({ status: 200, description: '注册成功', type: RegisterTokenResponseDto }) async registerToken( @CurrentUser() user: AccessTokenPayload, @Body() registerTokenDto: RegisterDeviceTokenDto, ): Promise { return this.pushNotificationsService.registerToken(registerTokenDto, user?.sub || ''); } @Put('update-token') @Public() @ApiOperation({ summary: '更新设备推送令牌' }) @ApiResponse({ status: 200, description: '更新成功', type: UpdateTokenResponseDto }) async updateToken( @CurrentUser() user: AccessTokenPayload, @Body() updateTokenDto: UpdateDeviceTokenDto, ): Promise { return this.pushNotificationsService.updateToken(user?.sub || '', updateTokenDto); } @Put('update-token-user-id') @ApiOperation({ summary: '更新令牌绑定的用户ID' }) @ApiResponse({ status: 200, description: '更新成功', type: UpdateTokenUserIdResponseDto }) async updateTokenUserId( @CurrentUser() user: AccessTokenPayload, @Body() updateTokenUserIdDto: UpdateTokenUserIdDto, ): Promise { return this.pushNotificationsService.updateTokenUserId(user.sub, updateTokenUserIdDto.deviceToken); } @Delete('unregister-token') @Public() @ApiOperation({ summary: '注销设备推送令牌' }) @ApiResponse({ status: 200, description: '注销成功', type: UnregisterTokenResponseDto }) async unregisterToken( @CurrentUser() user: AccessTokenPayload, @Body() body: { deviceToken: string }, ): Promise { return this.pushNotificationsService.unregisterToken(user?.sub || '', body.deviceToken); } @Post('send') @ApiOperation({ summary: '发送推送通知' }) @ApiResponse({ status: 200, description: '发送成功', type: PushResponseDto }) async sendNotification( @Body() sendNotificationDto: SendPushNotificationDto, ): Promise { return this.pushNotificationsService.sendNotification(sendNotificationDto); } @Post('send-by-template') @ApiOperation({ summary: '使用模板发送推送' }) @ApiResponse({ status: 200, description: '发送成功', type: PushResponseDto }) async sendNotificationByTemplate( @Body() sendByTemplateDto: SendPushByTemplateDto, ): Promise { return this.pushNotificationsService.sendNotificationByTemplate(sendByTemplateDto); } @Post('send-batch') @ApiOperation({ summary: '批量发送推送' }) @ApiResponse({ status: 200, description: '发送成功', type: BatchPushResponseDto }) async sendBatchNotifications( @Body() sendBatchDto: SendPushNotificationDto, ): Promise { return this.pushNotificationsService.sendBatchNotifications(sendBatchDto); } @Post('send-silent') @ApiOperation({ summary: '发送静默推送' }) @ApiResponse({ status: 200, description: '发送成功', type: PushResponseDto }) async sendSilentNotification( @Body() body: { userId: string; payload: any }, ): Promise { return this.pushNotificationsService.sendSilentNotification(body.userId, body.payload); } @Post('send-to-devices') @ApiOperation({ summary: '向指定设备发送推送通知' }) @ApiResponse({ status: 200, description: '发送成功', type: DevicePushResponseDto }) async sendNotificationToDevices( @Body() sendToDevicesDto: SendPushToDevicesDto, ): Promise { return this.pushNotificationsService.sendNotificationToDevices(sendToDevicesDto); } @Post('send-batch-to-devices') @ApiOperation({ summary: '批量向指定设备发送推送通知' }) @ApiResponse({ status: 200, description: '发送成功', type: BatchDevicePushResponseDto }) async sendBatchNotificationToDevices( @Body() sendBatchToDevicesDto: SendPushToDevicesDto, ): Promise { return this.pushNotificationsService.sendBatchNotificationToDevices(sendBatchToDevicesDto); } }