# Copyright 2019 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 Identity Service Terms of Service API"
  version: "2.0.0"
host: localhost:8090
schemes:
  - https
basePath: /_matrix/identity/v2
consumes:
  - application/json
produces:
  - application/json
securityDefinitions:
  $ref: definitions/security.yaml
paths:
  "/terms":
    get:
      summary: Gets the terms of service offered by the server.
      description: |-
        Gets all the terms of service offered by the server. The client is expected
        to filter through the terms to determine which terms need acceptance from the
        user. Note that this endpoint does not require authentication.
      operationId: getTerms
      parameters: []
      responses:
        200:
          description: |-
            The terms of service offered by the server.
          examples:
            application/json: {
              "policies": {
                "terms_of_service": {
                  "version": "2.0",
                  "en": {
                    "name": "Terms of Service",
                    "url": "https://example.org/somewhere/terms-2.0-en.html"
                  },
                  "fr": {
                    "name": "Conditions d'utilisation",
                    "url": "https://example.org/somewhere/terms-2.0-fr.html"
                  }
                },
                "privacy_policy": {
                  "version": "1.2",
                  "en": {
                    "name": "Privacy Policy",
                    "url": "https://example.org/somewhere/privacy-1.2-en.html"
                  },
                  "fr": {
                    "name": "Politique de confidentialité",
                    "url": "https://example.org/somewhere/privacy-1.2-fr.html"
                  }
                }
              }
            }
          schema:
            type: object
            properties:
              policies:
                type: object
                title: Policy Map
                description: |-
                  The policies the server offers. Mapped from arbitrary ID (unused in
                  this version of the specification) to a Policy Object.
                additionalProperties:
                  type: object
                  title: Policy Object
                  description: |-
                    The policy. Includes a map of language (ISO 639-2) to language-specific
                    policy information.
                  properties:
                    version:
                      type: string
                      description: |-
                        The version for the policy. There are no requirements on what this
                        might be and could be "alpha", semantically versioned, or arbitrary.
                  required: ['version']
                  # TODO: TravisR - Make this render
                  additionalProperties:
                    type: object
                    title: Internationalised Policy
                    description: |-
                      The policy information for the specified language.
                    properties:
                      name:
                        type: string
                        description: The translated name of the policy.
                      url:
                        type: string
                        description: |-
                          The URL, which should include the policy ID, version, and language
                          in it, to be presented to the user as the policy. URLs should have
                          all three criteria to avoid conflicts when the policy is updated
                          in the future: for example, if this was "https://example.org/terms.html"
                          then the server would be unable to update it because the client would
                          have already added that URL to the `m.accepted_terms` collection.
                    required: ['name', 'url']
            required: ['policies']
    post:
      summary: Indicates acceptance of terms to the server.
      description: |-
        Called by a client to indicate that the user has accepted/agreed to the included
        set of URLs. Servers MUST NOT assume that the client will be sending all previously
        accepted URLs and should therefore append the provided URLs to what the server
        already knows has been accepted.

        Clients MUST provide the URL of the policy in the language that was presented
        to the user. Servers SHOULD consider acceptance of any one language's URL as
        acceptance for all other languages of that policy.

        The server should avoid returning `M_TERMS_NOT_SIGNED` because the client
        may not be accepting all terms at once.
      operationId: agreeToTerms
      security:
        - accessToken: []
      parameters:
        - in: body
          name: body
          schema:
            type: object
            properties:
              user_accepts:
                type: array
                items:
                  type: string
                description: The URLs the user is accepting in this request.
                example: "https://example.org/somewhere/terms-2.0-en.html"
            required: ['user_accepts']
      responses:
        200:
          description: |-
            The server has considered the user as having accepted the provided URLs.
          examples:
            application/json: {}
          schema:
            type: object
