{"action":"created","comment":{"url":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls/comments/359574065","pull_request_review_id":334253932,"id":359574065,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDM1OTU3NDA2NQ==","diff_hunk":"@@ -0,0 +1,102 @@\n+package org.broadinstitute.ddp.model.event;\n+\n+import java.time.Instant;\n+\n+import org.broadinstitute.ddp.db.dao.ActivityStatusEventDao;\n+import org.broadinstitute.ddp.db.dao.JdbiActivity;\n+import org.broadinstitute.ddp.db.dao.JdbiActivityInstance;\n+import org.broadinstitute.ddp.db.dao.JdbiActivityInstanceStatus;\n+import org.broadinstitute.ddp.db.dao.JdbiEventConfigurationOccurrenceCounter;\n+import org.broadinstitute.ddp.db.dto.ActivityDto;\n+import org.broadinstitute.ddp.db.dto.ActivityInstanceDto;\n+import org.broadinstitute.ddp.db.dto.EventConfigurationDto;\n+import org.broadinstitute.ddp.model.activity.types.InstanceStatusType;\n+import org.broadinstitute.ddp.pex.PexInterpreter;\n+import org.jdbi.v3.core.Handle;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+\n+public class ActivityInstanceCreationEventAction extends EventAction {\n+    private static final Logger LOG = LoggerFactory.getLogger(ActivityInstanceCreationEventAction.class);\n+    private long studyActivityId;\n+\n+    public ActivityInstanceCreationEventAction(EventConfiguration eventConfiguration, EventConfigurationDto dto) {\n+        super(eventConfiguration, dto);\n+        this.studyActivityId = dto.getActivityInstanceCreationStudyActivityId();\n+    }\n+\n+    @Override\n+    public void doAction(PexInterpreter pexInterpreter, Handle handle, EventSignal eventSignal) {\n+        JdbiActivityInstance jdbiActivityInstance = handle.attach(JdbiActivityInstance.class);\n+        JdbiActivityInstanceStatus jdbiActivityInstanceStatus = handle.attach(JdbiActivityInstanceStatus.class);\n+        JdbiActivity jdbiActivity = handle.attach(JdbiActivity.class);\n+        ActivityStatusEventDao activityStatusEventDao = handle.attach(ActivityStatusEventDao.class);\n+        JdbiEventConfigurationOccurrenceCounter jdbiEventConfigurationOccurrenceCounter =\n+                handle.attach(JdbiEventConfigurationOccurrenceCounter.class);\n+\n+        ActivityDto activityDto = jdbiActivity.queryActivityById(studyActivityId);\n+\n+        // Checking if the maximum number of activities of this type is hit\n+        LOG.info(\"Checking if the maximum number of activities (n = {}) for the study activity (id = {}) is hit\",\n+                activityDto.getMaxInstancesPerUser(), studyActivityId);\n+\n+        int numExistingActivities = jdbiActivityInstance.getNumActivitiesForParticipant(\n+                studyActivityId,\n+                eventSignal.getParticipantId());\n+        LOG.info(\"Found {} existing activity instances for study activity {}\", numExistingActivities, studyActivityId);\n+\n+        if (activityDto.getMaxInstancesPerUser() != null && numExistingActivities >= activityDto.getMaxInstancesPerUser()) {\n+            LOG.info(\n+                    \"The number of existing study activities (n = {}) with id = {} is greater than or equal than\"\n+                            + \" the allowed maximum for this study activity (n = {}), skipping the configuration\",\n+                    numExistingActivities,\n+                    studyActivityId,\n+                    activityDto.getMaxInstancesPerUser()\n+            );\n+            return;\n+        }\n+\n+        // All fine, creating an activity instance\n+        String activityInstanceGuid = jdbiActivityInstance.generateUniqueGuid();\n+        long newActivityInstanceId = jdbiActivityInstance.insert(\n+                studyActivityId,\n+                eventSignal.getParticipantId(),\n+                activityInstanceGuid,\n+                false,\n+                Instant.now().toEpochMilli(),\n+                null\n+        );\n+        // Using the low-level facility to avoid infinite recursion\n+        jdbiActivityInstanceStatus.insert(\n+                newActivityInstanceId,\n+                InstanceStatusType.CREATED,\n+                Instant.now().toEpochMilli(),\n+                eventSignal.getParticipantId()\n+        );\n+        // queue up any events associated with updating the status to created","path":"pepper-apis/src/main/java/org/broadinstitute/ddp/model/event/ActivityInstanceCreationEventAction.java","position":76,"original_position":76,"commit_id":"90f1c8833cd842d960b9831c88adf4138c79688c","original_commit_id":"90f1c8833cd842d960b9831c88adf4138c79688c","user":{"login":"yufengwng","id":5713833,"node_id":"MDQ6VXNlcjU3MTM4MzM=","avatar_url":"https://avatars1.githubusercontent.com/u/5713833?v=4","gravatar_id":"","url":"https://api.github.com/users/yufengwng","html_url":"https://github.com/yufengwng","followers_url":"https://api.github.com/users/yufengwng/followers","following_url":"https://api.github.com/users/yufengwng/following{/other_user}","gists_url":"https://api.github.com/users/yufengwng/gists{/gist_id}","starred_url":"https://api.github.com/users/yufengwng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yufengwng/subscriptions","organizations_url":"https://api.github.com/users/yufengwng/orgs","repos_url":"https://api.github.com/users/yufengwng/repos","events_url":"https://api.github.com/users/yufengwng/events{/privacy}","received_events_url":"https://api.github.com/users/yufengwng/received_events","type":"User","site_admin":false},"body":"Instead of doing this queuing here, have we considered doing it \"recursively\"? Perhaps at the end of this method, we can return a new `ActivityStatusChangeEventSignal` (with `CREATED` as target status) to the `EventService`, and then event service will process that new signal.","created_at":"2019-12-18T21:19:58Z","updated_at":"2019-12-18T21:20:34Z","html_url":"https://github.com/broadinstitute/ddp-study-server/pull/10#discussion_r359574065","pull_request_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls/10","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls/comments/359574065"},"html":{"href":"https://github.com/broadinstitute/ddp-study-server/pull/10#discussion_r359574065"},"pull_request":{"href":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls/10"}}},"pull_request":{"url":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls/10","id":353107381,"node_id":"MDExOlB1bGxSZXF1ZXN0MzUzMTA3Mzgx","html_url":"https://github.com/broadinstitute/ddp-study-server/pull/10","diff_url":"https://github.com/broadinstitute/ddp-study-server/pull/10.diff","patch_url":"https://github.com/broadinstitute/ddp-study-server/pull/10.patch","issue_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/issues/10","number":10,"state":"open","locked":false,"title":"Ddp 3046 create event service","user":{"login":"spookymotion","id":669053,"node_id":"MDQ6VXNlcjY2OTA1Mw==","avatar_url":"https://avatars2.githubusercontent.com/u/669053?v=4","gravatar_id":"","url":"https://api.github.com/users/spookymotion","html_url":"https://github.com/spookymotion","followers_url":"https://api.github.com/users/spookymotion/followers","following_url":"https://api.github.com/users/spookymotion/following{/other_user}","gists_url":"https://api.github.com/users/spookymotion/gists{/gist_id}","starred_url":"https://api.github.com/users/spookymotion/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spookymotion/subscriptions","organizations_url":"https://api.github.com/users/spookymotion/orgs","repos_url":"https://api.github.com/users/spookymotion/repos","events_url":"https://api.github.com/users/spookymotion/events{/privacy}","received_events_url":"https://api.github.com/users/spookymotion/received_events","type":"User","site_admin":false},"body":" ## Context and the big picture\r\nThis change introduces EventService, a rudimentary message processing system that uses Signal objects instead of messages for now. Pulls all the Event Management code into one place. Housekeeping still needs to be updated and some Routes need to be modified to use these functionalities.\r\n \r\n ## What type of change is this?\r\n  \r\n  - [ ] Bugfix (non-breaking change which fixes an issue)\r\n  - [X] New feature (non-breaking change which adds functionality)\r\n  - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)\r\n  - [ ] Experimental proof-of-concept\r\n  - [ ] Infosec/Compliance remediation\r\n  \r\n ## Risk Assessment\r\n  - [X] These changes are **HIGH RISK**.\r\n    - [x] There is an elevated risk that may impact a large number of features\r\n    - [ ] There is an elevated risk to security and privacy\r\n    - [ ] These changes introduce new 3rd party dependencies, alter the network perimeter, or contain\r\n    major upgrades to persistent storage or SaaS dependencies such as auth0, sendgrid, or easypost    \r\n  - [ ] These changes are low risk, do not impact security/privacy, do not impact pepper shared\r\n  components/modules, and have no major upgrades to 3rd party services or libraries\r\n \r\n ### FUD Score \r\n Overall, how are you feeling about these changes?\r\n  - [ ] :relaxed: All good, business as usual!\r\n  - [X] :sweat_smile: There might be some issues here\r\n  - [ ] :scream:I'm sweaty and nervous\r\n \r\n ## How to we demo these changes?\r\n How does one observe these changes in a deployed system?  Note that _user visible_ encompasses\r\n many personas--not just patients and study staff, but ops your fellow devs, compliance, etc.\r\n \r\n - [X] They are user-visible in dev as a regular user journey and require no additional instructions.\r\n - [ ] Getting dev into a state where this is user-visible requires some tech fiddling.  I have\r\n documented these steps in the related ticket.\r\n - [ ] Requires other features before it's human visible.  I have documented the blocking issues\r\n in jira.\r\n - [ ] I have no idea how to demo this.  Please help me!\r\n \r\n ## UI/UX\r\n  - [X] There ain't no UI/UX in these changes\r\n  - [ ] My changes have passed muster with Erin and Jen via an over-the-shoulder review, screenshots, etc.\r\n  - [ ] Erin and Jen have not had an opportunity to provide feedback yet\r\n \r\n## Logging\r\n  ###  Backend\r\n   - [X] I have considered error handling and notification to slack alert rooms via `LOG.error()`.\r\n     #### Route Changes\r\n     - [X] My changes involve a new route changes to an existing route, so the who/what/when are logged using the usual logback mechanism\r\nat the _start_ of the route, prior to any validation, as well as at the end of the route when work completes.\r\n     ### Housekeeping Changes\r\n     - [ ] My changes involve updates to housekeeping, and I am logging the who/what/when via logback.\r\n  ### Client-side\r\n   - [ ] My changes do not involve backend route change, but I have useful logging statements nonetheless.\r\n\r\n## Analytics\r\n - [ ] I have discussed the analytics needs at both a platform and study level with Jen and instrumented code\r\n accordingly.\r\n - [X] There are no analytics requirements for these changes\r\n\r\n## Security and Privacy\r\nEnsuring proper security and privacy for our users is essential.\r\n\r\n  ###  Backend\r\n   - [ ] These changes alter fundamental auth filter logic\r\n   - [ ] These changes introduce a new backend API route that is behind an auth filter\r\n   - [ ] These changes introduce a new backend API that _does not require auth_\r\n   - [ ] These changes alter auth0 internals (rules, hosted login, configuration, etc.)\r\n   - [ ] These changes expose new information to elastic and I have verified that PHI is not being exposed to the public\r\n    \r\n  ### Browser\r\n  - [ ] These changes alter what we store in browser storage\r\n  \r\n  ### Mobile\r\n  - [ ] TBD \r\n \r\n ## Performance and Stability\r\n  - [X] I have analyzed my changes for stability, fault tolerance, graceful degradation, and performance bottlenecks and written a brief summary in this PR\r\n  - [ ] I'm unsure about stability, performance, fault tolerance, and graceful degradation.  Please help!\r\n  \r\n## Testing\r\n - [ ] I have written automated positive tests\r\n - [ ] I have written automated negative tests\r\n - [X] I have written zero automated tests but have poked around locally to verify proper functionality\r\n - [ ] The jira ticket has acceptance criteria and Kiara has in the information she needs to test my changes\r\n- [X] testing already existed\r\n \r\n## Release\r\n - [X] These changes require no special release procedures--just code!\r\n - [ ] Releasing these changes requires special handling\r\n   - [ ] I have documented the special procedures in the release plan document\r\n   - [ ] The special procedures require minimal downtime\r\n   - [ ] The special procedures require unavoidable, extended downtime for:\r\n     - [ ] Participant UX\r\n     - [ ] Study staff\r\n  \r\n ","created_at":"2019-12-13T23:11:24Z","updated_at":"2019-12-18T21:20:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cfd5ba5ffd80a7323e8c77ec16ba49531c12bd1e","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls/10/commits","review_comments_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls/10/comments","review_comment_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls/comments{/number}","comments_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/issues/10/comments","statuses_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/statuses/90f1c8833cd842d960b9831c88adf4138c79688c","head":{"label":"broadinstitute:ddp-3046-create-event-service","ref":"ddp-3046-create-event-service","sha":"90f1c8833cd842d960b9831c88adf4138c79688c","user":{"login":"broadinstitute","id":393552,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MzU1Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/393552?v=4","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"repo":{"id":224263376,"node_id":"MDEwOlJlcG9zaXRvcnkyMjQyNjMzNzY=","name":"ddp-study-server","full_name":"broadinstitute/ddp-study-server","private":false,"owner":{"login":"broadinstitute","id":393552,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MzU1Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/393552?v=4","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/broadinstitute/ddp-study-server","description":"Pepper Study Server","fork":false,"url":"https://api.github.com/repos/broadinstitute/ddp-study-server","forks_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/forks","keys_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/teams","hooks_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/events","assignees_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/tags","blobs_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/subscription","commits_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/merges","archive_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/downloads","issues_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/releases{/id}","deployments_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/deployments","created_at":"2019-11-26T18:49:36Z","updated_at":"2019-12-18T18:47:03Z","pushed_at":"2019-12-18T20:56:08Z","git_url":"git://github.com/broadinstitute/ddp-study-server.git","ssh_url":"git@github.com:broadinstitute/ddp-study-server.git","clone_url":"https://github.com/broadinstitute/ddp-study-server.git","svn_url":"https://github.com/broadinstitute/ddp-study-server","homepage":null,"size":58128,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":5,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":0,"open_issues":5,"watchers":1,"default_branch":"develop"}},"base":{"label":"broadinstitute:develop","ref":"develop","sha":"51a187fc7d52f8d1463026bca15409051a6ed589","user":{"login":"broadinstitute","id":393552,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MzU1Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/393552?v=4","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"repo":{"id":224263376,"node_id":"MDEwOlJlcG9zaXRvcnkyMjQyNjMzNzY=","name":"ddp-study-server","full_name":"broadinstitute/ddp-study-server","private":false,"owner":{"login":"broadinstitute","id":393552,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MzU1Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/393552?v=4","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/broadinstitute/ddp-study-server","description":"Pepper Study Server","fork":false,"url":"https://api.github.com/repos/broadinstitute/ddp-study-server","forks_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/forks","keys_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/teams","hooks_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/events","assignees_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/tags","blobs_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/subscription","commits_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/merges","archive_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/downloads","issues_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/releases{/id}","deployments_url":"https://api.github.com/repos/broadinstitute/ddp-study-server/deployments","created_at":"2019-11-26T18:49:36Z","updated_at":"2019-12-18T18:47:03Z","pushed_at":"2019-12-18T20:56:08Z","git_url":"git://github.com/broadinstitute/ddp-study-server.git","ssh_url":"git@github.com:broadinstitute/ddp-study-server.git","clone_url":"https://github.com/broadinstitute/ddp-study-server.git","svn_url":"https://github.com/broadinstitute/ddp-study-server","homepage":null,"size":58128,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":5,"license":{"key":"bsd-3-clause","name":"BSD 3-Clause \"New\" or \"Revised\" License","spdx_id":"BSD-3-Clause","url":"https://api.github.com/licenses/bsd-3-clause","node_id":"MDc6TGljZW5zZTU="},"forks":0,"open_issues":5,"watchers":1,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls/10"},"html":{"href":"https://github.com/broadinstitute/ddp-study-server/pull/10"},"issue":{"href":"https://api.github.com/repos/broadinstitute/ddp-study-server/issues/10"},"comments":{"href":"https://api.github.com/repos/broadinstitute/ddp-study-server/issues/10/comments"},"review_comments":{"href":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls/10/comments"},"review_comment":{"href":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/broadinstitute/ddp-study-server/pulls/10/commits"},"statuses":{"href":"https://api.github.com/repos/broadinstitute/ddp-study-server/statuses/90f1c8833cd842d960b9831c88adf4138c79688c"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"yufengwng"}}