Service - Notification Manager: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 16: | Line 16: | ||
* notificationGroupId | * notificationGroupId | ||
: type: string | : type: string | ||
: | : comes from: random UUID | ||
; sort key | ; sort key | ||
* time | * time | ||
Line 72: | Line 72: | ||
fieldNames: { // see Per Service Schemas | fieldNames: { // see Per Service Schemas | ||
notificationGroupId: {}, | notificationGroupId: {}, | ||
additionalData: {} | additionalData: {}, | ||
recieverTag: {} | |||
}, | }, | ||
identifiers: [ | identifiers: [ | ||
Line 86: | Line 87: | ||
; notificationGroupId (identifier) | ; notificationGroupId (identifier) | ||
: comes from: | : comes from: random UUID | ||
; notificationGroupName | ; notificationGroupName | ||
: string name set by reciever service, optional | : string name set by reciever service, optional | ||
Line 96: | Line 93: | ||
: set by the creating service, gets added to notifications sent to the receiver | : set by the creating service, gets added to notifications sent to the receiver | ||
: eg: can include the actual userId and used to make the groupingId | : eg: can include the actual userId and used to make the groupingId | ||
; receiverTag | |||
: set by the creating service | |||
: eg ContactMethodEmail | |||
; consolidated | ; consolidated | ||
: true|false | : true|false | ||
Line 117: | Line 117: | ||
canDelete: false, | canDelete: false, | ||
complexFilterServiceTag: "complexFilter", | complexFilterServiceTag: "complexFilter", | ||
addOnDataStructure: [ | |||
{ | |||
type: "versionedData", | |||
versionedDataLabel: "notificationSetting", | |||
storageResourceTag: "myGraph", | |||
fieldNames: [ | |||
{ // fieldName in versionedData should now same in main objectSchema | |||
fieldName: "notificationName" | |||
} | |||
] | |||
} | |||
], | |||
overwriteGeneratedMainFunction: ["create", "get", "update"], | overwriteGeneratedMainFunction: ["create", "get", "update"], | ||
storageResources: { | storageResources: { | ||
Line 126: | Line 138: | ||
fieldNames: { | fieldNames: { | ||
notificationId: {}, | notificationId: {}, | ||
}, | }, | ||
identifiers: [ | identifiers: [ | ||
Line 140: | Line 151: | ||
; notificationId (identifier) | ; notificationId (identifier) | ||
: | : comes from: random UUID | ||
; notificationName | ; notificationName | ||
: string name set by reciever service, optional | : string name set by reciever service, optional | ||
Line 146: | Line 157: | ||
=== notificationTrigger === | === notificationTrigger === | ||
<syntaxhighlight lang="JavaScript"> | <syntaxhighlight lang="JavaScript"> | ||
Line 180: | Line 189: | ||
; notificationTriggerId (identifier) | ; notificationTriggerId (identifier) | ||
: | : comes from: random UUID | ||
; propertyName | ; propertyName | ||
: can be a nested property, use dot notation | : can be a nested property, use dot notation | ||
Line 197: | Line 206: | ||
{ | { | ||
objectType: "consolidated", | objectType: "consolidated", | ||
canDelete: | canDelete: true, | ||
complexFilterServiceTag: "complexFilter", | complexFilterServiceTag: "complexFilter", | ||
storageResources: { | storageResources: { | ||
Line 226: | Line 235: | ||
; notificationGroupId (partition key) | ; notificationGroupId (partition key) | ||
: | : comes from: random UUID | ||
: | |||
; time (sort key) | ; time (sort key) | ||
: comes from {timestamp activity handled in Activity Switchboard}_{small random UUID} | : comes from {timestamp activity handled in Activity Switchboard}_{small random UUID} | ||
Line 274: | Line 282: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
: links email to notificationGroup | |||
=== disabled_notificationGroup === | === disabled_notificationGroup === | ||
Line 433: | Line 441: | ||
= | === disabled_notificationTrigger === | ||
<syntaxhighlight lang="JavaScript"> | <syntaxhighlight lang="JavaScript"> | ||
{ | |||
{ | "disabled_notificationTrigger": { | ||
properties: { | |||
" | originTimestamp: {...} | ||
" | }, | ||
storageResources: { | |||
myGraph: { | |||
storageType: "graph", | |||
graphServerTag: "graphHandler" | |||
} | |||
}, | |||
links: [ | |||
{ | |||
storageResourceTags: ["myGraph"], | |||
from: { | |||
objType: { | |||
serviceTag: "NotificationMgr", | |||
objectType: "notification" | |||
}, | |||
linkType: "one", | |||
handler: true | |||
}, | |||
to: { | |||
objType: { | |||
serviceTag: "NotificationMgr", | |||
objType: "notificationTrigger" | |||
}, | |||
linkType: "many", | |||
handler: true | |||
} | |||
} | |||
] | |||
} | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 08:59, 4 July 2024
Overview
Consolidates and sends notifications to any number of receiver services. Will be used for user notifications but can have other types of receiver services added. Activities are received from Activity Switchboard service.
Notification groups set whether activities are considated (eg per day/per month/per x number of activities), if considated activities are stored here until sending is triggered, according to the considation rules. If not consolidated they are sent on immediately.
Repository
https://bitbucket.org/stb_working/notification-manager/src/master/
DynamoDB tables
PendingConsolidation Table
- partition key
- notificationGroupId
- type: string
- comes from: random UUID
- sort key
- time
- type: number
- {timestamp activity handled in Activity Switchboard}_{small random UUID}
Object Schemas
- Additional Information
- Per Service Schemas
objType
notificationGroup
- Groups many notificatons together
- Simplifies management of similar notifications
- Allows for consolidation of notifications at notification group level
{
objectType: "notificationGroup",
canDelete: false,
complexFilterServiceTag: "complexFilter",
addOnDataStructure: [
{
type: "versionedData",
versionedDataLabel: "notificationGroupSetting",
storageResourceTag: "myGraph",
fieldNames: [
{ // fieldName in versionedData should now same in main objectSchema
fieldName: "notificationGroupName"
},
{
fieldName: "consolidated",
},
{
fieldName: "consolidatedType"
},
{
fieldName: "consolidatedFrequency"
},
{
fieldName: "consolidatedSendIfEmpty"
}
]
}
],
overwriteGeneratedMainFunction: ["create", "get", "update"],
storageResources: {
myGraph: {
storageType: "graph",
graphServerTag: "GraphHandler"
}
},
fieldNames: { // see Per Service Schemas
notificationGroupId: {},
additionalData: {},
recieverTag: {}
},
identifiers: [
{
type: "identifier",
fieldName: "notificationGroupId"
}
]
}
fieldNames
- notificationGroupId (identifier)
- comes from: random UUID
- notificationGroupName
- string name set by reciever service, optional
- additionalData
- set by the creating service, gets added to notifications sent to the receiver
- eg: can include the actual userId and used to make the groupingId
- receiverTag
- set by the creating service
- eg ContactMethodEmail
- consolidated
- true|false
- optional, if excluded (or value not true), defaults to false
- consolidatedType
- overview|detailed
- overview sends a count of each type of notification, detailed lists each activity message
- consolidatedFrequency
- not sure, maybe use some sort of standard like cron
- consolidatedNextSendDue
- timestamp for next due time to send notification
- consolidatedSendIfEmpty
- true|false
notification
{
objectType: "notification",
canDelete: false,
complexFilterServiceTag: "complexFilter",
addOnDataStructure: [
{
type: "versionedData",
versionedDataLabel: "notificationSetting",
storageResourceTag: "myGraph",
fieldNames: [
{ // fieldName in versionedData should now same in main objectSchema
fieldName: "notificationName"
}
]
}
],
overwriteGeneratedMainFunction: ["create", "get", "update"],
storageResources: {
myGraph: {
storageType: "graph",
graphServerTag: "GraphHandler"
}
},
fieldNames: {
notificationId: {},
},
identifiers: [
{
type: "identifier",
fieldName: "notificationId"
}
]
}
fieldNames
- notificationId (identifier)
- comes from: random UUID
- notificationName
- string name set by reciever service, optional
notificationTrigger
{
objectType: "notificationTrigger",
canDelete: false,
complexFilterServiceTag: "complexFilter",
overwriteGeneratedMainFunction: ["create", "get"],
storageResources: {
myGraph: {
storageType: "graph",
graphServerTag: "GraphHandler"
}
},
fieldNames: {
notificationTriggerId: {},
propertyName: {},
valueType: {},
value: {},
values: {}
},
identifiers: [
{
type: "identifier",
fieldName: "notificationTriggerId"
}
]
}
fieldNames
- notificationTriggerId (identifier)
- comes from: random UUID
- propertyName
- can be a nested property, use dot notation
- "serviceName" and "topicName" valueTypes do not have propertyName
- valueType
- property|attribute|serviceName|topicName
- value
- {string or number}
- values
- {array/list of value}
consolidated
{
objectType: "consolidated",
canDelete: true,
complexFilterServiceTag: "complexFilter",
storageResources: {
dynamoDB: {
storageType: "dynamoDB",
graphServerTag: "PendingConsolidation"
}
},
fieldNames: {
notificationGroupId: {},
time: {},
activityMsg: {}
},
identifiers: [
{
type: "partitionKey",
fieldName: "notificationGroupId"
},
{
type: "sortKey",
fieldName: "time"
}
]
}
fieldNames
- notificationGroupId (partition key)
- comes from: random UUID
- time (sort key)
- comes from {timestamp activity handled in Activity Switchboard}_{small random UUID}
- adding the UUID to ensure no clashing records with the same timestamp and notificationGroupId
- activityMsg
- copy of the message delivered from Activity Switchboard
Object Relationships
has_notificationGroup
{
"has_notificationGroup": {
properties: {
originTimestamp: {...}
},
storageResources: {
myGraph: {
storageType: "graph",
graphServerTag: "graphHandler"
}
},
links: [
{
storageResourceTags: ["myGraph"],
from: {
objType: {
serviceTag: "ContactMethodEmail",
objectType: "email"
},
linkType: "one",
},
to: {
objType: {
serviceTag: "NotificationMgr",
objType: "notificationGroup"
},
requiredOnCreate: true,
linkType: "many",
handler: true
}
}
]
}
}
- links email to notificationGroup
disabled_notificationGroup
{
"disabled_notificationGroup": {
properties: {
originTimestamp: {...}
},
storageResources: {
myGraph: {
storageType: "graph",
graphServerTag: "GraphHandler"
}
},
links: [
{
storageResourceTags: ["myGraph"],
from: {
objType: {
serviceTag: "ContactMethodEmail",
objectType: "email"
},
linkType: "one"
},
to: {
objType: {
serviceTag: "NotificationMgr",
objType: "notificationGroup"
},
linkType: "many",
handler: true
}
}
]
}
}
has_notification
{
"has_notification": {
properties: {
originTimestamp: {...}
},
storageResources: {
myGraph: {
storageType: "graph",
graphServerTag: "GraphHandler"
}
},
links: [
{
storageResourceTags: ["myGraph"],
from: {
objType: {
serviceTag: "NotificationMgr",
objectType: "notificationGroup"
},
linkType: "one",
handler: true
},
to: {
objType: {
serviceTag: "NotificationMgr",
objType: "notification"
},
requiredOnCreate: true,
linkType: "many",
handler: true
}
}
]
}
}
disabled_notification
{
"disabled_notification": {
properties: {
originTimestamp: {...}
},
storageResources: {
myGraph: {
storageType: "graph",
graphServerTag: "graphHandler"
}
},
links: [
{
storageResourceTags: ["myGraph"],
from: {
objType: {
serviceTag: "NotificationMgr",
objectType: "notificationGroup"
},
linkType: "one",
handler: true
},
to: {
objType: {
serviceTag: "NotificationMgr",
objType: "notification"
},
linkType: "many",
handler: true
}
}
]
}
}
has_notificationTrigger
{
"has_notificationTrigger": {
properties: {
originTimestamp: {...}
},
storageResources: {
myGraph: {
storageType: "graph",
graphServerTag: "graphHandler"
}
},
links: [
{
storageResourceTags: ["myGraph"],
from: {
objType: {
serviceTag: "NotificationMgr",
objectType: "notification"
},
linkType: "one",
handler: true
},
to: {
objType: {
serviceTag: "NotificationMgr",
objType: "notificationTrigger"
},
requiredOnCreate: true,
linkType: "many",
handler: true
}
}
]
}
}
disabled_notificationTrigger
{
"disabled_notificationTrigger": {
properties: {
originTimestamp: {...}
},
storageResources: {
myGraph: {
storageType: "graph",
graphServerTag: "graphHandler"
}
},
links: [
{
storageResourceTags: ["myGraph"],
from: {
objType: {
serviceTag: "NotificationMgr",
objectType: "notification"
},
linkType: "one",
handler: true
},
to: {
objType: {
serviceTag: "NotificationMgr",
objType: "notificationTrigger"
},
linkType: "many",
handler: true
}
}
]
}
}
value or values array
- Either 'value' or 'values' should be set, not both, if 'values' is used it means any of the elements in the 'values' array can match.
- To achieve this on Activity Switchboard a new trigger group is created for each element, each activity group has the full list of other triggers, and one option from this trigger's values array. If a notification has multiple values type triggers than a new trigger group on Activity Switchboard is created for each combination.
- "serviceName" and "topicName" valueTypes do not have propertyName
serviceName and topicName triggers
- Notifications do not have to set their serviceName and/or topicName, if not set then any message that matches the properties will pass
- Can set only the serviceName, then any message that passess the properties and is from that serviceName passes
- Can set serviceName+topicName, then only messages in that topic will pass
- serviceName and topicName can both be submitted as "values" array, creating multiple trigger groups for each combination
Consolidated notifications
How to trigger processing for time based consolidations
- ....
- maybe can use some sort of queue to store a list of NotificationGroup’s that are due to be sent (either because consolidatedSendIfEmpty == true or there are some activities waiting to be processed)
Formating the notification body
- Initially the format will be hardwired and simple, but in the future we could create templates for formating the notification body
- The notificationBody is currently sent to receiver as a JSON stringified object containing all activityMsgs
Ideas
- overview notifications currently count per notification, but could be extended to do aggregates on a per notification, per field level
- If set to overview maybe can store just aggregate/s needed for the consolidated notification, at the moment store entire messages, create the overview once when sending notification