...
- 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
- 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
- Sorting & Pagination
- Sort by creation date
- Sort by subject
- Sort by recipient name
Method | URI | underlying query (if any) | Body | Parameters | Return | Description | Permission | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| /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 received | Authenticated User | |||||||||
| /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 sent | Authenticated User | |||||||||
| /messagen/a | Message | inReplyTo=null (i.e. another Message) | Message | Sends 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 | ||||||||
| /message/check | use existing userGroupDAO query to check recipients. | Message | inReplyTo=null (i.e. another Message) | Boolean ErrorResponse | Checks to see if the message is correctly formatted and that the sender has permission to send to the indicated recipients | Authenticated User |
| /message/{id}/forwardn/a | RecipientBundle | Forwards a message to other recipients. This is equivalent to getting a (visible) message and POST-ing it to /message | Sender or Receiver | ||
| /entity/{id}/commentsn/a | Message | Message | Convenience 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 | |||||||||
| /message/{id} | select * from messagecontent c, messagetouser m where c.ID=m.messageContentID and c.ID=<id> | Message | Gets a specific message | Sender or Receiver | |||||||||
| /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 | |||||||||
| /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 | ||||||||
| /message/{id}/statusselect * from messagestatus where messagstatus.messageContentID=<id> | Message Status | Gets the status of a message | Receiver | ||||||||||
| /message/status | n/a | MessageStatus | Marks a message as:
| Receiver | |||||||||
| /message/settings | TODO | MessageSettings | Gets the notification settings of the user | Authenticated User | |||||||||
| /message/settingsTODO | MessageSettings | Changes notification settings | Authenticated User |