summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/NotificationService.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-09-18 03:27:08 +0900
committerGitHub <noreply@github.com>2022-09-18 03:27:08 +0900
commitb75184ec8e3436200bacdcd832e3324702553d20 (patch)
tree8b7e316f29e95df921db57289c8b8da476d18f07 /packages/backend/src/core/NotificationService.ts
parentUpdate ROADMAP.md (diff)
downloadsharkey-b75184ec8e3436200bacdcd832e3324702553d20.tar.gz
sharkey-b75184ec8e3436200bacdcd832e3324702553d20.tar.bz2
sharkey-b75184ec8e3436200bacdcd832e3324702553d20.zip
なんかもうめっちゃ変えた
Diffstat (limited to 'packages/backend/src/core/NotificationService.ts')
-rw-r--r--packages/backend/src/core/NotificationService.ts67
1 files changed, 67 insertions, 0 deletions
diff --git a/packages/backend/src/core/NotificationService.ts b/packages/backend/src/core/NotificationService.ts
new file mode 100644
index 0000000000..44957d62d3
--- /dev/null
+++ b/packages/backend/src/core/NotificationService.ts
@@ -0,0 +1,67 @@
+import { Inject, Injectable } from '@nestjs/common';
+import { In } from 'typeorm';
+import { DI } from '@/di-symbols.js';
+import { NotificationsRepository } from '@/models/index.js';
+import type { UsersRepository } from '@/models/index.js';
+import type { User } from '@/models/entities/User.js';
+import type { Notification } from '@/models/entities/Notification.js';
+import { UserEntityService } from './entities/UserEntityService.js';
+import { GlobalEventService } from './GlobalEventService.js';
+import { PushNotificationService } from './PushNotificationService.js';
+
+@Injectable()
+export class NotificationService {
+ constructor(
+ @Inject(DI.notificationsRepository)
+ private notificationsRepository: NotificationsRepository,
+
+ private userEntityService: UserEntityService,
+ private globalEventService: GlobalEventService,
+ private pushNotificationService: PushNotificationService,
+ ) {
+ }
+
+ public async readNotification(
+ userId: User['id'],
+ notificationIds: Notification['id'][],
+ ) {
+ if (notificationIds.length === 0) return;
+
+ // Update documents
+ const result = await this.notificationsRepository.update({
+ notifieeId: userId,
+ id: In(notificationIds),
+ isRead: false,
+ }, {
+ isRead: true,
+ });
+
+ if (result.affected === 0) return;
+
+ if (!await this.userEntityService.getHasUnreadNotification(userId)) return this.#postReadAllNotifications(userId);
+ else return this.#postReadNotifications(userId, notificationIds);
+ }
+
+ public async readNotificationByQuery(
+ userId: User['id'],
+ query: Record<string, any>,
+ ) {
+ const notificationIds = await this.notificationsRepository.findBy({
+ ...query,
+ notifieeId: userId,
+ isRead: false,
+ }).then(notifications => notifications.map(notification => notification.id));
+
+ return this.readNotification(userId, notificationIds);
+ }
+
+ #postReadAllNotifications(userId: User['id']) {
+ this.globalEventService.publishMainStream(userId, 'readAllNotifications');
+ return this.pushNotificationService.pushNotification(userId, 'readAllNotifications', undefined);
+ }
+
+ #postReadNotifications(userId: User['id'], notificationIds: Notification['id'][]) {
+ this.globalEventService.publishMainStream(userId, 'readNotifications', notificationIds);
+ return this.pushNotificationService.pushNotification(userId, 'readNotifications', { notificationIds });
+ }
+}