Service - Notification Manager: Difference between revisions

From Izara Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
 
(6 intermediate revisions by the same user not shown)
Line 13: Line 13:
== PendingConsolidation Table ==
== PendingConsolidation Table ==


; partition key
; notificationGroupId (partition key)
* notificationGroupId
: type: string
: type: string
: comes from: random UUID
: comes from: random UUID
; sort key
; time (sort key)
* time
: type: number
: type: number
: {timestamp activity handled in Activity Switchboard}_{small random UUID}
: {timestamp activity handled in Activity Switchboard}_{small random UUID}
; activityMsg
: type: object
: object containing ''messageAttributes'' and ''message''


= Object Schemas =
= Object Schemas =
Line 39: Line 40:
canDelete: false,
canDelete: false,
     complexFilterServiceTag: "complexFilter",
     complexFilterServiceTag: "complexFilter",
    overWriteHandlers: { // optional, if not set will create default handlers, if empty will not create handler and main function
create: ['hdrSqs'], // default: ['hdrApi', 'hdrSqs']
update: ['hdrSqs'], // default: ['hdrApi', 'hdrSqs']
get: [], // default: ['hdrApi', 'hdrInv']
delete: [], // default: ['hdrApi', 'hdrSqs']
},
addOnDataStructure: [
addOnDataStructure: [
{
{
Line 48: Line 55:
fieldName: "notificationGroupName",
fieldName: "notificationGroupName",
type: "string",
type: "string",
requiredOnCreate: true, // default = false
optionalOnCreate: true, // default = false
optionalOnCreate: true, // default = false
canUpdate: true, // default = true
canUpdate: true, // default = true
Line 58: Line 64:
fieldName: "consolidated",
fieldName: "consolidated",
type: "boolean",
type: "boolean",
requiredOnCreate: true,
optionalOnCreate: true,
optionalOnCreate: true,
canUpdate: true,
canUpdate: true,
validation: {
validation: {
Line 68: Line 73:
fieldName: "consolidatedType",
fieldName: "consolidatedType",
type: "string",
type: "string",
requiredOnCreate: true,
optionalOnCreate: true,
optionalOnCreate: true,
canUpdate: true,
canUpdate: true,
validation: {
validation: {
Line 78: Line 82:
fieldName: "consolidatedFrequency",
fieldName: "consolidatedFrequency",
type: "string",
type: "string",
requiredOnCreate: true,
optionalOnCreate: true,
optionalOnCreate: true,
canUpdate: true,
validation: {
pattern: pattern
}
},
{
fieldName: "consolidatedNextSendDue",
type: "number",
optionalOnCreate: true,
canUpdate: true,
canUpdate: true,
validation: {
validation: {
Line 88: Line 100:
fieldName: "consolidatedSendIfEmpty",
fieldName: "consolidatedSendIfEmpty",
type: "boolean",
type: "boolean",
requiredOnCreate: true,
optionalOnCreate: true,
optionalOnCreate: true,
canUpdate: true,
canUpdate: true,
validation: {
validation: {
Line 98: Line 109:
}
}
     ],
     ],
     overwriteGeneratedMainFunction: ["create", "get", "update"],
     // overwriteGeneratedMainFunction: ["update"],
     storageResources: {
     storageResources: {
myGraph: {
myGraph: {
Line 118: Line 129:
type: "string",
type: "string",
requiredOnCreate: true,
requiredOnCreate: true,
optionalOnCreate: true,
canUpdate: false,
canUpdate: false,
validation: {
validation: {
Line 125: Line 135:
storageResourceTags: ['myGraph']
storageResourceTags: ['myGraph']
},
},
additionalData: {
userId: {
type: "object",
type: "string",
optionalOnCreate: true,
requiredOnCreate: true,
requiredOnCreate: true,
canUpdate: false,
canUpdate: false,
Line 151: Line 160:
; notificationGroupName
; notificationGroupName
: string name set by reciever service, optional
: 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
; receiverTag
: set by the creating service
: set by the creating service name
: eg ContactMethodEmail
: eg ContactMethodEmail
; consolidated
; consolidated
: true|false
: true|false
: optional, if excluded (or value not true), defaults to false
; consolidatedType
; consolidatedType
: overview|detailed
: overview|detailed
Line 169: Line 174:
; consolidatedSendIfEmpty
; consolidatedSendIfEmpty
: true|false
: true|false
; userId
: for createdBy relationship




Line 178: Line 185:
canDelete: false,
canDelete: false,
complexFilterServiceTag: "complexFilter",
complexFilterServiceTag: "complexFilter",
    overWriteHandlers: { // optional, if not set will create default handlers, if empty will not create handler and main function
create: ['hdrSqs'], // default: ['hdrApi', 'hdrSqs']
update: ['hdrSqs'], // default: ['hdrApi', 'hdrSqs']
get: [], // default: ['hdrApi', 'hdrInv']
delete: [], // default: ['hdrApi', 'hdrSqs']
},
addOnDataStructure: [
addOnDataStructure: [
{
{
Line 187: Line 200:
fieldName: "notificationName",
fieldName: "notificationName",
type: "string",
type: "string",
requiredOnCreate: true, // default = false
optionalOnCreate: true, // default = false
optionalOnCreate: true, // default = false
canUpdate: true, // default = true
canUpdate: true, // default = true
Line 197: Line 209:
}
}
     ],
     ],
    overwriteGeneratedMainFunction: ["create", "get", "update"],
  // overwriteGeneratedMainFunction: ["update"],
     storageResources: {
     storageResources: {
myGraph: {
myGraph: {
Line 214: Line 226:
storageResourceTags: ['myGraph']
storageResourceTags: ['myGraph']
},
},
userId: {
type: "string",
requiredOnCreate: true,
canUpdate: false,
validation: {
pattern: pattern
},
storageResourceTags: ['myGraph']
}
     },
     },
     identifiers: [
     identifiers: [
Line 230: Line 251:
; notificationName
; notificationName
: string name set by reciever service, optional
: string name set by reciever service, optional
; userId
: for createdBy relationship




Line 239: Line 262:
canDelete: false,
canDelete: false,
     complexFilterServiceTag: "complexFilter",
     complexFilterServiceTag: "complexFilter",
     overwriteGeneratedMainFunction: ["create", "get"],
     overWriteHandlers: { // optional, if not set will create default handlers, if empty will not create handler and main function
create: ['hdrSqs'], // default: ['hdrApi', 'hdrSqs']
update: [], // default: ['hdrApi', 'hdrSqs']
get: [], // default: ['hdrApi', 'hdrInv']
delete: [], // default: ['hdrApi', 'hdrSqs']
},
    // overwriteGeneratedMainFunction: ["create"],
     storageResources: {
     storageResources: {
myGraph: {
myGraph: {
Line 255: Line 284:
},
},
storageResourceTags: ['myGraph']
storageResourceTags: ['myGraph']
}
},
},
propertyName: {
propertyName: {
type: "string",
type: "string",
requiredOnCreate: true,
optionalOnCreate: true,
optionalOnCreate: true,
canUpdate: false,
canUpdate: false,
Line 270: Line 297:
type: "string",
type: "string",
requiredOnCreate: true,
requiredOnCreate: true,
canUpdate: false,
validation: {
pattern: pattern
},
storageResourceTags: ['myGraph']
},
valueString: {
type: "string",
optionalOnCreate: true,
optionalOnCreate: true,
canUpdate: false,
canUpdate: false,
Line 275: Line 310:
pattern: pattern
pattern: pattern
},
},
storageResourceTags: ['myGraph']
storageResourceTags: ['myGraph']
},
},
value: {
valueNumber: {
type: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // can be "string" or "number"
type: "number",
optionalOnCreate: true,
optionalOnCreate: true,
canUpdate: false,
canUpdate: false,
Line 294: Line 329:
},
},
storageResourceTags: ['myGraph']
storageResourceTags: ['myGraph']
},
userId: {
type: "string",
requiredOnCreate: true,
canUpdate: false,
validation: {
pattern: pattern
},
storageResourceTags: ['myGraph']
}
}
     },
     },
Line 314: Line 358:
; valueType
; valueType
: property|attribute|serviceName|topicName
: property|attribute|serviceName|topicName
; value
; valueString
: '''type: string or number'''
: type: string
; valueNumber
: type: number
; values
; values
: '''type: array/list of value (arrayMixed??)'''
: type: arrayMixed
; userId
: for createdBy relationship




Line 330: Line 378:
dynamoDB: {
dynamoDB: {
storageType: "dynamoDB",
storageType: "dynamoDB",
graphServerTag: "PendingConsolidation"
tableName: "PendingConsolidation"
}
}
     },
     },
Line 337: Line 385:
type: "string",
type: "string",
requiredOnCreate: true,
requiredOnCreate: true,
optionalOnCreate: true,
canUpdate: false,
canUpdate: false,
validation: {
validation: {
pattern: pattern
pattern: pattern
},
},
storageResourceTags: ['dynamoDB']
storageResourceTags: ['dynamoDB'],
fromServiceNameTag: "NotificationMgr" ,
fromObjectType: "notificationGroup"
},
},
time: {
time: {
type: "number",
type: "string",
requiredOnCreate: true,
requiredOnCreate: true,
optionalOnCreate: true,
canUpdate: false,
canUpdate: false,
validation: {
validation: {
Line 357: Line 405:
type: "object",
type: "object",
requiredOnCreate: true,
requiredOnCreate: true,
optionalOnCreate: true,
canUpdate: false,
canUpdate: false,
validation: {
validation: {
Line 396: Line 443:
"has_notificationGroup": {
"has_notificationGroup": {
properties: {
properties: {
originTimestamp: {...}
"originTimestamp": {
    type: "number",            // "string" | "number" ...
requiredOnCreate: true,  // default=false
canUpdate: true,          // default = true
validation: {}            // ajv syntax
}
},
},
storageResources: {
storageResources: {
Line 409: Line 461:
from: {
from: {
objType: {
objType: {
serviceTag: "ContactMethodEmail",
serviceTag: "UserContactManager",
objectType: "email"
objectType: "userContact"
},
},
linkType: "one",
linkType: "one",
Line 416: Line 468:
to: {
to: {
objType: {
objType: {
serviceTag: "NotificationMgr",
serviceTag: "NotificationManager",
objType: "notificationGroup"
objectType: "notificationGroup"
},
},
requiredOnCreate: true,
requiredOnCreate: true,
Line 428: Line 480:
}
}
</syntaxhighlight>
</syntaxhighlight>
: links email to notificationGroup
: links userContact to notificationGroup


=== disabled_notificationGroup ===
=== disabled_notificationGroup ===
Line 435: Line 487:
"disabled_notificationGroup": {
"disabled_notificationGroup": {
properties: {
properties: {
originTimestamp: {...}
"originTimestamp": {
    type: "number",            // "string" | "number" ...
requiredOnCreate: true,  // default=false
canUpdate: true,          // default = true
validation: {}            // ajv syntax
}
},
},
storageResources: {
storageResources: {
Line 448: Line 505:
from: {
from: {
objType: {
objType: {
serviceTag: "ContactMethodEmail",
serviceTag: "UserContactManager",
objectType: "email"
objectType: "userContact"
},
},
linkType: "one"
linkType: "one"
Line 455: Line 512:
to: {
to: {
objType: {
objType: {
serviceTag: "NotificationMgr",
serviceTag: "NotificationManager",
objType: "notificationGroup"
objectType: "notificationGroup"
},
},
linkType: "many",
linkType: "many",
Line 473: Line 530:
"has_notification": {
"has_notification": {
properties: {
properties: {
originTimestamp: {...}
"originTimestamp": {
    type: "number",            // "string" | "number" ...
requiredOnCreate: true,  // default=false
canUpdate: true,          // default = true
validation: {}            // ajv syntax
}
},
},
storageResources: {
storageResources: {
Line 486: Line 548:
from: {
from: {
objType: {
objType: {
serviceTag: "NotificationMgr",
serviceTag: "NotificationManager",
objectType: "notificationGroup"
objectType: "notificationGroup"
},
},
Line 494: Line 556:
to: {
to: {
objType: {
objType: {
serviceTag: "NotificationMgr",
serviceTag: "NotificationManager",
objType: "notification"
objectType: "notification"
},
},
requiredOnCreate: true,
requiredOnCreate: true,
Line 513: Line 575:
"disabled_notification": {
"disabled_notification": {
properties: {
properties: {
originTimestamp: {...}
"originTimestamp": {
    type: "number",            // "string" | "number" ...
requiredOnCreate: true,  // default=false
canUpdate: true,          // default = true
validation: {}            // ajv syntax
}
},
},
storageResources: {
storageResources: {
Line 526: Line 593:
from: {
from: {
objType: {
objType: {
serviceTag: "NotificationMgr",
serviceTag: "NotificationManager",
objectType: "notificationGroup"
objectType: "notificationGroup"
},
},
Line 534: Line 601:
to: {
to: {
objType: {
objType: {
serviceTag: "NotificationMgr",
serviceTag: "NotificationManager",
objType: "notification"
objectType: "notification"
},
},
linkType: "many",
linkType: "many",
Line 552: Line 619:
"has_notificationTrigger": {
"has_notificationTrigger": {
properties: {
properties: {
originTimestamp: {...}
"originTimestamp": {
    type: "number",            // "string" | "number" ...
requiredOnCreate: true,  // default=false
canUpdate: true,          // default = true
validation: {}            // ajv syntax
}
},
},
storageResources: {
storageResources: {
Line 565: Line 637:
from: {
from: {
objType: {
objType: {
serviceTag: "NotificationMgr",
serviceTag: "NotificationManager",
objectType: "notification"
objectType: "notification"
},
},
Line 573: Line 645:
to: {
to: {
objType: {
objType: {
serviceTag: "NotificationMgr",
serviceTag: "NotificationManager",
objType: "notificationTrigger"
objectType: "notificationTrigger"
},
},
requiredOnCreate: true,
requiredOnCreate: true,
Line 592: Line 664:
"disabled_notificationTrigger": {
"disabled_notificationTrigger": {
properties: {
properties: {
originTimestamp: {...}
"originTimestamp": {
    type: "number",            // "string" | "number" ...
requiredOnCreate: true,  // default=false
canUpdate: true,          // default = true
validation: {}            // ajv syntax
}
},
},
storageResources: {
storageResources: {
Line 605: Line 682:
from: {
from: {
objType: {
objType: {
serviceTag: "NotificationMgr",
serviceTag: "NotificationManager",
objectType: "notification"
objectType: "notification"
},
},
Line 613: Line 690:
to: {
to: {
objType: {
objType: {
serviceTag: "NotificationMgr",
serviceTag: "NotificationManager",
objType: "notificationTrigger"
objectType: "notificationTrigger"
},
},
linkType: "many",
linkType: "many",
Line 625: Line 702:
</syntaxhighlight>
</syntaxhighlight>


== value or values array ==
= 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.
* 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.

Latest revision as of 02:18, 8 August 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

notificationGroupId (partition key)
type: string
comes from: random UUID
time (sort key)
type: number
{timestamp activity handled in Activity Switchboard}_{small random UUID}
activityMsg
type: object
object containing messageAttributes and message

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",
    overWriteHandlers: { // optional, if not set will create default handlers, if empty will not create handler and main function
		create: ['hdrSqs'], 	// default: ['hdrApi', 'hdrSqs']
		update: ['hdrSqs'], 	// default: ['hdrApi', 'hdrSqs']
		get: [], 				// default: ['hdrApi', 'hdrInv']
		delete: [], 			// default: ['hdrApi', 'hdrSqs']
	},
	addOnDataStructure: [
		{
			type: "versionedData",
			versionedDataLabel: "notificationGroupSettings",
			storageResourceTag: "myGraph",
			fieldNames: [
				{ // fieldName in versionedData should now same in main objectSchema
			 		fieldName: "notificationGroupName",
			 		type: "string",
					optionalOnCreate: true, 				// default = false
					canUpdate: true, 						// default = true
					validation: {
						pattern: pattern
					}
				},
				{ 
					fieldName: "consolidated",
			 		type: "boolean",
					optionalOnCreate: true, 								
					canUpdate: true, 						
					validation: {
						pattern: pattern
					}
				},
				{
					fieldName: "consolidatedType",
			 		type: "string",
					optionalOnCreate: true, 								
					canUpdate: true, 						
					validation: {
						pattern: pattern
					}
				},
				{
					fieldName: "consolidatedFrequency",
			 		type: "string",
					optionalOnCreate: true, 								
					canUpdate: true, 						
					validation: {
						pattern: pattern
					}
				},
				{
					fieldName: "consolidatedNextSendDue",
			 		type: "number",
					optionalOnCreate: true, 								
					canUpdate: true, 						
					validation: {
						pattern: pattern
					}
				},
				{
					fieldName: "consolidatedSendIfEmpty",
			 		type: "boolean",
					optionalOnCreate: true, 				 				
					canUpdate: true, 						
					validation: {
						pattern: pattern
					}
				}
			]
		}
    ],
    // overwriteGeneratedMainFunction: ["update"],
    storageResources: {
		myGraph: {
			storageType: "graph",
			graphServerTag: "GraphHandler"
		}
    },
    fieldNames: { // see Per Service Schemas
		notificationGroupId: {
		    type: "string",
			optionalOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['myGraph']
		},
		receiverTag: {
			type: "string",
			requiredOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['myGraph']
		},
		userId: {
			type: "string",
			requiredOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['myGraph']
		}
    },
    identifiers: [
		{
			type: "identifier",
			fieldName: "notificationGroupId"
		}
    ]
}

fieldNames

notificationGroupId (identifier)
comes from: random UUID
notificationGroupName
string name set by reciever service, optional
receiverTag
set by the creating service name
eg ContactMethodEmail
consolidated
true|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
userId
for createdBy relationship


notification

{
	objectType: "notification",
	canDelete: false,
	complexFilterServiceTag: "complexFilter",
    overWriteHandlers: { // optional, if not set will create default handlers, if empty will not create handler and main function
		create: ['hdrSqs'], 	// default: ['hdrApi', 'hdrSqs']
		update: ['hdrSqs'], 	// default: ['hdrApi', 'hdrSqs']
		get: [], 				// default: ['hdrApi', 'hdrInv']
		delete: [], 			// default: ['hdrApi', 'hdrSqs']
	},
	addOnDataStructure: [
		{
			type: "versionedData",
			versionedDataLabel: "notificationSettings",
			storageResourceTag: "myGraph",
			fieldNames: [
				{ // fieldName in versionedData should now same in main objectSchema
			 		fieldName: "notificationName",
			 		type: "string",
					optionalOnCreate: true, 				// default = false
					canUpdate: true, 						// default = true
					validation: {
						pattern: pattern
					}
				}
			]
		}
    ],
   // overwriteGeneratedMainFunction: ["update"],
    storageResources: {
		myGraph: {
			storageType: "graph",
			graphServerTag: "GraphHandler"
		}
    },
    fieldNames: {
		notificationId: {
		    type: "string",
			optionalOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['myGraph']
		},
		userId: {
			type: "string",
			requiredOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['myGraph']
		}
    },
    identifiers: [
		{
			type: "identifier",
			fieldName: "notificationId"
		}
    ]
}

fieldNames

notificationId (identifier)
comes from: random UUID
notificationName
string name set by reciever service, optional
userId
for createdBy relationship


notificationTrigger

{
	objectType: "notificationTrigger",
	canDelete: false,
    complexFilterServiceTag: "complexFilter",
    overWriteHandlers: { // optional, if not set will create default handlers, if empty will not create handler and main function
		create: ['hdrSqs'], 	// default: ['hdrApi', 'hdrSqs']
		update: [], 			// default: ['hdrApi', 'hdrSqs']
		get: [], 				// default: ['hdrApi', 'hdrInv']
		delete: [], 			// default: ['hdrApi', 'hdrSqs']
	},
    // overwriteGeneratedMainFunction: ["create"],
    storageResources: {
		myGraph: {
			storageType: "graph",
			graphServerTag: "GraphHandler"
		}
    },
    fieldNames: {
		notificationTriggerId: {
			type: "string",
			optionalOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['myGraph']
		},
		propertyName: {
			type: "string",
			optionalOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['myGraph']
		},
		valueType: {
			type: "string",
			requiredOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['myGraph']
		},
		valueString: {
			type: "string",
			optionalOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['myGraph']		
		},
		valueNumber: {
			type: "number",
			optionalOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['myGraph']		
		},
		values: {
			type: "arrayMixed",
			optionalOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['myGraph']		
		},
		userId: {
			type: "string",
			requiredOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['myGraph']
		}
    },
    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
valueString
type: string
valueNumber
type: number
values
type: arrayMixed
userId
for createdBy relationship


consolidated

{
	objectType: "consolidated",
	canDelete: false,
    complexFilterServiceTag: "complexFilter",
    storageResources: {
		dynamoDB: {
			storageType: "dynamoDB",
			tableName: "PendingConsolidation"
		}
    },
    fieldNames: {
		notificationGroupId: {
			type: "string",
			requiredOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['dynamoDB'],
			fromServiceNameTag: "NotificationMgr" ,
			fromObjectType: "notificationGroup"
		},
		time: {
			type: "string",
			requiredOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['dynamoDB']		
		},
		activityMsg: {
			type: "object",
			requiredOnCreate: true,
			canUpdate: false,
			validation: {
				pattern: pattern
			},
			storageResourceTags: ['dynamoDB']		
		}
    },
    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": {
			    type: "number",            	// "string" | "number" ...
				requiredOnCreate: true,  	// default=false
				canUpdate: true,          	// default = true
				validation: {}            	// ajv syntax
			}
		},
		storageResources: {
			myGraph: {
				storageType: "graph",
				graphServerTag: "graphHandler"			
			}
		},
		links: [
			{
				storageResourceTags: ["myGraph"],
				from: {
					objType: {
						serviceTag: "UserContactManager",					
						objectType: "userContact"
					},
					linkType: "one",
				},
				to: {
					objType: {
						serviceTag: "NotificationManager",				
						objectType: "notificationGroup"					
					},
					requiredOnCreate: true,					
					linkType: "many",
					handler: true
				}
			}
		]
	}
}
links userContact to notificationGroup

disabled_notificationGroup

{
	"disabled_notificationGroup": {
		properties: {
			"originTimestamp": {
			    type: "number",            	// "string" | "number" ...
				requiredOnCreate: true,  	// default=false
				canUpdate: true,          	// default = true
				validation: {}            	// ajv syntax
			}
		},
		storageResources: {
			myGraph: {
				storageType: "graph",
				graphServerTag: "GraphHandler"			
			}
		},
		links: [
			{
				storageResourceTags: ["myGraph"],
				from: {
					objType: {
						serviceTag: "UserContactManager",					
						objectType: "userContact"
					},
					linkType: "one"
				},
				to: {
					objType: {
						serviceTag: "NotificationManager",				
						objectType: "notificationGroup"					
					},			
					linkType: "many",
					handler: true
				}
			}
		]
	}
}


has_notification

{
	"has_notification": {
		properties: {
			"originTimestamp": {
			    type: "number",            	// "string" | "number" ...
				requiredOnCreate: true,  	// default=false
				canUpdate: true,          	// default = true
				validation: {}            	// ajv syntax
			}
		},
		storageResources: {
			myGraph: {
				storageType: "graph",
				graphServerTag: "GraphHandler"			
			}
		},
		links: [
			{
				storageResourceTags: ["myGraph"],
				from: {
					objType: {
						serviceTag: "NotificationManager",					
						objectType: "notificationGroup"
					},
					linkType: "one",
					handler: true					
				},
				to: {
					objType: {
						serviceTag: "NotificationManager",				
						objectType: "notification"					
					},
					requiredOnCreate: true,					
					linkType: "many",
					handler: true
				}
			}
		]
	}
}


disabled_notification

{
	"disabled_notification": {
		properties: {
			"originTimestamp": {
			    type: "number",            	// "string" | "number" ...
				requiredOnCreate: true,  	// default=false
				canUpdate: true,          	// default = true
				validation: {}            	// ajv syntax
			}
		},
		storageResources: {
			myGraph: {
				storageType: "graph",
				graphServerTag: "graphHandler"			
			}
		},
		links: [
			{
				storageResourceTags: ["myGraph"],
				from: {
					objType: {
						serviceTag: "NotificationManager",					
						objectType: "notificationGroup"
					},
					linkType: "one",
					handler: true
				},
				to: {
					objType: {
						serviceTag: "NotificationManager",				
						objectType: "notification"					
					},
					linkType: "many",
					handler: true
				}
			}
		]
	}
}


has_notificationTrigger

{
	"has_notificationTrigger": {
		properties: {
			"originTimestamp": {
			    type: "number",            	// "string" | "number" ...
				requiredOnCreate: true,  	// default=false
				canUpdate: true,          	// default = true
				validation: {}            	// ajv syntax
			}
		},
		storageResources: {
			myGraph: {
				storageType: "graph",
				graphServerTag: "graphHandler"			
			}
		},
		links: [
			{
				storageResourceTags: ["myGraph"],
				from: {
					objType: {
						serviceTag: "NotificationManager",					
						objectType: "notification"
					},
					linkType: "one",
					handler: true
				},
				to: {
					objType: {
						serviceTag: "NotificationManager",				
						objectType: "notificationTrigger"					
					},
					requiredOnCreate: true,	
					linkType: "many",
					handler: true
				}
			}
		]
	}
}


disabled_notificationTrigger

{
	"disabled_notificationTrigger": {
		properties: {
			"originTimestamp": {
			    type: "number",            	// "string" | "number" ...
				requiredOnCreate: true,  	// default=false
				canUpdate: true,          	// default = true
				validation: {}            	// ajv syntax
			}
		},
		storageResources: {
			myGraph: {
				storageType: "graph",
				graphServerTag: "graphHandler"			
			}
		},
		links: [
			{
				storageResourceTags: ["myGraph"],
				from: {
					objType: {
						serviceTag: "NotificationManager",					
						objectType: "notification"
					},
					linkType: "one",
					handler: true
				},
				to: {
					objType: {
						serviceTag: "NotificationManager",				
						objectType: "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

Working documents

Working documents - Notification Manager