From 7b250b20b87f00d3b012b0d54222d5f772e1a097 Mon Sep 17 00:00:00 2001 From: MishkaRogachev Date: Fri, 24 Feb 2023 14:40:44 +0400 Subject: [PATCH] feat(ActivityCenter): Move group logic to nim service layer --- src/app/modules/main/activity_center/view.nim | 5 ++- .../service/activity_center/async_tasks.nim | 3 +- .../activity_center/dto/notification.nim | 42 +++++++++++++++---- .../service/activity_center/service.nim | 23 ++++++---- src/backend/backend.nim | 14 +++---- 5 files changed, 60 insertions(+), 27 deletions(-) diff --git a/src/app/modules/main/activity_center/view.nim b/src/app/modules/main/activity_center/view.nim index f6cf90be64..7500aaf42d 100644 --- a/src/app/modules/main/activity_center/view.nim +++ b/src/app/modules/main/activity_center/view.nim @@ -161,9 +161,12 @@ QtObject: proc activityCenterReadTypeChanged*(self: View) {.signal.} + proc groupCountersChanged*(self: View) {.signal.} + proc setActivityCenterReadType*(self: View, readType: int) {.slot.} = self.delegate.setActivityCenterReadType(readType) self.activityCenterReadTypeChanged() + self.groupCountersChanged() proc getActivityCenterReadType*(self: View): int {.slot.} = return self.delegate.getActivityCenterReadType() @@ -173,8 +176,6 @@ QtObject: write = setActivityCenterReadType notify = activityCenterReadTypeChanged - proc groupCountersChanged*(self: View) {.signal.} - proc getAdminCount*(self: View): int {.slot.} = return self.delegate.getAdminCount() diff --git a/src/app_service/service/activity_center/async_tasks.nim b/src/app_service/service/activity_center/async_tasks.nim index 0db4a821bb..fc27458cb4 100644 --- a/src/app_service/service/activity_center/async_tasks.nim +++ b/src/app_service/service/activity_center/async_tasks.nim @@ -10,7 +10,8 @@ type const asyncActivityNotificationLoadTask: Task = proc(argEncoded: string) {.gcsafe, nimcall.} = let arg = decode[AsyncActivityNotificationLoadTaskArg](argEncoded) - let activityNotificationsCallResult = backend.activityCenterNotificationsByGroup(newJString(arg.cursor), arg.limit, arg.group.int, arg.readType.int) + let groupTypes = activityCenterNotificationTypesByGroup(arg.group) + let activityNotificationsCallResult = backend.activityCenterNotificationsBy(newJString(arg.cursor), arg.limit, groupTypes, arg.readType.int, true) let responseJson = %*{ "activityNotifications": activityNotificationsCallResult.result diff --git a/src/app_service/service/activity_center/dto/notification.nim b/src/app_service/service/activity_center/dto/notification.nim index c63ffc2802..080d237dca 100644 --- a/src/app_service/service/activity_center/dto/notification.nim +++ b/src/app_service/service/activity_center/dto/notification.nim @@ -125,11 +125,37 @@ proc parseActivityCenterNotifications*(rpcResult: JsonNode): (string, seq[Activi notifs.add(jsonMsg.toActivityCenterNotificationDto()) return (rpcResult{"cursor"}.getStr, notifs) -proc toActivityCenterNotificationTypeList*(rpcResult: JsonNode): seq[ActivityCenterNotificationType] = - var types: seq[ActivityCenterNotificationType] = @[] - for jsonObj in rpcResult: - var notificationTypeInt = jsonObj.getInt() - if notificationTypeInt >= ord(low(ActivityCenterNotificationType)) and - notificationTypeInt <= ord(high(ActivityCenterNotificationType)): - types.add(ActivityCenterNotificationType(notificationTypeInt)) - return types \ No newline at end of file +proc activityCenterNotificationTypesByGroup*(group: ActivityCenterGroup) : seq[int] = + case group + of ActivityCenterGroup.All: + return @[ + ActivityCenterNotificationType.NewPrivateGroupChat.int, + ActivityCenterNotificationType.Mention.int, + ActivityCenterNotificationType.Reply.int, + ActivityCenterNotificationType.ContactRequest.int, + ActivityCenterNotificationType.CommunityInvitation.int, + ActivityCenterNotificationType.CommunityRequest.int, + ActivityCenterNotificationType.CommunityMembershipRequest.int, + ActivityCenterNotificationType.CommunityKicked.int, + ActivityCenterNotificationType.ContactVerification.int + ] + of ActivityCenterGroup.Mentions: + return @[ActivityCenterNotificationType.Mention.int] + of ActivityCenterGroup.Replies: + return @[ActivityCenterNotificationType.Reply.int] + of ActivityCenterGroup.Membership: + return @[ + ActivityCenterNotificationType.NewPrivateGroupChat.int, + ActivityCenterNotificationType.CommunityInvitation.int, + ActivityCenterNotificationType.CommunityRequest.int, + ActivityCenterNotificationType.CommunityMembershipRequest.int, + ActivityCenterNotificationType.CommunityKicked.int + ] + of ActivityCenterGroup.Admin: + return @[ActivityCenterNotificationType.CommunityMembershipRequest.int] + of ActivityCenterGroup.ContactRequests: + return @[ActivityCenterNotificationType.ContactRequest.int] + of ActivityCenterGroup.IdentityVerification: + return @[ActivityCenterNotificationType.ContactVerification.int] + else: + return @[] diff --git a/src/app_service/service/activity_center/service.nim b/src/app_service/service/activity_center/service.nim index 030f012035..5d1ddf6773 100644 --- a/src/app_service/service/activity_center/service.nim +++ b/src/app_service/service/activity_center/service.nim @@ -80,10 +80,9 @@ QtObject: proc handleNewNotificationsLoaded(self: Service, activityCenterNotifications: seq[ActivityCenterNotificationDto]) = # For now status-go notify about every notification update regardless active group so we need filter manulay on the desktop side - let response = backend.activityCenterTypesByGroup(self.activeGroup.int) # NOTE: no error for trivial call - var groupTypes = toActivityCenterNotificationTypeList(response.result) - var filteredNotifications = filter(activityCenterNotifications, proc(notification: ActivityCenterNotificationDto): bool = - return (self.readType == ActivityCenterReadType.All or not notification.read) and groupTypes.contains(notification.notificationType) + let groupTypes = activityCenterNotificationTypesByGroup(self.activeGroup) + let filteredNotifications = filter(activityCenterNotifications, proc(notification: ActivityCenterNotificationDto): bool = + return (self.readType == ActivityCenterReadType.All or not notification.read) and groupTypes.contains(notification.notificationType.int) ) if (filteredNotifications.len > 0): @@ -145,15 +144,21 @@ QtObject: else: cursorVal = newJString(self.cursor) - let callResult = backend.activityCenterNotificationsByGroup(cursorVal, DEFAULT_LIMIT, self.activeGroup.int, self.readType.int) - let activityCenterNotificationsTuple = parseActivityCenterNotifications(callResult.result) + try: + let groupTypes = activityCenterNotificationTypesByGroup(self.activeGroup) + let callResult = backend.activityCenterNotificationsBy(cursorVal, DEFAULT_LIMIT, groupTypes, self.readType.int, true) + let activityCenterNotificationsTuple = parseActivityCenterNotifications(callResult.result) - self.cursor = activityCenterNotificationsTuple[0]; - result = activityCenterNotificationsTuple[1] + self.cursor = activityCenterNotificationsTuple[0]; + result = activityCenterNotificationsTuple[1] + + except Exception as e: + error "Error getting activity center notifications", msg = e.msg proc getActivityGroupCounter*(self: Service, group: ActivityCenterGroup): int = try: - let response = backend.activityCenterNotificationsByGroupCount(group.int) + let groupTypes = activityCenterNotificationTypesByGroup(group) + let response = backend.activityCenterNotificationsCountBy(groupTypes, self.readType.int, true) if response.result.kind != JNull: return response.result.getInt diff --git a/src/backend/backend.nim b/src/backend/backend.nim index 95683e2997..851720df88 100644 --- a/src/backend/backend.nim +++ b/src/backend/backend.nim @@ -165,17 +165,17 @@ rpc(activityCenterNotifications, "wakuext"): cursorVal: JsonNode limit: int -rpc(activityCenterNotificationsByGroup, "wakuext"): +rpc(activityCenterNotificationsBy, "wakuext"): cursorVal: JsonNode limit: int - group: int + activityTypes: seq[int] readType: int + accepted: bool -rpc(activityCenterNotificationsByGroupCount, "wakuext"): - group: int - -rpc(activityCenterTypesByGroup, "wakuext"): - group: int +rpc(activityCenterNotificationsCountBy, "wakuext"): + activityTypes: seq[int] + readType: int + accepted: bool rpc(markAllActivityCenterNotificationsRead, "wakuext"): discard