# Copyright 2018 New Vector Ltd
# Copyright 2020 The Matrix.org Foundation C.I.C.
#
# 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.

swagger: '2.0'
info:
  title: "Matrix Federation Join Room API"
  version: "1.0.0"
host: localhost:8448
schemes:
  - https
basePath: /_matrix/federation/v2
consumes:
  - application/json
produces:
  - application/json
securityDefinitions:
  $ref: definitions/security.yaml
paths:
  # Note: there is no v2 of make_join (yet)
  "/send_join/{roomId}/{eventId}":
    put:
      summary: Submit a signed join event to a resident server
      description: |-
        .. Note::
           This API is nearly identical to the v1 API with the
           exception of the response format being fixed.

        This endpoint is preferred over the v1 API as it provides
        a more standarised response format. Senders which receive
        a 400, 404, or other status code which indicates this endpoint
        is not available should retry using the v1 API instead.

        Submits a signed join event to the resident server for it
        to accept it into the room's graph. Note that events have
        a different format depending on the room version - check
        the `room version specification`_ for precise event formats.
        **The request and response body here describe the common
        event fields in more detail and may be missing other required
        fields for a PDU.**
      operationId: sendJoinV2
      security:
        - signedRequest: []
      parameters:
        - in: path
          name: roomId
          type: string
          description: The room ID that is about to be joined.
          required: true
          x-example: "!abc123:matrix.org"
        - in: path
          name: eventId
          type: string
          description: The event ID for the join event.
          required: true
          x-example: "$abc123:example.org"
        - in: body
          name: body
          type: object
          required: true
          schema:
            type: object
            properties:
              sender:
                type: string
                description: The user ID of the joining member.
                example: "@someone:example.org"
              origin:
                type: string
                description: The name of the joining homeserver.
                example: "matrix.org"
              origin_server_ts:
                type: integer
                format: int64
                description: A timestamp added by the joining homeserver.
                example: 1234567890
              type:
                type: string
                description: The value ``m.room.member``.
                example: "m.room.member"
              state_key:
                type: string
                description: The user ID of the joining member.
                example: "@someone:example.org"
              content:
                type: object
                title: Membership Event Content
                description: The content of the event.
                example: {"membership": "join"}
                properties:
                  membership:
                    type: string
                    description: The value ``join``.
                    example: "join"
                required: ['membership']
            required:
              - state_key
              - sender
              - origin
              - origin_server_ts
              - type
              - content
          example: {
            "$ref": "examples/minimal_pdu.json",
            "type": "m.room.member",
            "state_key": "@someone:example.org",
            "origin": "example.org",
            "origin_server_ts": 1549041175876,
            "sender": "@someone:example.org",
            "content": {
                "membership": "join"
            }
          }
      responses:
        200:
          description: |-
            The full state for the room, having accepted the join event.
          schema:
            $ref: "./definitions/send_join_response.yaml"
          examples:
            application/json: {
              "origin": "matrix.org",
              "auth_chain": [{"$ref": "examples/minimal_pdu.json"}],
              "state": [{"$ref": "examples/minimal_pdu.json"}]
            }
