openapi: "3.0.3"

info:
  title: tampopo API 
  version: "1.0"

servers:
  - url: https://api.tampopo.app/

tags:
  - name: users
    description: アカウントの基本情報
  - name: users/{user-id}/activities
    description: アクティビティの情報
  - name: users/{user-id}/friends
    description: フレンド関係の情報
  - name: friend-requests
    description: フレンドリクエスト関連
  - name: friends
    description: フレンド関連
  - name: chat-requests
    description: チャットリクエスト関連
  - name: chat-rooms
    description: チャットルーム関連

paths:
  #アカウントの基本情報
  /users:
    get:
      tags:
        - users
      summary: 全アカウント情報を返す
      description: 全アカウントのID一覧を返す
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                 type: string
                example:
                - "user-id1"
                - "user-id2"
                - "user-id3"
        "400":
          description: 不正なリクエスト
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
    post:
      tags:
        - users
      summary: 新規アカウントを作る
      description: ユーザーIDとパスワードを指定して新規アカウントを作る
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties: 
                user-id:
                  type: string
                  description: ユーザーID
                password:
                  type: string
                  description: パスワード
              required: 
                - user-id
                - password
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: object
                properties: 
                  user-id:
                    type: string
                    example: test
                  token:
                    type: string
        "400":
          description: 不正なリクエスト
        "409":
          description: ユーザーIDの重複
        "500":
          description: 予期せぬエラー
          
  /users/{user-id}:
    get:
      tags:
        - users
      summary: 単一アカウントの情報を返す
      description: 単一アカウントの情報（ニックネームとアイコンのURL）を返す
      parameters:
      - in: path
        name: user-id
        description: 取得対象のユーザーID
        schema:
          type: string
        required: true
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  name:
                    type: string
                    example: "nitta"
                  icon:
                    type: string
                    format: uri
                    example: "https://example.com/images/user-id1.png"
        "400":
          description: 不正なリクエスト
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
    # put: #削除予定
    #   tags:
    #     - users
    #   summary: IDの変更
    #   description: IDの変更
    #   parameters:
    #   - $ref: "#/components/parameters/user-id"
    #   requestBody:
    #     required: true
    #     content:
    #       application/x-www-form-urlencoded:
    #         schema:
    #           type: object
    #           properties: 
    #             token:
    #               type: string
    #               description: 認証トークン
    #             new_user-id:
    #               type: string
    #               description: 新しいID
    #           required: 
    #             - token
    #             - new_user-id
    #   responses:
    #     '200':
    #       description: Successful operation
    #       content:
    #         application/json:
    #           schema:
    #             type: string
    #             example: atarashi_user-id1
    #     '404':
    #       description: "見つかりませんでした"
    
    delete: #ゆなし
      tags:
      - "users"
      summary: "アカウントの削除"
      description: 単一アカウントの情報を削除する
      parameters:
      - in: path
        name: user-id
        description: 削除対象のユーザーID
        schema:
          type: string
        required: true
      - in: query
        name: token
        description: 削除対象ユーザーの認証トークン
        schema:
          type: string
        required: true
      responses:
        '200': #成功
          description: 成功   
        "400":
          description: 不正なリクエスト
        "401":
          description: 未認証
        "403":
          description: トークンの不一致
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー

  /users/{user-id}/login: #いわたに
    post:
      tags:
        - users
      summary: アカウントのログイン処理
      description: アカウントにログインし、成功したら認証tokenを返す
      parameters:
      - in: path
        name: user-id
        description: ログインするユーザーのユーザーID
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                password:
                  type: string
                  description: パスワード
              required:
                - password
      responses:
        "200":
          description: Successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  token: 
                    type: string
                    example: Tsrt83hw3tG84tu1
        "401":
          description: パスワード間違い
        "404":
          description: IDが存在しません
        "400":
          description: 不正なリクエスト
        "500":
          description: 予期せぬエラー

  /users/{user-id}/name: #ゆなし
    get:
      tags:
      - "users"
      summary: "アカウントのニックネームの取得"
      description: 単一アカウントのニックネームを返す
      parameters:
      - in: path
        name: user-id
        description: 取得対象のユーザーID
        schema:
          type: string
        required: true
      responses:
        '200': #成功
          description: 成功
          content:
            application/json:
              schema:
                type: "string"
                example: "にったなのだ"
        "400":
          description: 不正なリクエスト
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
    put:
      tags:
      - "users"
      summary: "ニックネームの変更"
      description: 単一アカウントのニックネームを変更する
      parameters:
      - in: path
        name: user-id
        description: 変更対象のユーザーID
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded: 
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: 認証トークン
                new-name:
                  type: string
                  description: 新しいニックネーム
              required:
                - token
                - new-name   
      responses:
        '200': #成功
          description: 成功
          content:
            application/json:
              schema:
                type: "string"
                example: "にったんラブ"
        "400":
          description: 不正なリクエスト
        "401":
          description: 未認証
        "403":
          description: トークンの不一致
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
  /users/{user-id}/password: #いわたに
    get: #実装の判断は任せる
      tags:
        - users
      summary:  単一アカウントのパスワードの取得
      description: 単一アカウントの現在のパスワードの取得
      parameters:
      - in: path
        name: user-id
        description: 取得対象のユーザーID
        schema:
          type: string
        required: true
      - in: query
        name: token
        description: 認証トークン
        schema:
          type: string
        required: true
      responses:
        '200':
          description: Successful operation
          content:
            applicaion/json:
              schema:
                type: object
                properties:
                  password:
                    type: string
                    example: nittalab
        "400":
          description: 不正なリクエスト
        "401":
          description: 未認証
        "403":
          description: トークンの不一致
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
    put:
      tags:
        - users
      summary: パスワードを変更する  
      description: 指定されたIDのパスワードを変更する  
      parameters:
      - in: path
        name: user-id
        description: 変更対象のユーザーID
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded: 
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: トークン
                new-password:
                  type: string
                  description: 新しいパスワード
              required:
                - new-password   
                - token
      responses:
        '200':
          description: Successful operation
        '401':
          description: 変更前のパスワード間違い
        '403':
          description: 認証トークンエラー
        '404':
          description: "見つかりませんでした"
        "400":
          description: 不正なリクエスト
        "500":
          description: 予期せぬエラー

  /users/{user-id}/email: #いわたに
    get:
      tags:
        - users
      summary:  単一アカウントのemailの取得
      description: 単一アカウントの現在のemailの取得
      parameters:
      - in: path
        name: user-id
        description: 取得対象のユーザーID
        schema:
          type: string
        required: true
      - in: query
        name: token
        description: 認証トークン
        schema:
          type: string
        required: true
      responses:
        '200':
          description: Successful operation
          content:
            applicaion/json:
              schema:
                type: object
                properties:
                  email:
                    type: string
                    example: nittalab@gmail.com
        '403':
          description: 認証トークンエラー
        '404':
          description: IDが存在しません
        "400":
          description: 不正なリクエスト
        "401":
          description: 未認証
        "500":
          description: 予期せぬエラー
    put:
      tags:
        - users
      summary: emailを変更する
      description: 指定されたIDのemailを変更する
      parameters:
      - in: path
        name: user-id
        description: 変更対象のユーザーID
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded: 
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: トークン
                new-email:
                  type: string
                  description: 新しいemail
                
              required:
                - new-email
                - token
      responses:
        '200':
          description: Successful operarion
        '403':
          description: 認証トークンエラー
        '404':
          description: 見つかりませんでした
        "400":
          description: 不正なリクエスト
        "401":
          description: 未認証
        "409":
          description: メールアドレスの重複
        "500":
          description: 予期せぬエラー

  /users/{user-id}/icon: #たなか
    get:
      tags:  # accountsタグの中のお話  
        - users
      summary: アイコンを返す
      description: 指定されたIDのアイコンのURLを返す
      parameters:
      - in: path
        name: user-id
        description: 取得対象のユーザーID
        schema:
          type: string
        required: true
      responses:
        "200":
          description: Successsful operation
          content:
            application/json:
              schema:
                type: string
                format: uri
                example: "https://example.com/images/bacon.png"
        "400":
          description: 不正なリクエスト
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
    put:
      tags:
      - users
      summary: アイコンを変更する 
      description: 指定されたIDのアイコンを変更する
      parameters:
      - in: path
        name: user-id
        description: 変更対象のユーザーID
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties: 
                token: 
                  type: string
                  description: 認証トークン
                new-icon: 
                  type: string
                  description: 新しい画像(base64)
              required: 
                - token
                - new-icon
      responses:
        "200":
          description: Successsfil operation
          content:
            applicaion/json:
              schema:
                type: object
                properties:
                  icon:
                    type: string
                    example: "66F8B439D11A76CA"
        "400":
          description: 不正なリクエスト
        "401":
          description: 未認証
        "403":
          description: トークンの不一致
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー

  #アクティビティの情報 #ゆなし
  /users/{user-id}/activities:
    get:
      tags:
      - "users/{user-id}/activities"
      summary: アカウントの全アクティビティの取得
      description: ユーザーIDで指定したアカウントの全アクティビティを取得する（フィルターで最新の投稿のみの取得)
      parameters:
      - in: path
        name: user-id
        description: 取得対象のユーザーID
        schema:
          type: string
        required: true
      - in: query
        name: filter
        description: "LATEST: 最新のみ取得"
        schema:
          type: string
        required: false
      responses:
        '200': #成功
          description: 成功
          content:
            application/json:
              schema:
                type: "object"
                properties:
                  activity-id1:
                    type: "object"
                    properties: 
                      text:
                        type: "string"
                        example: "今暇やねん"
                      updated-time:
                        type: "string"
                        example: "2025/05/14 15:20"
                  activity-id2:
                    type: "object"
                    properties:
                      text:
                        type: "string"
                        example: "お風呂入ってたわ"
                      updated-time:
                        type: "string"
                        example: "2025/05/14 23:50"
        "400":
          description: 不正なリクエスト
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
    post:
      tags:
      - "users/{user-id}/activities"
      summary: 新規アクティビティの投稿
      description: 指定したアカウントで新規のアクティビティを投稿する。成功したら作成したアクティビティのIDを返す。
      parameters:
      - in: path
        name: user-id
        description: 投稿するユーザーのユーザーID
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded: # この形式のデータを使ってパスワードを変更
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: 認証トークン
                new-activity:
                  type: string
                  description: 新しいアクティビティのテキスト
              required:
                - token
                - new-activity
      responses:
        '200': #成功
          description: 成功
          content:
            application/json:
              schema:
                properties:
                  activity-id:
                    type: "string"
                    example: "fneit8"
        "400":
          description: 不正なリクエスト
        "401":
          description: 未認証
        "403":
          description: トークンの不一致
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
          
  /users/{user-id}/activities/{activity-id}:
    get:
      tags:
      - "users/{user-id}/activities"
      summary: アカウントの単一アクティビティ取得
      description: アクティビティIDを指定して、アカウントの単一アクティビティを取得する
      parameters:
      - in: path
        name: user-id
        description: 取得対象のユーザーID
        schema:
          type: string
        required: true
      - in: path
        name: activity-id
        description: 取得対象のアクティビティID
        schema:
          type: string
        required: true
      responses:
        '200': #成功
          description: 成功
          content:
            application/json:
              schema:
                type: "object"
                properties:
                  activity-id:
                    type: "string"
                    example: "ajejg5"
                  text:
                    type: "string"
                    example: "にったんに会った"
                  updated-time:
                    type: "string"
                    example: "2025/05/14 15:30" 
        "400":
          description: 不正なリクエスト
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
          
    delete:
      tags:
      - "users/{user-id}/activities"
      summary: "アクティビティの削除"
      description: "アカウントの単一アクティビティを削除する"
      parameters:
      - in: path
        name: user-id
        description: 削除対象のユーザーID
        schema:
          type: string
        required: true
      - in: path
        name: activity-id
        description: 削除対象のアクティビティID
        schema:
          type: string
        required: true
      - in: query
        name: token
        description: 認証トークン
        schema:
          type: string
        required: true
      responses:
        '200': #成功
          description: 成功
        "400":
          description: 不正なリクエスト
        "401":
          description: 未認証
        "403":
          description: トークンの不一致
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
          
  /users/{user-id}/activities/{activity-id}/text:
    get: #実装は任せる
      tags:
      - "users/{user-id}/activities"
      summary: "アカウントのアクティビティの文章"   
      description: "指定したアカウントの指定したアクティビティの文章の内容を取得する"    
      parameters:
      - in: path
        name: user-id
        description: 取得対象のユーザーID
        schema:
          type: string
        required: true
      - in: path
        name: activity-id
        description: 取得対象のアクティビティID
        schema:
          type: string
        required: true
      responses:
        '200': #成功
          description: 成功
          content:
            application/json:
              schema:
                type: "string"
                example: "今起きた"  
        "400":
          description: 不正なリクエスト
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
          
  /users/{user-id}/activities/{activity-id}/updated-time:
    get: #実装は任せる
      tags:
      - "users/{user-id}/activities"
      summary: "単一アクティビティの投稿時間"
      description: "指定したアカウントの指定したアクティビティの投稿時間を取得する"
      parameters:
      - in: path
        name: user-id
        description: 取得対象のユーザーID
        schema:
          type: string
        required: true
      - in: path
        name: activity-id
        description: 取得対象のアクティビティID
        schema:
          type: string
        required: true
      responses:
        '200': #成功
          description: 成功
          content:
            application/json:
              schema:
                type: "string"
                example: "2025/05/14 01:00"
        "400":
          description: 不正なリクエスト
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
                
  /users/{user-id}/activities/last-updated-time:
    get:
      tags:
      - "users/{user-id}/activities"
      summary: "最新アクティビティの投稿時間"
      description: "指定したアカウントの最新のアクティビティの投稿時間を取得する"
      parameters:
      - in: path
        name: user-id
        description: 取得対象のユーザーID
        schema:
          type: string
        required: true
      responses:
        '200': #成功
          description: 成功
          content:
            application/json:
              schema:
                type: "string"
                example: "2025/05/14 01:00"
        '404':
          description: データが存在しません(まだ投稿していない)   
        "400":
          description: 不正なリクエスト
        "500":
          description: 予期せぬエラー  
          
    # put: #削除か非公開予定
    #   tags:
    #   - "users/{user-id}/activities"
    #   summary: "投稿時間の更新"
    #   description: アクティビティの投稿時間を更新する
    #   parameters:
    #   - $ref: "#/components/parameters/user-id"
    #   requestBody:
    #     required: true
    #     content:
    #       application/x-www-form-urlencoded:
    #         schema:
    #           type: object
    #           properties:
    #             token:
    #               type: string
    #               description: 認証トークン
    #             new_updated-time:
    #               type: string
    #               description: 新しいアクティビティの投稿時間
    #           required:
    #             - token
    #             - new_updated-time   
    #   responses:
    #     '200': #成功
    #       description: 成功
    #       content:
    #         application/json:
    #           schema:
    #             type: "string"
    #             example: "2025/05/14 14:25"
    #     '404':
    #       description: IDが存在しません
  
          
  #フレンド関係の情報 #よしむらくん
  /users/{user-id}/friends: 
    get:
      tags:
        - users/{user-id}/friends
      summary: 自分のフレンドペアのペアIDの一覧（JSON）の取得
      description: 指定したアカウントが所属しているフレンドペアの、ペアIDから各ユーザーIDへのマップ（JSON）の取得
      parameters:
      - in: path
        name: user-id
        description: 取得対象のユーザーID
        schema:
          type: string
        required: true
      - in: query
        name: token
        description: 認証トークン
        schema:
          type: string
        required: true
      responses:
        '200':
          description: 成功
          content:
            application/json:
              schema:
                type: object
                properties: 
                  pid1:
                    type: object
                    properties:
                      user0-id:
                        type: string
                        example: oh3rhowgy3
                      user1-id:
                        type: string
                        example: w3485nwv84
                  pid2:
                    type: object
                    properties:
                      user0-id:
                        type: string
                        example: oh3rhowgy3
                      user1-id:
                        type: string
                        example: l45yn39w5v9
        "400":
          description: 不正なリクエスト
        "401":
          description: 未認証
        "403":
          description: トークンの不一致
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー

    # post: #非公開予定
    #   tags:
    #     - users/{user-id}/friends
    #   summary: 新規ペアの追加
    #   description: 新規ペアを追加するためのエンドポイント
    #   parameters:
    #     - $ref: "#/components/parameters/user-id"
    #   requestBody:
    #     required: true
    #     content:
    #       application/x-www-form-urlencoded:
    #         schema:
    #           type: object
    #           properties:
    #             token:
    #               type: string
    #               description: 認証トークン
    #             pair-id:
    #               type: string
    #               description: フレンドのペアID
    #             user1_id:
    #               type: string
    #               description: ペアの1人目のユーザーID
    #               example: user-id123
    #             user2_id:
    #               type: string
    #               description: ペアの2人目のユーザーID
    #               example: user-id456
    #           required:
    #             - token
    #             - pair-id
    #             - user1_id
    #             - user2_id 
    #   responses:
    #     '200':
    #       description: 成功
    #       content:
    #         application/json:
    #           schema:
    #             type: object
    #             properties:
    #               pair_id:
    #                 type: string
    #                 description: 作成されたペアのID
    #                 example: pid789
    
  /users/{user-id}/friends/{pair-id}: 
    get: #実装お任せ
      tags:
        - users/{user-id}/friends
      summary: フレンド相手の情報の取得
      description: 指定したアカウントの指定したフレンドペアの相手のユーザー ID の取得
      parameters:
      - in: path
        name: user-id
        description: 取得能動側のユーザーID
        schema:
          type: string
        required: true
      - in: path
        name: pair-id
        description: フレンドのペアID
        schema:
          type: string
        required: true
      - in: query
        name: token
        description: 認証トークン
        schema:
          type: string
        required: true
      responses:
        '200':
          description: 成功
          content:
            application/json:
              schema:
                type: object
                properties: 
                  user-id:
                    type: string
                    description: ペアのユーザーID
                    example: 相手のuser-id
        "400":
          description: 不正なリクエスト
        "401":
          description: 未認証
        "403":
          description: トークンの不一致
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー
    delete:
        tags:
        - users/{user-id}/friends
        summary: フレンドペアの削除
        description: 指定したフレンドペアの削除
        parameters:
        - in: path
          name: user-id
          description: 削除能動側のユーザーID
          schema:
            type: string
          required: true
        - in: path
          name: pair-id
          description: フレンドのペアID
          schema:
            type: integer
          required: true
        - in: query
          name: token
          description: 認証トークン
          schema:
            type: string
          required: true
        responses:
          '200':
            description: 成功
          "400":
            description: 不正なリクエスト
          "401":
            description: 未認証
          "403":
            description: トークンの不一致
          "404":
            description: データが存在しません
          "500":
            description: 予期せぬエラー          
            

  /friend-requests:
    get:
      tags:
        - friend-requests
      summary: 指定したユーザに関連するフレンドリクエストを返す
      description: トークンによって指定されたユーザに関連するフレンドリクエストのみを返す（他人の情報を返さないように実装する）
      parameters:
        - in: query
          name: token
          description: 対象ユーザの認証用のトークン
          example: d6289334-d2df-41bb-9410-d2f33de40b16
          required: true
          schema:
            type: string
      responses:
        "200":
          description: すべてのフレンドリクエストを返す
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 12
                    senderId:
                      type: string
                      example: "test1"
                    receiverId:
                      type: string
                      example: "test2"
        "400":
          description: 不正なリクエストです
        "401":
          description: トークンが無効です
        "403":
          description: 権限がありません
        "404":
          description: データが存在しません
        "409":
          description: データが重複しています
        "500":
          description: サーバー内部でエラーが発生しました

    post:
      tags:
        - friend-requests
      summary: フレンドリクエストを作成
      description: トークンを使って新しいフレンドリクエストを作成する。成功したら作成したフレンドリクエストの ID を返す。
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: フレンドリクエストを送ったユーザーのトークン
                  example: d6289334-d2df-41bb-9410-d2f33de40b16
                sender-id:
                  type: string
                  description: フレンドリクエストを送ったユーザーのID
                  example: skyfox_82z
                receiver-id:
                  type: string
                  description: フレンドリクエストを受け取るユーザーのID
                  example: echo_wolf7
              required:
                - token
                - sender-id
                - receiver-id
      responses:
        "201":
          description: "フレンドリクエストが作成されました"
          content:
            application/json:
              schema:
                type: string
                format: uri
                example: "24"

        "400":
          description: "不正なリクエスト"

  /friend-requests/{friend-request-id}:
    delete:
      tags:
        - friend-requests
      summary: フレンドリクエストを削除
      description: フレンドリクエスト ID を指定してフレンドリクエストを削除
      parameters:
        - in: path
          name: friend-request-id
          description: フレンドリクエストのID
          required: true
          example: 12
          schema:
            type: integer
        - in: query
          name: receiver-token
          description: リクエストを受け付けたユーザーの認証用トークン
          example: d6289334-d2df-41bb-9410-d2f33de40b16
          required: true
          schema:
            type: string
      responses:
        "200":
          description: "フレンドリクエストの削除に成功しました"
        "404":
          description: "指定されたIDのフレンドリクエストが見つかりませんでした"
          
  /friends/:
    post:
      tags:
        - friends
      summary: フレンドのペアを追加
      description: フレンドリクエストが承認されたときに呼び出し、フレンドペアが正常に追加されたら、ペアIDを返す
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: フレンドリクエストを承認したユーザーのトークン
                  example: d6289334-d2df-41bb-9410-d2f33de40b16
                user0-id:
                  type: string
                  description: ユーザーID
                  example: skyfox_82z
                user1-id:
                  type: string
                  description: ユーザーID
                  example: echo_wolf7
              required:
                - token
                - user0-id
                - user1-id
      responses:
        "200":
          description: 正常に処理できた
          content:
            application/json:
              schema:
                type: object
                properties:
                  pair-id:
                    type: integer
                    example: 1
        "400":
          description: 不正なリクエスト
        "401":
          description: トークンが無効
        "403":
          description: 権限なし
        "404":
          description: データが存在しない
        "409":
          description: 重複している
        "500":
          description: エラー

  /friends/pairs/{pair-id}/:
    parameters:
      - in: path
        name: pair-id
        description: フレンドリクエストのペアID
        required: true
        schema:
          type: integer
    get:
      tags:
        - friends
      summary: フレンドのペアを取得する
      description: ペアIDを指定して、所属しているユーザのユーザIDを取得する
      parameters:
        - in: query
          name: token
          description: ペアのいずれかのユーザーの認証用トークン
          example: d6289334-d2df-41bb-9410-d2f33de40b16
          required: true
          schema:
            type: string
      responses:
        "200":
          description: ペアのリソースが存在したらそのリソースを返す
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    description: ペアID
                    example: 13
                  user0id:
                    type: string
                    description: ユーザーID
                    example: echo_wolf7
                  user1Id:
                    type: string
                    description: ユーザーID
                    example: echo_wolf7
        "400":
          description: 削除が失敗したとき
    delete:
      tags:
        - friends
      summary: フレンドのペアを削除
      description: ペアのいずれかのユーザーの認証用トークンを指定して、フレンドペアを削除する
      parameters:
        - in: query
          name: token
          description: ペアのいずれかのユーザーの認証用トークン
          example: d6289334-d2df-41bb-9410-d2f33de40b16
          required: true
          schema:
            type: string
      responses:
        "200":
          description: 削除が成功したとき
        "400":
          description: 不正なリクエスト
        "401":
          description: トークンが無効
        "403":
          description: 権限なし
        "404":
          description: データが存在しない
        "409":
          description: 重複している
        "500":
          description: エラー
          
  /friends/users/{user-id}:
    get:
      tags:
        - friends
      summary: 自分のフレンド一覧の取得
      description: 指定したユーザのフレンド一覧を、ユーザIDのリストとして返す
      parameters:
      - in: path
        name: user-id
        description: 取得対象のユーザーID
        schema:
          type: string
        required: true
      - in: query
        name: token
        description: 認証トークン
        schema:
          type: string
        required: true
      responses:
        '200':
          description: Successful operation
          content:
            applicaion/json:
              schema:
                type: array
                items:
                  type: string
                example: 
                  - "user-id1"
                  - "user-id2"
                  - "user-id3"
        "400":
          description: 不正なリクエスト
        "401":
          description: 未認証
        "403":
          description: トークンの不一致
        "404":
          description: データが存在しません
        "500":
          description: 予期せぬエラー

  /chat-requests/:
    post:
      tags:
        - chat-requests
      summary: チャットリクエストの作成
      description: トークンを使って他人に成りすましたチャットリクエストを作成しないように実装する（ユーザー自身からのチャットリクエストのみを作成する）。成功したら作成したチャットリクエストのIDを返す。
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: 認証用のトークン
                  example: d6289334-d2df-41bb-9410-d2f33de40b16
                sender-id:
                  type: string
                  description: リクエストした側のユーザID
                  example: skyfox_82z
                receiver-id:
                  type: string
                  description: リクエストされた側のユーザID
                  example: echo_wolf7
              required:
                - token
                - sender-id
                - receiver-id
      responses:
        "204":
          description: チャットがリクエストされました。
          content:
            application/json:
              schema:
                type: object
                properties:
                  chat-request-id:
                    type: integer
                    description: 作成されたチャットリクエストのID
                    example: 20

  /chat-requests/{chat-request-id}/:
    delete:
      tags:
        - chat-requests
      summary: チャットのリクエストを消去する
      description: チャットリクエストIDを指定してチャットリクエストを消去する
      parameters:
        - in: path
          name: chat-request-id
          example: 20
          schema:
            type: integer
          required: true
        - in: query
          name: token
          example: d6289334-d2df-41bb-9410-d2f33de40b16
          schema:
            type: string
          required: true
      responses:
        "204":
          description: チャットリクエストが削除されました。
        "401":
          description: 認証が必要です
        "403":
          description: 権限がありません。
        "404":
          description: チャットリクエストが見つかりません。

  /chat-rooms/:
    post:
      tags:
        - chat-rooms
      summary: チャットルームの作成
      description: チャットリクエストの承認時に呼び出され、リクエストした側のユーザとされた側のユーザーがチャットルームに入る。成功したら、作成したチャットルームのIDを返す。
      parameters:
        - in: query
          name: user0-id
          example: user0-id
          schema:
            type: string
          required: true
        - in: query
          name: user1-id
          example: user1-id
          schema:
            type: string
          required: true
        - in: query
          name: token
          description: user0-id側のトークン
          example: d6289334-d2df-41bb-9410-d2f33de40b16
          schema:
            type: string
          required: true
      responses:
        "200":
          description: 成功時のレスポンス
          content:
            application/json:
              schema:
                type: object
                properties:
                  room-id:
                    type: integer
                    example: 1
        "401":
          description: 認証失敗
    get:
      tags:
        - chat-rooms
      summary: チャットルームのIDの取得
      description: 指定したユーザが参加しているチャットルームを検索して、チャットルームIDを取得する
      parameters:
        - in: query
          name: user0-id
          example: user0-id
          schema:
            type: string
          required: true
        - in: query
          name: token
          description: user0-idのトークン
          example: d6289334-d2df-41bb-9410-d2f33de40b16
          schema:
            type: string
          required: true
      responses:
        "200":
          description: 成功時のレスポンス
          content:
            application/json:
              schema:
                type: object
                properties:
                  room-id:
                    type: integer
                    example: 1
        "404":
          description: IDが存在しません
        "401":
          description: 認証失敗

  /chat-rooms/{chatroom-id}/{user-id}/:
    get:
      tags:
        - chat-rooms
      summary: メッセージを閲覧する
      description: チャットルームIDと相手のユーザのIDを指定して、相手のチャットメッセージを取得する。
      parameters:
        - in: path
          name: chatroom-id
          required: true
          description: チャットルームのID
          schema:
            type: integer
        - in: path
          name: user-id
          required: true
          description: 相手のユーザーID
          example: skyfox_82z
          schema:
            type: string
        - in: query
          name: token
          example: d6289334-d2df-41bb-9410-d2f33de40b16
          required: true
          description: チャットルームに入っているユーザーの認証用トークン
          schema:
            type: string
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: メッセージ本文
                    example: "この後ご飯行かんー？"
        "403":
          description: "認証されていません"
    delete:
      tags: 
        - chat-rooms
      summary: チャットルームの削除
      description: チャットルームIDを指定して、チャットルームを削除する
      parameters:
        - in: path
          name: chatroom-id
          example: 20
          schema:
            type: integer
          required: true
        - in: path
          name: user-id
          example: test
          schema:
            type: string
          required: true
        - in: query
          name: token
          example: d6289334-d2df-41bb-9410-d2f33de40b16
          schema:
            type: string
          required: true
      responses:
        "200":
          description: 成功
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: メッセージ本文
                    example: "ユーザをルームから退出しました"
        "204":
          description: チャットルームidが見つかりません。
        "401":
          description: IDが存在しません。
        "404":
          description: チャットリクエストが見つかりません。
    put:
      tags:
        - chat-rooms
      summary: チャットルームにユーザーを追加する
      description: チャットルームにユーザーを追加する（メッセージは作成しない）
      parameters:
        - in: path
          name: chatroom-id
          required: true
          description: チャットルームのID
          example: 12
          schema:
            type: integer
        - in: path
          name: user-id
          required: true
          description: チャットルームに参加するユーザーのID
          example: skyfox_82z
          schema:
            type: string
        - in: query
          name: token
          required: true
          description: チャットルームに参加するユーザーの認証用のトークン
          example: d6289334-d2df-41bb-9410-d2f33de40b16
          schema:
            type: string
      responses:
        "200":
          description: 参加に成功しました
        "403":
          description: 認証されていません
        "404":
          description: チャットルームが見つかりません
        "500":
          description: サーバー内部でエラーが発生しました
    

  /chat-rooms/{chatroom-id}/{user-id}/message:
    # parameters:
      # - $ref: "#/components/parameters/chat-room-id"
      # - $ref: "#/components/parameters/user-id"
    put:
      tags:
        - chat-rooms
      summary: メッセージの更新
      description: 自分のチャットメッセージを更新する。
      parameters:
      - in: path
        name: user-id
        description: ユーザーID
        schema:
          type: string
        required: true
      - in: path
        name: chatroom-id
        description: チャットルームID
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: user-idのトークン
                message:
                  type: string
                  description: 新しいメッセージ
              required:
                - message
                - token
      responses:
        "200":
          description: 正常にメッセージが更新されました
        "400":
          description: リクエスト形式が不正です
        "404":
          description: チャットルームが見つかりません
        "500":
          description: サーバー内部でエラーが発生しました
# components:

  
  