Versions Compared

Key

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

...

Goal

Alice wants to invalidate the invitation she sent previously.

Primary actorAlice
Secondary actorBob
Preconditions
  1. Alice has sent an email invitation to Bob.
  2. Bob hasn't accepted the email invitation yet.
PostconditionThe invitation link Bob received is no longer valid.

Workflow

Main success scenario

Step 1. Alice retrieves the pending invitations to her team and removes the one associated with Bob.

Step 2. System invalidates the invitation link sent to Bob.

Mockups

View file
nameuse-case-b.pdf
height250

...

Goal

Bob wants to create a Synapse account and accept Alice's invitation.

Primary actor

Bob

Secondary actorAlice
Preconditions
  1. Alice has sent an email invitation to Bob.
  2. Bob doesn't have a Synapse account.
PostconditionBob is part of Alice's team.

Workflow

Main success scenario

Step 1. Bob clicks on the invitation link in the email he received and is directed to the Synapse web client.

Step 2. The web client presents Bob with the option to create a Synapse account or sign in with an existing account.

Step 3. Bob creates his new Synapse account.

Step 4. The web client displays Alice's invitation to Bob.

Step 5. Bob accepts Alice's team invitation.

Step 6. System sends a notification email to Alice saying that Bob has joined her team.

Mockups

View file
nameuse-case-c.pdf
height250

...

Goal

Bob wants to sign in to his existing Synapse account and accept Alice's invitation.

Primary actor

Bob

Secondary actorAlice
Preconditions
  1. Alice has sent an email invitation to Bob.
  2. Bob has one or more Synapse accounts.
PostconditionBob is part of Alice's team.

Workflow

Main success scenario

Step 1. Bob clicks on the invitation link in the email he received and is directed to the Synapse web client.

Step 2. The web client presents Bob with the option to create a Synapse account or sign in with an existing account.

Step 3. Bob signs in with his existing Synapse account.

Step 4. The web client displays Alice's invitation to Bob.

Step 5. Bob accepts Alice's team invitation.

Step 6. System sends a notification email to Alice saying that Bob has joined her team.

Mockups

View file
nameuse-case-d.pdf
height250

...

Goal

Bob wants to create a new Synapse account but doesn't want to accept Alice's invitation

Primary actor

Bob

Secondary actorAlice
Precondition
  1. Alice has sent an email invitation to Bob.
  2. Bob doesn't have a Synapse account.
PostconditionBob has a Synapse account with a pending invitation to join Alice's team.

Workflow

Main success scenario

Step 1. Bob clicks on the invitation link in the email he received and is directed to the Synapse web client.

Step 2. The web client presents Bob with the option to create a Synapse account or sign in with an existing account.

Step 3. Bob creates his new Synapse account.

Step 4. The web client displays Alice's invitation to Bob.

Mockups

View file
nameuse-case-e.pdf
height250

...

Bob should not be automatically added to the team after registering a new account / signing in to his account, but instead he should need to manually accept the membership invitation. This separates the process of registering for a Synapse account and joining the team, giving Bob the chance to explore Synapse without committing to join Alice's team.

Proposal

Use cases to support

I propose to support all the use cases except use case B. After multiple discussions about the necessity of use case B, I have come to the conclusion that it's an edge case that would incur significant development cost for little benefit. Supporting it would require our system to keep track of the invitation sent by Alice in some form, which is a requirement that none of the other use cases impose on us.

Models to implement

EmailInvitationMembershipInvtnSignedToken

emailAddress

teamId


emailAddress

inviteeId

inviterId

teamId

hmac

Related models: AccountSetupInfo

Services to implement

ActionIntended UserURIMethodRequest ParametersRequest BodyResponse BodySuccess Response CodeNotification Sent to Notes
Send email invitation with link to join a teamauthorized user/emailInvitationPOST
EmailInvitation
200 OKEmail address providedThe invitation link will contain an encoded MembershipInvtnSignedToken with inviteeId set to null
Create MembershipInvitation using a signed tokenpublic/tokenMembershipInvitation POST
MembershipInvtnSignedTokenMembershipInvtnSubmission201 Created
Similar to /membershipInvitation, but using a signed token for authorization. Also, doesn't send any email notifications.

Related services: POST /principal/availablePOST /accountPOST /session

Example implementation with Synapse web client

As the use cases above, the inviter is Alice and the invitee is Bob.

  1. Alice invites Bob to her team by entering his email address.
  2. Web client constructs an EmailInvitation using Bob's email address and Alice's team

...

API

...

  1. 's id, then uses it to send a POST /emailInvitation request to the backend.
  2. Backend constructs a signed MembershipInvtnSignedToken with Bob's email address, Alice's team's id, Alice's id and a null inviteeId (because we don't know Bob's account's id yet).
  3. Backend serializes the MembershipInvtnSignedToken, embeds it into an invitation link to the web client and sends the link to Bob's email address.
  4. Bob clicks on the link and does one of the following:
    1. Registers a new Synapse account. [1]
      1. Web client checks that Bob's email address is a valid account alias through POST /principal/available.
      2. Web client constructs an AccountSetupInfo [2], then uses it to create Bob's account through POST /account and receives a session token.
    2. Signs in to his existing Synapse account.
      1. Web client retrieves a session token through POST /session.
  5. Web client deserializes and validates the MembershipInvtnSignedToken in the link, then sets the inviteeId to the id of the account Bob used (extracted from the session token).
  6. Web client re-signs the MembershipInvtnSignedToken, then uses it to send a POST /tokenMembershipInvitation request to the backend.
  7. Backend validates the MembershipInvtnSignedToken and uses it to create a MembershipInvitation from Alice's team to Bob's account.
  8. Web client receives backend's 201 response, then directs Bob to his profile's Team tab, where he has a pending MembershipInvitation to Alice's team.
  9. Bob accepts Alice's invitation (using the existing MembershipInvitation services).

[1] Note that this process is a bit different from the normal registration workflow because we are avoiding to have to validate Bob's email address. It'd be nonsensical to ask Bob to validate his email address since he reached this state by clicking a link sent to his email address. Also note that this workflow only allows Bob to register the email address to which the invitation link was sent.

[2] Note that the web client needs to construct a valid emailValidationToken, making up a timestamp in the process.