Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

NameDBOMigration

DTO

  •  MessageContent

(Immutable after creation)

  • Primary key: ID
  • Foreign key: CreatedBy (UserGroup)
  • Foreign key: MessageBody (S3 File Handle ID)
  • Etag
  • CreatedOn

Backup via ID

Note:  Etag is required because MessageStatus is mutable.

Interface

  • ID
  • CreatedBy (principal ID)
  • S3 File Handle ID
  • CreatedOn
  •  MessageToUser

(Immutable after creation)

  • Foreign key: ID (MessageContent)
  • Subject (nullable)
  • Self foreign key: InReplyTo (ID) (nullable)
  • Foreign key: InReplyToRootId
    • Recursive foreign key to primary key

Secondary to MessageContent

Implements MessageContent

  • Subject (string, optional)
  • Set of recipient IDs
  • inReplyTo (optional)
  • inReplyToRoot (optional)
  •  MessageRecipient

(Immutable after creation)

  • Foreign key: ID (MessageContent)
  • Foreign key: Recipient ID (UserGroup)

Secondary to MessageContent

 
  •  MessageStatus
  • Foreign key: ID (MessageContent)
  • Foreign key: Recipient ID (UserGroup)
  • States: UNREAD, READ, ARCHIVED

Secondary to MessageContent

  • ID
  • Recipient
  • State
  •  Comment

(Immutable after creation)

  • Foreign key: ID (MessageContent)
  • Target type (Enum ObjectType)
  • Target ID
  •  TBD:  references to other Comments in the conversation*

Secondary to MessageContent

Implements MessageContent

  • Target type
  • Target ID
  •  MessagingSettings

Part of UserProfile

Use existing services to support this

Secondary to UserGroup
  •  Should email be sent?
  •  Should emailed messages be READ automatically?
  •  Blacklist of blocked users
  •  CommentVotes
  • Primary key: Message ID
  • Up votes
  • Down votes
  • Is-comment-inappropriate votes
TBD
  • ID
  • Up
  • Down
  •  MessagingSettings
  • Foreign key: User ID (UserGroup)
  • Etag
  • Blob of settings
TBD
  • ID
  • Notification settings
  • Blacklist of blocked users
  •  MessageBundle
  Bundles the MessageToUser and Message Status
  •  MessageRecipientSet
  
  • Set of recipient IDs

...

  •  Extend ObjectType to include a "MESSAGE" type
  •  Have DBOMessage extend ObservableEntity and TaggableEntity
  •  Send a change message when a message is created
  •  Subscribe worker to the repo-changes topic
  •  Look for MESSAGE-CREATED changes to process
  •  The worker should always check to see if a message has already been sent, so that messages do not get resent every time the stack changes.
    • A message has been sent if there is a recipient.  The worker is in charge of making sure all sent messages have at least one recipient.  In the case where a user sends a message to multiple recipients, all of which are not visible to the user, then the worker should bounce the message back to the user, along with a bounce message.  This ensures the message has a row in the MessageStatus table.  
  •  TBD: Process change of other ObjectTypes (i.e. ENTITY) for notifications
    •  Needs additional state: either a link between ObjectID/Type and messageContent or ObjectID/Type and UserID

...

MethodURIBodyParametersReturnDescriptionPermission
  •  POST
/messageMessageinReplyTo=null (i.e. another Message)MessageSends a message.  Note, message delivery permission is on a recipient-by-recipient basis, asynchronous to the message creation.  Unauthorized delivery may result in silent failure or a bounce message (TBD).

Authenticated User

 

Must be admin to send to AUTH_USERS

Must have SEND_MESSAGE permission on team to send to team

  •  GET
/message/inbox 

Sorting + pagination

Paginated results<MessageBundle>Gets all messages the authenticated user has receivedAuthenticated User
  •  GET
/message/outbox 

Sorting + pagination

Paginated results<Message>Gets all messages the authenticated user has sentAuthenticated User
  •  GET
/message/{id}  MessageGets a specific messageSender or Receiver
  •  POST
/message/{id}/forwardMessageRecipientSet MessageForwards a message to other recipients. This is equivalent to getting a (visible) message and POST-ing it to /messageSender or Receiver
  •  GET
/message/{id}/conversation 

Sorting + pagination

Paginated results<Message>Gets messages belonging in the same thread as the message ID.  The list is filtered according to the user's ID.Sender or Receiver
  •  PUT
/message/statusMessageStatus  

Marks a message as:

  • READ
  • UNREAD
  • ARCHIVED
Receiver
  •  POST
/entity/{id}/commentsMessage MessageConvenience method for commenting on an entity. The service fills out fields like message ID, thread ID, and recipients, leaving just subject and body for the user.

Authenticated user with SEND_MESSAGE permission on entity

  •  GET
/entity/{id}/comments 

Sorting + pagination

Paginated results<Message>Gets message belonging to the thread tied to the entity.Authenticated user with READ permission on entity
  •  GET
/message/settings  MessageSettingsGets the notification settings of the userAuthenticated User
  •  PUT
/message/settingsMessageSettings  Changes notification settingsAuthenticated User