feat: добавил личные уведомления для пользователей
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Successful in 9s
🚀 Create and publish a Docker image / Build & publish backend image (push) Successful in 26s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Successful in 19s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Successful in 8s

Реализовал хранение, получение и отметку прочитанными пользовательских уведомлений. Обновил фронтенд для отображения и управления уведомлениями в профиле студента.
This commit is contained in:
2026-05-12 23:54:55 +03:00
parent feff77b232
commit b0a4a6d259
19 changed files with 401 additions and 10 deletions
+9
View File
@@ -16,6 +16,7 @@ import type {
UserAchievementDto,
UserDto,
UserQuery,
UserNotificationDto,
UserStatsDto,
} from './types'
@@ -85,6 +86,14 @@ export const achievementsApi = {
},
}
export const notificationsApi = {
async list() {
const payload = await apiRequest<PagedResult<UserNotificationDto> | UserNotificationDto[]>('/notifications')
return extractItems(payload)
},
markAllRead: () => apiRequest<void>('/notifications/read-all', { method: 'PATCH' }),
}
export const reviewsApi = {
create: (lectureId: string | number, rating: 'Like' | 'Neutral' | 'Dislike', text: string) =>
apiRequest<ReviewDto>('/reviews', {
+13 -1
View File
@@ -1,4 +1,4 @@
import type { Achievement, CoinTransaction, Lecture, Review, User, UserRole } from '@/types'
import type { Achievement, CoinTransaction, Lecture, Notification, Review, User, UserRole } from '@/types'
import type {
AchievementDto,
CoinTransactionDto,
@@ -8,6 +8,7 @@ import type {
UserDto,
UserStatsDto,
UserAchievementDto,
UserNotificationDto,
} from './types'
export function mapApiRole(role: string | undefined): UserRole {
@@ -127,3 +128,14 @@ export function mapApiCoinTransaction(transaction: CoinTransactionDto): CoinTran
type: transaction.amount >= 0 ? 'earned' : 'spent',
}
}
export function mapApiNotification(notification: UserNotificationDto): Notification {
return {
id: String(notification.id),
type: notification.type,
title: notification.title,
body: notification.body,
read: notification.isRead,
createdAt: notification.createdAt,
}
}
+9
View File
@@ -185,6 +185,15 @@ export interface CoinTransactionDto {
createdAt: string
}
export interface UserNotificationDto {
id: number
type: 'reminder' | 'schedule-change' | 'achievement' | 'coins' | 'recommendation'
title: string
body: string
isRead: boolean
createdAt: string
}
export interface LectureQuery {
DateFrom?: string
DateTo?: string