diff --git a/microservices/authorization/migrations/permissions/list/methods/notification.json b/microservices/authorization/migrations/permissions/list/methods/notification.json index 05f53c35..901343c5 100644 --- a/microservices/authorization/migrations/permissions/list/methods/notification.json +++ b/microservices/authorization/migrations/permissions/list/methods/notification.json @@ -232,6 +232,19 @@ "modelOut": "notification.HideAllOutput", "methodFilters": [] }, + { + "microservice": "notification", + "method": "notice.view-all", + "description": "Notifications multiple set as viewed", + "allowGroup": [ + "user" + ], + "denyGroup": [], + "createdAt": "2025-07-24T12:00:00.000Z", + "modelIn": "notification.ViewAllInput", + "modelOut": "notification.ViewAllOutput", + "methodFilters": [] + }, { "microservice": "notification", "method": "task.count", diff --git a/microservices/authorization/migrations/permissions/list/models/notification.json b/microservices/authorization/migrations/permissions/list/models/notification.json index fbbd23a3..e70e943d 100644 --- a/microservices/authorization/migrations/permissions/list/models/notification.json +++ b/microservices/authorization/migrations/permissions/list/models/notification.json @@ -520,6 +520,49 @@ }, "createdAt": "2023-09-20T18:49:48.824Z" }, + { + "microservice": "notification", + "alias": "notification.ViewAllInput", + "title": "View All Input", + "schema": { + "userId": { + "in": { + "admin": "allow", + "user": { + "condition": "Fields: user owner" + } + }, + "out": { + "user": "allow" + } + } + }, + "createdAt": "2025-07-24T12:00:00.000Z" + }, + { + "microservice": "notification", + "alias": "notification.ViewAllOutput", + "title": "View All Output", + "schema": { + "status": { + "in": { + "admin": "allow" + }, + "out": { + "user": "allow" + } + }, + "affected": { + "in": { + "admin": "allow" + }, + "out": { + "user": "allow" + } + } + }, + "createdAt": "2025-07-24T12:00:00.000Z" + }, { "microservice": "notification", "alias": "notification.Task", diff --git a/microservices/notification/src/methods/index.ts b/microservices/notification/src/methods/index.ts index 368655fb..5a76f598 100644 --- a/microservices/notification/src/methods/index.ts +++ b/microservices/notification/src/methods/index.ts @@ -8,6 +8,7 @@ import FcmTokenSave from '@methods/fcm-token/save'; import CrudMessage from '@methods/messages/crud'; import CrudNotice from '@methods/notice/crud'; import { hideAll as NoticeHideAll } from '@methods/notice/hide-all'; +import { viewAll as NoticeViewAll } from '@methods/notice/view-all'; import PhoneSend from '@methods/phone/send'; import PushSend from '@methods/push/send'; import CrudTask from '@methods/task/crud'; @@ -21,6 +22,7 @@ export default (ms: Microservice): void => { notice: { ...CrudNotice, 'hide-all': NoticeHideAll, + 'view-all': NoticeViewAll, }, task: CrudTask, }; diff --git a/microservices/notification/src/methods/notice/view-all.ts b/microservices/notification/src/methods/notice/view-all.ts new file mode 100644 index 00000000..1c458e0b --- /dev/null +++ b/microservices/notification/src/methods/notice/view-all.ts @@ -0,0 +1,31 @@ +import { Endpoint, IsUndefinable } from '@lomray/microservice-helpers'; +import { IsBoolean, IsNumber, IsString } from 'class-validator'; +import Notice from '@services/notice'; + +class ViewAllInput { + @IsString() + userId: string; +} + +class ViewAllOutput { + @IsBoolean() + status: boolean; + + @IsNumber() + @IsUndefinable() + affected?: number; +} + +/** + * View all user's notifications + */ +const viewAll = Endpoint.custom( + () => ({ + input: ViewAllInput, + output: ViewAllOutput, + description: 'Notifications multiple view', + }), + ({ userId }) => Notice.init().viewAll(userId), +); + +export { viewAll, ViewAllOutput, ViewAllInput }; diff --git a/microservices/notification/src/services/notice/index.ts b/microservices/notification/src/services/notice/index.ts index 24032527..d9ac51be 100644 --- a/microservices/notification/src/services/notice/index.ts +++ b/microservices/notification/src/services/notice/index.ts @@ -1,6 +1,7 @@ import { EntityManager, getManager } from 'typeorm'; import NoticeEntity from '@entities/notice'; import type { HideAllOutput } from '@methods/notice/hide-all'; +import type { ViewAllInput, ViewAllOutput } from '@methods/notice/view-all'; /** * Notice service @@ -51,6 +52,33 @@ class Notice { affected, }; } + + /** + * View all user's notifications + */ + public async viewAll(userId?: ViewAllInput['userId']): Promise { + if (!userId) { + return { + status: false, + }; + } + + const repository = this.manager.getRepository(NoticeEntity); + const { affected } = await repository.update( + { + userId, + isViewed: false, + }, + { + isViewed: true, + }, + ); + + return { + status: true, + affected, + }; + } } export default Notice;