Skip to end of banner
Go to start of banner

Messaging services

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 103 Next »

Questions

  • How should we bounce messages?  Silently?  Via an auto-generated message?
    • (question) On an error, send an error message to the sender's inbox.
  • How should we handle messages sent to groups rather than individuals?  Should the message be broken into individuals messages (after checking for SEND_MESSAGE permission on the group)?  

Objects

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)
  • List of recipient IDs
  • inReplyTo (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
  • 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 levels
    • Update to an owned entity
    • Update to some favorite entity
    • Team
    • Message from user
    • Mail to everyone
    • Etc...
  • Message receipt email (if more than one)
  • Auto-mark mail as read if forwarded to email
  • Blacklist of blocked users
  • MessageBundle
  Bundles the MessageToUser and Message Status

'* per Marcel, Comments may have a more complex set of references/relationships than Messages to Users have.  Rather than just 'inReplyTo', it might be that one Comment is an 'answer' to another comment which is a question.  Further, the multiple answers to a question may have 'previous' references which order them.

Other

  • Message ID generator
  • Message delivery will be via worker, i.e. asynchronous (in most cases) with respect to message creation
    • Messages to a low number (1) of recipients should be immediately consistent
    • Comments should always be immediately consistent
    • (question) Proposed RDS implementation
      • Add a migratable table with a single column of message IDs
      • Add a worker that periodically polls the table
      • If the table is not empty, process N rows from the top
      • Delete rows once finished processing
  • Email mechanism (use Amazon SES)
    • Since we've decided to use SES, we should use their REST API rather than their SMTP API
    • The Gmail server may still be useful for handling bounced messages

Services

  • Sort by recipient
MethodURIunderlying query (if any)BodyParametersReturnDescriptionPermission
  • GET
/message/inboxselect * from messagecontent c, messagetouser m, messagestatus s where c.ID=m.messageContentID and s.messageContentID=c.ID and s.recipientID=<pid> 

Sorting + pagination

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

select * from messagecontent c, messagetouser m where c.ID=m.messageContentID and c.createdBy=<pid>

TODO:  what is the best way to populate the recipients?

 

Sorting + pagination

Paginated results<Message>Gets all messages the authenticated user has sentAuthenticated User
  • POST
/messagen/aMessageinReplyTo=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

  • POST
/message/checkuse existing userGroupDAO query to check recipients.MessageinReplyTo=null (i.e. another Message)

Boolean

ErrorResponse (question)

Checks to see if the message is correctly formatted and that the sender has permission to send to the indicated recipientsAuthenticated User
  • POST
/message/{id}/forwardn/aRecipientBundle  Forwards a message to other recipients. This is equivalent to getting a (visible) message and POST-ing it to /messageSender or Receiver
  • POST
/entity/{id}/commentsn/aMessage 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
/message/{id}select * from messagecontent c, messagetouser m where c.ID=m.messageContentID and c.ID=<id>  MessageGets a specific messageSender or Receiver
  • GET
/message/{id}/conversationTODO 

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
  • GET
/entity/{id}/comments

select * from messagecontent mc, comment c, inreploytoroot r

where

mc.ID=c.messageContentID and c.TargetType='ENTITY" and c.TargetID=<id>

 

Sorting + pagination

Paginated results<Message>Gets message belonging to the thread tied to the entity.Authenticated user with READ permission on entity
  • GET
/message/{id}/statusselect * from messagestatus where messagstatus.messageContentID=<id>  Message StatusGets the status of a messageReceiver
  • PUT
/message/statusn/aMessageStatus  

Marks a message as:

  • READ
  • UNREAD
  • ARCHIVED
Receiver
  • GET
/message/settingsTODO  MessageSettingsGets the notification settings of the userAuthenticated User
  • PUT
/message/settingsTODOMessageSettings  Changes notification settingsAuthenticated User
  • No labels