import { Controller, Get, Body, Param, UseGuards, Query, Patch, Put } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBearerAuth, ApiParam, ApiQuery, ApiHeader } from '@nestjs/swagger'; import { NotificationService } from '../services/notification.service'; import { NotificationPreferenceService } from '../services/notification-preference.service'; import { AuthGuard } from '../../auth/guards/auth.guard'; import { UserId } from '../../../common/decorators/user-id.decorator'; import { AdminAuthGuard } from '../../auth/guards/adminAuth.guard'; import { RestId } from '../../../common/decorators/rest-id.decorator'; import { UpdatePreferenceDto } from '../dto/update-preference.dto'; import { AdminId } from 'src/common/decorators/admin-id.decorator'; @ApiTags('notifications') @Controller() export class NotificationsController { constructor( private readonly notificationService: NotificationService, private readonly preferenceService: NotificationPreferenceService, ) {} @UseGuards(AuthGuard) @ApiBearerAuth() @Get('public/notifications') @ApiOperation({ summary: 'Get user restaurant notifications' }) @ApiHeader({ name: 'X-Slug', required: true, schema: { type: 'string', default: 'zhivan', }, }) @ApiQuery({ name: 'limit', required: false, type: Number }) async getUserNotifications(@UserId() userId: string, @RestId() restaurantId: string, @Query('limit') limit?: number) { return await this.notificationService.findByUserAndRestaurant( userId, restaurantId, limit ? parseInt(limit.toString(), 10) : 50, ); } @UseGuards(AuthGuard) @ApiBearerAuth() @Put('public/notifications/:id') @ApiOperation({ summary: 'Read a notification ' }) @ApiParam({ name: 'id', description: 'Notification ID' }) async readNotificationUser(@RestId() restaurantId: string, @Param('id') id: string, @UserId() userId: string) { await this.notificationService.readNotificationAsUser(id, userId, restaurantId); return { message: 'Notification read successfully' }; } @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Get('admin/notifications') @ApiOperation({ summary: 'Get Admin restaurant notifications' }) @ApiQuery({ name: 'limit', required: false, type: Number }) async getAdminNotifications(@RestId() restaurantId: string, @Query('limit') limit?: number) { return await this.notificationService.findByRestaurant(restaurantId, limit ? parseInt(limit.toString(), 30) : 50); } @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Put('admin/notifications/:id') @ApiOperation({ summary: 'Read a notification ' }) @ApiParam({ name: 'id', description: 'Notification ID' }) async readNotificationAdmin(@RestId() restaurantId: string, @AdminId() adminId: string, @Param('id') id: string) { await this.notificationService.readNotificationAdmin(id, adminId, restaurantId); return { message: 'Notification read successfully' }; } // @UseGuards(AuthGuard) // @ApiBearerAuth() // @Get('public/notifications/:id') // @ApiOperation({ summary: 'Get a notification by ID' }) // @ApiParam({ name: 'id', description: 'Notification ID' }) // async getUserNotification(@Param('id') id: string) { // return this.notificationService.findOne(id); // } // @UseGuards(AdminAuthGuard) // @ApiBearerAuth() // @Post('admin/notifications/send') // @ApiOperation({ summary: 'Send a notification (queued)' }) // async sendNotification(@Body() dto: SendNotificationDto) { // return this.notificationService.sendNotification(dto); // } // @UseGuards(AdminAuthGuard) // @ApiBearerAuth() // @Get('admin/notifications') // @ApiOperation({ summary: 'Get notifications for a restaurant' }) // @ApiQuery({ name: 'limit', required: false, type: Number }) // @ApiQuery({ name: 'notificationType', required: false, type: String }) // async getRestaurantNotifications( // @RestId() restaurantId: string, // @Query('limit') limit?: number, // @Query('notificationType') notificationType?: string, // ) { // if (notificationType) { // return this.notificationService.findByRestaurantAndType( // restaurantId, // notificationType, // limit ? parseInt(limit.toString(), 10) : 50, // ); // } // return this.notificationService.findByRestaurant(restaurantId, limit ? parseInt(limit.toString(), 10) : 50); // } // @UseGuards(AdminAuthGuard) // @ApiBearerAuth() // @Get('admin/notifications/:id') // @ApiOperation({ summary: 'Get a notification by ID' }) // @ApiParam({ name: 'id', description: 'Notification ID' }) // async getNotification(@Param('id') id: string) { // return this.notificationService.findOne(id); // } // @UseGuards(AdminAuthGuard) // @ApiBearerAuth() // @Post('admin/notifications/:id/retry') // @ApiOperation({ summary: 'Retry a failed notification' }) // @ApiParam({ name: 'id', description: 'Notification ID' }) // async retryNotification(@Param('id') id: string) { // await this.notificationService.retryFailedNotification(id); // return { message: 'Notification queued for retry' }; // } // Preference endpoints // @UseGuards(AdminAuthGuard) // @ApiBearerAuth() // @Post('admin/notification-preferences') // @ApiOperation({ summary: 'Create notification preference' }) // createPreference(@RestId() restaurantId: string, @Body() dto: CreatePreferenceDto) { // return this.preferenceService.createOrUpdate(restaurantId, dto); // } @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Get('admin/notification-preferences') @ApiOperation({ summary: 'Get all notification preferences for a restaurant' }) async getPreferences(@RestId() restaurantId: string) { return this.preferenceService.findByRestaurant(restaurantId); } // @UseGuards(AdminAuthGuard) // @ApiBearerAuth() // @Get('admin/notification-preferences/:type') // @ApiOperation({ summary: 'Get a specific notification preference' }) // @ApiParam({ name: 'type', description: 'Notification type' }) // async getPreference(@RestId() restaurantId: string, @Param('type') notificationType: string) { // return this.preferenceService.findByRestaurantAndType(restaurantId, notificationType); // } // @UseGuards(AdminAuthGuard) // @ApiBearerAuth() // @Patch('admin/notification-preferences/:type/enabled') // @ApiOperation({ summary: 'Enable or disable a notification preference' }) // @ApiParam({ name: 'type', description: 'Notification type' }) // async updatePreferenceEnabled( // @RestId() restaurantId: string, // @Param('type') notificationType: string, // @Body('enabled') enabled: boolean, // ) { // return this.preferenceService.updateEnabled(restaurantId, notificationType, enabled); // } @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Patch('admin/notification-preferences/:id') @ApiOperation({ summary: 'Update notification channels' }) @ApiParam({ name: 'id', description: 'Notification preference ID' }) async updatePreference( @RestId() restaurantId: string, @Param('id') preferenceId: string, @Body() dto: UpdatePreferenceDto, ) { return this.preferenceService.updatePreference(preferenceId, restaurantId, dto); } // @UseGuards(AdminAuthGuard) // @ApiBearerAuth() // @Delete('admin/notification-preferences/:id') // @ApiOperation({ summary: 'Delete a notification preference' }) // @ApiParam({ name: 'id', description: 'Notification preference ID' }) // async deletePreference(@RestId() restaurantId: string, @Param('id') preferenceId: string) { // await this.preferenceService.delete(restaurantId, preferenceId); // return { message: 'Preference deleted successfully' }; // } }