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 115 Next »

Questions

  • How many messages should a user be allowed to send?
    • 10/min?
    • 1/min?
    • 1/sec?
  • How many recipients can be sent to at once?
    • 10?
    • 50?
    • Infinite?
  • How should we configure Amazon SES?

    • Proposal:
      • Reroute bounce and complaints to SNS
      • Have a worker disable emails to hard-bounced recipients
      • Also flip flags in settings for complaints
      • Store the bounce/complaint in a blob
  • Should users be notified of bounces?
  • How should we implement the worker that sends messages?
    • Proposal:
      • 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
  • Should some messages be stored as templates?
    • If we start sending out notifications about Entity changes and the like, most of the contents will be similar except for the ID and some small part of the message body. We could conceivably add a flag to the MessageToUser object that tells the client to fill in a messages according to some simple template.  Then we could store the key-values of the template in a blob (perhaps following the same schema as StringAnnotations) along with the message.  
  • What options belong in the settings object?
    • Send email when...
      • Update to a favorite-ed entity
      • Team is messaged
      • Message from user
      • Admin sends mail to everyone
    • Mark message as read if forwarded to email?

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)
  • 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
  • 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

'* 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.

Services

  • Sorting & Pagination
    • Sort by creation date
    • Sort by subject
    • Sort by recipient name

 

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
  • No labels