{"action":"created","comment":{"url":"https://api.github.com/repos/akvo/akvo-flow/pulls/comments/190862590","pull_request_review_id":123324499,"id":190862590,"diff_hunk":"@@ -0,0 +1,217 @@\n+/*\n+ *  Copyright (C) 2018 Stichting Akvo (Akvo Foundation)\n+ *\n+ *  This file is part of Akvo FLOW.\n+ *\n+ *  Akvo FLOW is free software: you can redistribute it and modify it under the terms of\n+ *  the GNU Affero General Public License (AGPL) as published by the Free Software Foundation,\n+ *  either version 3 of the License or any later version.\n+ *\n+ *  Akvo FLOW is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n+ *  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n+ *  See the GNU Affero General Public License included below for more details.\n+ *\n+ *  The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>.\n+ */\n+\n+package org.akvo.flow.rest;\n+\n+import java.util.ArrayList;\n+import java.util.HashMap;\n+import java.util.List;\n+import java.util.Map;\n+\n+import org.akvo.flow.dao.ReportDao;\n+import org.akvo.flow.domain.persistent.Report;\n+import org.akvo.flow.rest.dto.ReportDto;\n+import org.akvo.flow.rest.dto.ReportPayload;\n+import org.akvo.flow.rest.dto.ReportTaskRequest;\n+import org.springframework.beans.BeanUtils;\n+import org.springframework.stereotype.Controller;\n+import org.springframework.web.bind.annotation.PathVariable;\n+import org.springframework.web.bind.annotation.RequestBody;\n+import org.springframework.web.bind.annotation.RequestMapping;\n+import org.springframework.web.bind.annotation.RequestMethod;\n+import org.springframework.web.bind.annotation.ResponseBody;\n+import org.waterforpeople.mapping.app.util.DtoMarshaller;\n+import org.waterforpeople.mapping.app.web.dto.TaskRequest;\n+import org.waterforpeople.mapping.app.web.rest.dto.RestStatusDto;\n+\n+import com.gallatinsystems.user.dao.UserDao;\n+import com.gallatinsystems.user.domain.User;\n+import com.google.appengine.api.taskqueue.Queue;\n+import com.google.appengine.api.taskqueue.QueueFactory;\n+import com.google.appengine.api.taskqueue.TaskOptions;\n+\n+/*\n+ * @startuml\n+ * UI -> ReportRestService: POST\n+ * ReportRestService --> UI: Report with id (JSON object in QUEUED state)\n+ * ReportRestService -> ReportServlet: START\n+ * ReportServlet -> FlowService: POST with Report id\n+ * FlowService -> ReportRestService: PUT Report in IN_PROGRESS state\n+ * UI -> ReportRestService: GET\n+ * ReportRestService --> UI: List of Reports by current user (JSON list)\n+ * FlowService -> ReportRestService: PUT Report (FINISHED_SUCCESS state and filename)\n+ * UI -> ReportRestService: GET\n+ * ReportRestService --> UI: List of Reports by current user (JSON list)\n+ * UI -> FlowService: GET filename\n+ * FlowService --> UI: Report file\n+ * @enduml\n+ */\n+\n+@Controller\n+@RequestMapping(\"/reports\")\n+public class ReportRestService {\n+\n+    private final String[] doNotCopy = {\n+            \"user\",\n+            \"createdDateTime\",\n+            \"lastUpdateDateTime\"\n+          };\n+\n+    private ReportDao reportDao = new ReportDao();\n+    private UserDao userDao = new UserDao();\n+\n+    /**\n+     * Create a new Report from posted payload.\n+     *\n+     * @param requestPayload\n+     * @return\n+     */\n+    @RequestMapping(method = RequestMethod.POST, value = \"\")\n+    @ResponseBody\n+    public Map<String, Object> saveNewReport(@RequestBody\n+    ReportPayload payLoad) {\n+        final ReportDto reportDto = payLoad.getReport();\n+        final Map<String, Object> response = new HashMap<String, Object>();\n+        ReportDto dto = null;\n+        RestStatusDto statusDto = new RestStatusDto();\n+        statusDto.setStatus(\"failed\");\n+\n+        // if the POST data contains a valid ReportDto, continue.\n+        // Otherwise, server will respond with 400 Bad Request\n+        if (reportDto != null) {\n+            User user = userDao.findUserByEmail(reportDto.getUser());\n+\n+            if (user != null) {\n+                Report r = new Report();\n+\n+                BeanUtils.copyProperties(reportDto, r, doNotCopy);\n+                r.setUser(user.getKey().getId());\n+                r.setState(Report.QUEUED);\n+                // Save it, so we get an id assigned\n+                r = reportDao.save(r);\n+\n+                //Queue it\n+                Queue queue = QueueFactory.getDefaultQueue();\n+                TaskOptions options = TaskOptions.Builder.withUrl(\"/app_worker/reportservlet\")\n+                        .param(TaskRequest.ACTION_PARAM, ReportTaskRequest.START_ACTION)\n+                        .param(ReportTaskRequest.ID_PARAM, Long.toString(r.getKey().getId()));\n+                queue.add(options); //overwrite any supplied state\n+                dto = new ReportDto();\n+                DtoMarshaller.copyToDto(r, dto);\n+                statusDto.setStatus(\"ok\");\n+            }\n+        }\n+\n+        response.put(\"meta\", statusDto);\n+        response.put(\"report\", dto);\n+        return response;\n+    }\n+\n+    // find all reports belonging to the current user\n+    //TODO: get an unfiltered list if superAdmin?\n+    @RequestMapping(method = RequestMethod.GET, value = \"\")\n+    @ResponseBody\n+    public Map<String, Object> listMyReports() {\n+        final Map<String, Object> response = new HashMap<String, Object>();\n+        List<ReportDto> results = new ArrayList<ReportDto>();\n+        List<Report> reports = reportDao.listAllByCurrentUser();\n+        if (reports != null) {\n+            for (Report r : reports) {\n+                ReportDto dto = new ReportDto();\n+                DtoMarshaller.copyToDto(r, dto);\n+                results.add(dto);\n+            }\n+        }\n+        response.put(\"reports\", results);\n+        return response;\n+    }\n+\n+    // find a single report by the reportId\n+    // TODO: restrict use to owner+superAdmins\n+    @RequestMapping(method = RequestMethod.GET, value = \"/{id}\")\n+    @ResponseBody\n+    public Map<String, ReportDto> findReport(@PathVariable(\"id\") Long id) {\n+        final Map<String, ReportDto> response = new HashMap<String, ReportDto>();\n+        Report qo = reportDao.getByKey(id);\n+        ReportDto dto = null;\n+        if (qo != null) {\n+            dto = new ReportDto();\n+            DtoMarshaller.copyToDto(qo, dto);\n+        }\n+        response.put(\"report\", dto);\n+        return response;\n+\n+    }\n+\n+    // delete report by id\n+    @RequestMapping(method = RequestMethod.DELETE, value = \"/{id}\")","path":"GAE/src/org/akvo/flow/rest/ReportRestService.java","position":160,"original_position":160,"commit_id":"859526de33956b252f785255d46bf233e314dc54","original_commit_id":"859526de33956b252f785255d46bf233e314dc54","user":{"login":"muloem","id":533336,"avatar_url":"https://avatars2.githubusercontent.com/u/533336?v=4","gravatar_id":"","url":"https://api.github.com/users/muloem","html_url":"https://github.com/muloem","followers_url":"https://api.github.com/users/muloem/followers","following_url":"https://api.github.com/users/muloem/following{/other_user}","gists_url":"https://api.github.com/users/muloem/gists{/gist_id}","starred_url":"https://api.github.com/users/muloem/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/muloem/subscriptions","organizations_url":"https://api.github.com/users/muloem/orgs","repos_url":"https://api.github.com/users/muloem/repos","events_url":"https://api.github.com/users/muloem/events{/privacy}","received_events_url":"https://api.github.com/users/muloem/received_events","type":"User","site_admin":false},"body":"Deleting the actual file would also need to be handled but it can be in a follow up I created. https://github.com/akvo/akvo-flow/issues/2662","created_at":"2018-05-25T11:10:39Z","updated_at":"2018-05-25T11:52:15Z","html_url":"https://github.com/akvo/akvo-flow/pull/2630#discussion_r190862590","pull_request_url":"https://api.github.com/repos/akvo/akvo-flow/pulls/2630","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/akvo/akvo-flow/pulls/comments/190862590"},"html":{"href":"https://github.com/akvo/akvo-flow/pull/2630#discussion_r190862590"},"pull_request":{"href":"https://api.github.com/repos/akvo/akvo-flow/pulls/2630"}}},"pull_request":{"url":"https://api.github.com/repos/akvo/akvo-flow/pulls/2630","id":186571655,"html_url":"https://github.com/akvo/akvo-flow/pull/2630","diff_url":"https://github.com/akvo/akvo-flow/pull/2630.diff","patch_url":"https://github.com/akvo/akvo-flow/pull/2630.patch","issue_url":"https://api.github.com/repos/akvo/akvo-flow/issues/2630","number":2630,"state":"open","locked":false,"title":"Issue/2617 reports class and REST endpoint (Connect #2617)","user":{"login":"stellanl","id":399534,"avatar_url":"https://avatars1.githubusercontent.com/u/399534?v=4","gravatar_id":"","url":"https://api.github.com/users/stellanl","html_url":"https://github.com/stellanl","followers_url":"https://api.github.com/users/stellanl/followers","following_url":"https://api.github.com/users/stellanl/following{/other_user}","gists_url":"https://api.github.com/users/stellanl/gists{/gist_id}","starred_url":"https://api.github.com/users/stellanl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stellanl/subscriptions","organizations_url":"https://api.github.com/users/stellanl/orgs","repos_url":"https://api.github.com/users/stellanl/repos","events_url":"https://api.github.com/users/stellanl/events{/privacy}","received_events_url":"https://api.github.com/users/stellanl/received_events","type":"User","site_admin":false},"body":"#### Before the PR (what is the issue or what needed to be done)\r\nNo way for UI to know what Reports have been run.\r\n#### The solution\r\nAdd a new kind of entity and a rest endpoint.\r\n#### Screenshots (if appropriate)\r\n\r\n## Checklist\r\n* [ ] Connect the issue\r\n* [ ] Test plan\r\n* [ ] Copyright header\r\n* [ ] Code formatting\r\n* [ ] Documentation\r\n","created_at":"2018-05-08T09:11:30Z","updated_at":"2018-05-25T11:52:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ed7e58a8360babfb8406b20b8d3c04f16b4fa790","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/akvo/akvo-flow/pulls/2630/commits","review_comments_url":"https://api.github.com/repos/akvo/akvo-flow/pulls/2630/comments","review_comment_url":"https://api.github.com/repos/akvo/akvo-flow/pulls/comments{/number}","comments_url":"https://api.github.com/repos/akvo/akvo-flow/issues/2630/comments","statuses_url":"https://api.github.com/repos/akvo/akvo-flow/statuses/859526de33956b252f785255d46bf233e314dc54","head":{"label":"akvo:issue/2617-reports-class-and-rest","ref":"issue/2617-reports-class-and-rest","sha":"859526de33956b252f785255d46bf233e314dc54","user":{"login":"akvo","id":159843,"avatar_url":"https://avatars0.githubusercontent.com/u/159843?v=4","gravatar_id":"","url":"https://api.github.com/users/akvo","html_url":"https://github.com/akvo","followers_url":"https://api.github.com/users/akvo/followers","following_url":"https://api.github.com/users/akvo/following{/other_user}","gists_url":"https://api.github.com/users/akvo/gists{/gist_id}","starred_url":"https://api.github.com/users/akvo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akvo/subscriptions","organizations_url":"https://api.github.com/users/akvo/orgs","repos_url":"https://api.github.com/users/akvo/repos","events_url":"https://api.github.com/users/akvo/events{/privacy}","received_events_url":"https://api.github.com/users/akvo/received_events","type":"Organization","site_admin":false},"repo":{"id":3843585,"name":"akvo-flow","full_name":"akvo/akvo-flow","owner":{"login":"akvo","id":159843,"avatar_url":"https://avatars0.githubusercontent.com/u/159843?v=4","gravatar_id":"","url":"https://api.github.com/users/akvo","html_url":"https://github.com/akvo","followers_url":"https://api.github.com/users/akvo/followers","following_url":"https://api.github.com/users/akvo/following{/other_user}","gists_url":"https://api.github.com/users/akvo/gists{/gist_id}","starred_url":"https://api.github.com/users/akvo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akvo/subscriptions","organizations_url":"https://api.github.com/users/akvo/orgs","repos_url":"https://api.github.com/users/akvo/repos","events_url":"https://api.github.com/users/akvo/events{/privacy}","received_events_url":"https://api.github.com/users/akvo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/akvo/akvo-flow","description":"A data collection and monitoring tool that works anywhere.","fork":false,"url":"https://api.github.com/repos/akvo/akvo-flow","forks_url":"https://api.github.com/repos/akvo/akvo-flow/forks","keys_url":"https://api.github.com/repos/akvo/akvo-flow/keys{/key_id}","collaborators_url":"https://api.github.com/repos/akvo/akvo-flow/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/akvo/akvo-flow/teams","hooks_url":"https://api.github.com/repos/akvo/akvo-flow/hooks","issue_events_url":"https://api.github.com/repos/akvo/akvo-flow/issues/events{/number}","events_url":"https://api.github.com/repos/akvo/akvo-flow/events","assignees_url":"https://api.github.com/repos/akvo/akvo-flow/assignees{/user}","branches_url":"https://api.github.com/repos/akvo/akvo-flow/branches{/branch}","tags_url":"https://api.github.com/repos/akvo/akvo-flow/tags","blobs_url":"https://api.github.com/repos/akvo/akvo-flow/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/akvo/akvo-flow/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/akvo/akvo-flow/git/refs{/sha}","trees_url":"https://api.github.com/repos/akvo/akvo-flow/git/trees{/sha}","statuses_url":"https://api.github.com/repos/akvo/akvo-flow/statuses/{sha}","languages_url":"https://api.github.com/repos/akvo/akvo-flow/languages","stargazers_url":"https://api.github.com/repos/akvo/akvo-flow/stargazers","contributors_url":"https://api.github.com/repos/akvo/akvo-flow/contributors","subscribers_url":"https://api.github.com/repos/akvo/akvo-flow/subscribers","subscription_url":"https://api.github.com/repos/akvo/akvo-flow/subscription","commits_url":"https://api.github.com/repos/akvo/akvo-flow/commits{/sha}","git_commits_url":"https://api.github.com/repos/akvo/akvo-flow/git/commits{/sha}","comments_url":"https://api.github.com/repos/akvo/akvo-flow/comments{/number}","issue_comment_url":"https://api.github.com/repos/akvo/akvo-flow/issues/comments{/number}","contents_url":"https://api.github.com/repos/akvo/akvo-flow/contents/{+path}","compare_url":"https://api.github.com/repos/akvo/akvo-flow/compare/{base}...{head}","merges_url":"https://api.github.com/repos/akvo/akvo-flow/merges","archive_url":"https://api.github.com/repos/akvo/akvo-flow/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/akvo/akvo-flow/downloads","issues_url":"https://api.github.com/repos/akvo/akvo-flow/issues{/number}","pulls_url":"https://api.github.com/repos/akvo/akvo-flow/pulls{/number}","milestones_url":"https://api.github.com/repos/akvo/akvo-flow/milestones{/number}","notifications_url":"https://api.github.com/repos/akvo/akvo-flow/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/akvo/akvo-flow/labels{/name}","releases_url":"https://api.github.com/repos/akvo/akvo-flow/releases{/id}","deployments_url":"https://api.github.com/repos/akvo/akvo-flow/deployments","created_at":"2012-03-27T12:45:18Z","updated_at":"2018-05-24T14:40:33Z","pushed_at":"2018-05-24T14:40:33Z","git_url":"git://github.com/akvo/akvo-flow.git","ssh_url":"git@github.com:akvo/akvo-flow.git","clone_url":"https://github.com/akvo/akvo-flow.git","svn_url":"https://github.com/akvo/akvo-flow","homepage":"http://akvo.org/products/akvoflow/","size":215510,"stargazers_count":41,"watchers_count":41,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"archived":false,"open_issues_count":344,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0"},"forks":18,"open_issues":344,"watchers":41,"default_branch":"develop"}},"base":{"label":"akvo:develop","ref":"develop","sha":"82f594ea1fab12ed35f5d5190a762ebf58446258","user":{"login":"akvo","id":159843,"avatar_url":"https://avatars0.githubusercontent.com/u/159843?v=4","gravatar_id":"","url":"https://api.github.com/users/akvo","html_url":"https://github.com/akvo","followers_url":"https://api.github.com/users/akvo/followers","following_url":"https://api.github.com/users/akvo/following{/other_user}","gists_url":"https://api.github.com/users/akvo/gists{/gist_id}","starred_url":"https://api.github.com/users/akvo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akvo/subscriptions","organizations_url":"https://api.github.com/users/akvo/orgs","repos_url":"https://api.github.com/users/akvo/repos","events_url":"https://api.github.com/users/akvo/events{/privacy}","received_events_url":"https://api.github.com/users/akvo/received_events","type":"Organization","site_admin":false},"repo":{"id":3843585,"name":"akvo-flow","full_name":"akvo/akvo-flow","owner":{"login":"akvo","id":159843,"avatar_url":"https://avatars0.githubusercontent.com/u/159843?v=4","gravatar_id":"","url":"https://api.github.com/users/akvo","html_url":"https://github.com/akvo","followers_url":"https://api.github.com/users/akvo/followers","following_url":"https://api.github.com/users/akvo/following{/other_user}","gists_url":"https://api.github.com/users/akvo/gists{/gist_id}","starred_url":"https://api.github.com/users/akvo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akvo/subscriptions","organizations_url":"https://api.github.com/users/akvo/orgs","repos_url":"https://api.github.com/users/akvo/repos","events_url":"https://api.github.com/users/akvo/events{/privacy}","received_events_url":"https://api.github.com/users/akvo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/akvo/akvo-flow","description":"A data collection and monitoring tool that works anywhere.","fork":false,"url":"https://api.github.com/repos/akvo/akvo-flow","forks_url":"https://api.github.com/repos/akvo/akvo-flow/forks","keys_url":"https://api.github.com/repos/akvo/akvo-flow/keys{/key_id}","collaborators_url":"https://api.github.com/repos/akvo/akvo-flow/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/akvo/akvo-flow/teams","hooks_url":"https://api.github.com/repos/akvo/akvo-flow/hooks","issue_events_url":"https://api.github.com/repos/akvo/akvo-flow/issues/events{/number}","events_url":"https://api.github.com/repos/akvo/akvo-flow/events","assignees_url":"https://api.github.com/repos/akvo/akvo-flow/assignees{/user}","branches_url":"https://api.github.com/repos/akvo/akvo-flow/branches{/branch}","tags_url":"https://api.github.com/repos/akvo/akvo-flow/tags","blobs_url":"https://api.github.com/repos/akvo/akvo-flow/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/akvo/akvo-flow/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/akvo/akvo-flow/git/refs{/sha}","trees_url":"https://api.github.com/repos/akvo/akvo-flow/git/trees{/sha}","statuses_url":"https://api.github.com/repos/akvo/akvo-flow/statuses/{sha}","languages_url":"https://api.github.com/repos/akvo/akvo-flow/languages","stargazers_url":"https://api.github.com/repos/akvo/akvo-flow/stargazers","contributors_url":"https://api.github.com/repos/akvo/akvo-flow/contributors","subscribers_url":"https://api.github.com/repos/akvo/akvo-flow/subscribers","subscription_url":"https://api.github.com/repos/akvo/akvo-flow/subscription","commits_url":"https://api.github.com/repos/akvo/akvo-flow/commits{/sha}","git_commits_url":"https://api.github.com/repos/akvo/akvo-flow/git/commits{/sha}","comments_url":"https://api.github.com/repos/akvo/akvo-flow/comments{/number}","issue_comment_url":"https://api.github.com/repos/akvo/akvo-flow/issues/comments{/number}","contents_url":"https://api.github.com/repos/akvo/akvo-flow/contents/{+path}","compare_url":"https://api.github.com/repos/akvo/akvo-flow/compare/{base}...{head}","merges_url":"https://api.github.com/repos/akvo/akvo-flow/merges","archive_url":"https://api.github.com/repos/akvo/akvo-flow/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/akvo/akvo-flow/downloads","issues_url":"https://api.github.com/repos/akvo/akvo-flow/issues{/number}","pulls_url":"https://api.github.com/repos/akvo/akvo-flow/pulls{/number}","milestones_url":"https://api.github.com/repos/akvo/akvo-flow/milestones{/number}","notifications_url":"https://api.github.com/repos/akvo/akvo-flow/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/akvo/akvo-flow/labels{/name}","releases_url":"https://api.github.com/repos/akvo/akvo-flow/releases{/id}","deployments_url":"https://api.github.com/repos/akvo/akvo-flow/deployments","created_at":"2012-03-27T12:45:18Z","updated_at":"2018-05-24T14:40:33Z","pushed_at":"2018-05-24T14:40:33Z","git_url":"git://github.com/akvo/akvo-flow.git","ssh_url":"git@github.com:akvo/akvo-flow.git","clone_url":"https://github.com/akvo/akvo-flow.git","svn_url":"https://github.com/akvo/akvo-flow","homepage":"http://akvo.org/products/akvoflow/","size":215510,"stargazers_count":41,"watchers_count":41,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"archived":false,"open_issues_count":344,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0"},"forks":18,"open_issues":344,"watchers":41,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/akvo/akvo-flow/pulls/2630"},"html":{"href":"https://github.com/akvo/akvo-flow/pull/2630"},"issue":{"href":"https://api.github.com/repos/akvo/akvo-flow/issues/2630"},"comments":{"href":"https://api.github.com/repos/akvo/akvo-flow/issues/2630/comments"},"review_comments":{"href":"https://api.github.com/repos/akvo/akvo-flow/pulls/2630/comments"},"review_comment":{"href":"https://api.github.com/repos/akvo/akvo-flow/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/akvo/akvo-flow/pulls/2630/commits"},"statuses":{"href":"https://api.github.com/repos/akvo/akvo-flow/statuses/859526de33956b252f785255d46bf233e314dc54"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"muloem"}}