Files
IdP/apps/api-gateway/src/controllers/notifications.controller.ts
2026-06-24 14:37:15 +03:00

83 lines
3.3 KiB
TypeScript

import { Body, Controller, Delete, Get, Headers, Param, Patch, Post, Query } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { firstValueFrom } from 'rxjs';
import { map } from 'rxjs/operators';
import { CoreGrpcService } from '../core-grpc.service';
import { getAuthorizedUserId } from '../document-access';
import { MarkNotificationReadDto } from '../dto/notifications.dto';
@ApiTags('Уведомления')
@ApiBearerAuth()
@Controller('notifications')
export class NotificationsController {
constructor(
private readonly core: CoreGrpcService,
private readonly jwt: JwtService
) {}
@Get()
@ApiOperation({ summary: 'Список уведомлений' })
async list(
@Headers('authorization') authorization: string | undefined,
@Query('limit') limit?: string,
@Query('unreadOnly') unreadOnly?: string
) {
const userId = await getAuthorizedUserId(this.jwt, this.core, authorization);
return firstValueFrom(
this.core.notifications.ListNotifications({
userId,
limit: limit ? Number(limit) : 30,
unreadOnly: unreadOnly === 'true'
}).pipe(
map((response) => {
const payload = response as { notifications?: unknown[] };
return { notifications: payload.notifications ?? [] };
})
)
);
}
@Get('unread-count')
@ApiOperation({ summary: 'Количество непрочитанных уведомлений' })
async unreadCount(@Headers('authorization') authorization: string | undefined) {
const userId = await getAuthorizedUserId(this.jwt, this.core, authorization);
return firstValueFrom(this.core.notifications.GetUnreadCount({ userId }));
}
@Patch(':notificationId/read')
@ApiOperation({ summary: 'Удалить просмотренное уведомление' })
async markRead(
@Headers('authorization') authorization: string | undefined,
@Param('notificationId') notificationId: string,
@Body() _dto: MarkNotificationReadDto
) {
const userId = await getAuthorizedUserId(this.jwt, this.core, authorization);
return firstValueFrom(this.core.notifications.DeleteNotification({ userId, notificationId }));
}
@Delete(':notificationId')
@ApiOperation({ summary: 'Удалить уведомление' })
async deleteNotification(
@Headers('authorization') authorization: string | undefined,
@Param('notificationId') notificationId: string
) {
const userId = await getAuthorizedUserId(this.jwt, this.core, authorization);
return firstValueFrom(this.core.notifications.DeleteNotification({ userId, notificationId }));
}
@Post('read-all')
@ApiOperation({ summary: 'Удалить все уведомления' })
async markAllRead(@Headers('authorization') authorization: string | undefined) {
const userId = await getAuthorizedUserId(this.jwt, this.core, authorization);
return firstValueFrom(this.core.notifications.DeleteAllNotifications({ userId }));
}
@Delete()
@ApiOperation({ summary: 'Удалить все уведомления' })
async deleteAll(@Headers('authorization') authorization: string | undefined) {
const userId = await getAuthorizedUserId(this.jwt, this.core, authorization);
return firstValueFrom(this.core.notifications.DeleteAllNotifications({ userId }));
}
}