...
toc
Updates
Results of 1/15 discussion:
- defer 'optOut' feature
- DO send submission receipt notification to all users on submission list
- Allow submission permission to be restricted to the Team leader (aka 'captain' or 'admin') (later we decided not to add this restriction)
...
Specific Requirements
- To register a Team for a Challenge one must (1) be a registered Challenge participant, AND (2) be an administrator (captain) of the Team.
- Provide a service which accepts a user ID and returns a list of teams on whose behalf the user may submit, taking into account any restrictions.
- Send submission receipt notification to all contributors.
- Add an administrative service to add a contributor to a Submission. This allows someone who neglected to sign-up for the challenge but who contributed to a Submission to be given credit by Challenge Administration.
- Defer 'optOut' feature (allowing a user to 'drop off' a submission created by a teammate)
- When retrieving a TeamState, a hash of the object should be returned. The client submits the hash with the Submission and the server throws an exception if the hash is out of date. This ensures that the Team State at the time of submission is the same as that which the user saw.
...
- Need a service to register a Team based on an Evaluation ID (in contrast to registering based on a Challenge ID).
Add an "isAdmin" parameter to This is subsumed by the 'get submission teams' service.the "GET /user/{id}/team" service.
Add a service to list a user's teams which either (1) are registered for the Challenge, or (2) the user is an administrator on. This is subsumed by the 'get submission teams' service.
...
Submission
...
Results of 1/19 discussion:
Need a service to return the participants in the Challenge, optionally filtered by whether they are in some Team, annotated by whether they are the admin on the Team.
Team Registration Rule:
To register a Team for a Challenge one must (1) be a registered Challenge participant, AND (2) be an administrator (captain) of the Team.
...
restriction rule:
Each Submission has a submitter, an optional Team ID and a list of contributors (other user IDs). A submission is accepted if either:
...
B. It is a valid Team Submission, i.e. (1) it has a Team ID of a registered Team, (2) the Team hasn't exceeded its per-round submission limit, (3) all contributors are registered for the challenge and are on the specified Team at the time of submission, and (4) neither the submitter nor any contributor has made an individual Submission or was the submitter of or contributor to a Team Submission having a different Team ID in the current round.
Given a User and a Challenge, need a service to return a paginated list of teams which the user is on and which either (1) they are an admin or (2) the team is already registered for the challenge. More Generally we need a list of Teams either (1) on whose behalf the user is eligible to submit or (2) on whose behalf the user WOULD be eligible to submit if the Team has been registered for the Challenge, and which the User CAN register for the Challenge.
Design Approach
1) A Challenge is a Project with some extra metadata. Implement this as a new object which a Project can 'own', and on which CRUD operations can be done independently from the Project.
...
- Portal list submissions for which user may opt out.
Response to User Protests:
...
Investigation: We retrieve the submission bundle for the submission in question and look at the Team State. (This can be done automatically for all submissions and the results populated in a Table visible in a dynamic view.)
Reply: Our records show that you were / were not registered for the challenge at the time of submission and you were / were not in Team xxxx. You had / had not already reached your submission quota. The submitter, <user name>, who submitted on behalf of Team xxx, could not / chose not to include you as a contributer.
* I wasn't able to submit, but I had not yet submitted so I wasn't over quota.
Investigation: We retrieve the submissions for the given round and count up the user's contributions. (This can be done automatically and the results populated in a Table visible in a dynamic view.)
Reply: You were included as a submitter in submission(s) made by the following user(s) on the given date(s): xxxxx.
Objects
Entity Relationship Diagram
...
Services
Updated Data Transfer Objects
...
...
URI | Method | Request Parameters | Request Body | Response Body | Authorization | Notes | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/challenge | POST | -- | Challenge | Challenge | CREATE permission required in referenced project. | ||||||||
/entity/{projectId}/challenge | GET | -- | -- | Challenge | READ permission required in project. | ||||||||
/challenge/{challengeId} | GET | -- | -- | Challenge | READ permission required in project. | ||||||||
/challenge | GET | participantId, limit, offset | -- | PaginatedList<ChallengeSummary>ChallengePagedResults | PUBLIC, but to be in the returned list the caller must have READ permission on the project 'owning' the Challenge. | returns the projects/challenges for which 'participantId' is registered. | |||||||
/challenge/{idchallengeId} | PUT | -- | Challenge | -- | UPDATE permission required in referenced project. | ||||||||
/challenge/{idchallengeId} | DELETE | -- | -- | -- | DELETE permission required in referenced project. | ||||||||
/challenge/{ | idchallengeId}/participant | GET | limit, offset, affiliated | PaginatedList<UserGroupHeader> | PaginatedIds | READ permission required in project. | Return challenge participants. If affiliated=true, return just participants affiliated with some registered Team. If false, return those affiliated with no Team. If missing return all participants. | ||||||
/challenge/{id}/challengeTeam | POST | -- | ChallengeTeam | ChallengeTeam | Must be a member of the Participant Team and be an admin on the referenced Challenge Team. | /evaluation/{idchallengeId}/challengeTeam | POST | -- | ChallengeTeam | ChallengeTeam | Must be a member of the Participant Team and be an admin on the referenced Challenge Team. | The service 'looks up' the Challenge associated with the given evaluation and then associates the Team with that challenge. Does nothing if there is no Challenge or if the Team is already registered. | |
/challenge/{idchallengeId}/challengeTeam/{challTeamId} | GET | -- | -- | ChallengeTeam | Must have READ permission in the Challenge Project. | We defer implementation of this since there is no immediate use case. | |||||||
/challenge/{idchallengeId}/challengeTeam | GET | limit, offset | -- | PaginatedList<ChallengeTeam>ChallengeTeamPagedResults | Must have READ permission in the Challenge Project. | ||||||||
/challenge/{idchallengeId}/registratableTeam | GET | limit, offset | -- | PaginatedList<Team>PaginatedIds | Must have READ permission in the Challenge Project. | Returns the Teams which are NOT registered for the challenge and on which is current user is an ADMIN. | |||||||
/challenge/{idchallengeId}/challengeTeam/{challTeamId} | PUT | -- | ChallengeTeam | ChallengeTeam | Must be a member of the Participant Team and be an admin on the referenced Challenge Team. | ||||||||
/challenge/{id}/challengeTeam/{challTeamId} | DELETE | -- | -- | -- | Must be an admin on the referenced Challenge Team. | ||||||||
/teamList | POST | IdSet | ListWrapper<Team> | PUBLIC | Returns a list of Teams for a given list of Team IDs. | ||||||||
/team/{id}/memberList | POST | IdSet | ListWrapper<TeamMember> | PUBLIC | Returns the Team Membership info for a given list of memberIds. | ||||||||
/user/{id}/memberList | POST | IdSet | ListWrapper<TeamMember> | PUBLIC | Returns the user's Membership info for a given list of Teams. | ||||||||
/challenge/{idchallengeId}/submissionTeams | GET | principalId, limit, offset | -- | PaginatedList<SubmissionTeam>PaginatedIds | Must be the user specified by 'principalId' or be a Synapse Admin | Returns a list of Teams either (1) on whose behalf the user is eligible to submit or (2) on whose behalf the user WOULD be eligible to submit if the Team has been , i.e. the Teams registered for the Challenge, challenge and in which the User CAN register for the Challengeuser is a member. | |||||||
/evaluation/submission | POST | etag, teamId, teamStateHashsubmissionEligibilityHash | Submission | Submission | Must have SUBMIT permission in the Evaluation referenced in the Submission. | If teamId is included then a TeamState object is created for the Submission. If 'contributer' list is not empty then teamId is required and Submission is rejected if submitter or any specified contributers is not on the given team. If teamStateHash If submissionEligibilityHash is included then teamId must also be included and submission will be rejected if computed TeamState computed TeamSubmissionEligibility does not match hash. Notifications sent to all contributers except for submitter, with instructions for opting out. | |||||||
/evaluation/submission/{idsubmissionId}/contributor/{principalId} | POST | -- | -- | Administrative Service | Adds the given user as a contributor to the Submission. | ||||||||
/evaluation/submission/{idsubmissionId}/optOut | PUT | userId | -- | -- | userId must be the one making the request (or be a Synapse Administrator) | Sets 'optOut' field for given userId in the Submission. userId must be a contributer in the Submission (not the submitter himself) and Submission must not be in one of the Evaluation's 'optOutDisallowed' states. | |||||||
/evaluation/{evaluationId}/teamStateteam/{teamIdid}/submissionEligibility | GET | -- | -- | TeamStateTeamSubmissionEligibility | user making the request must have SUBMIT permission in the Evaluation and must be eligible to submit on behalf a member of the specified Team. | /user/{id}/team | GET | limit, offset, isAdmin | -- | PaginatedResults<Team> | PUBLIC | Add 'isAdmin' query parameter to the existing query to get the teams a user is on. This optional filter reduces the results to just those teams on which the user is an administrator. |