text: # Copyright 2016 OpenMarket Ltd
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #     http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  
  import logging
  from http import HTTPStatus
  
  from synapse.api.errors import Codes, SynapseError
  from synapse.http.servlet import (
      RestServlet,
      assert_params_in_dict,
      parse_json_object_from_request,
  )
  
  from ._base import client_patterns
  
  logger = logging.getLogger(__name__)
  
  
  class ReportEventRestServlet(RestServlet):
      PATTERNS = client_patterns("/rooms/(?P<room_id>[^/]*)/report/(?P<event_id>[^/]*)$")
  
      def __init__(self, hs):
          super().__init__()
          self.hs = hs
          self.auth = hs.get_auth()
          self.clock = hs.get_clock()
          self.store = hs.get_datastore()
  
      async def on_POST(self, request, room_id, event_id):
          requester = await self.auth.get_user_by_req(request)
          user_id = requester.user.to_string()
  
          body = parse_json_object_from_request(request)
          assert_params_in_dict(body, ("reason", "score"))
  
          if not isinstance(body["reason"], str):
              raise SynapseError(
                  HTTPStatus.BAD_REQUEST,
                  "Param 'reason' must be a string",
                  Codes.BAD_JSON,
              )
          if not isinstance(body["score"], int):
              raise SynapseError(
                  HTTPStatus.BAD_REQUEST,
                  "Param 'score' must be an integer",
                  Codes.BAD_JSON,
              )
  
          await self.store.add_event_report(
              room_id=room_id,
              event_id=event_id,
              user_id=user_id,
              reason=body["reason"],
              content=body,
              received_ts=self.clock.time_msec(),
          )
  
          return 200, {}
  
  
  def register_servlets(hs, http_server):
      ReportEventRestServlet(hs).register(http_server)
  