Skip to content

API 定義

以下は OpenAPI の定義ファイルです。

yaml
openapi: 3.0.3
info:
  title: Future Muscle Partner API
  description: パーソナルトレーナーのマッチングサービスAPI
  version: 1.0.0
tags:
  - name: account
    description: アカウント管理
  - name: profile
    description: プロフィール
  - name: trainer
    description: パーソナルトレーナー
  - name: booking
    description: 予約
  - name: review
    description: レビュー
  - name: payment
    description: 決済
  - name: provider
    description: パーソナルトレーニング提供者
security:
  - Bearer: []
paths:
  /login:
    post:
      tags:
        - account
      summary: API001 ログイン
      operationId: login
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/LoginRequest"
      responses:
        "200":
          description: ログインに成功しました。
        "400":
          $ref: "#/components/responses/BadRequest"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /logout:
    post:
      tags:
        - account
      summary: API002 ログアウト
      operationId: logout
      security: []
      responses:
        "200":
          description: ログアウトに成功しました。
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /signup:
    post:
      tags:
        - account
      summary: API003 会員登録
      operationId: signup
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SignupRequest"
      responses:
        "200":
          description: 会員登録に成功しました。
        "400":
          $ref: "#/components/responses/BadRequest"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /account:
    delete:
      tags:
        - account
      summary: API004 会員退会
      operationId: deleteAccount
      responses:
        "200":
          description: 会員退会に成功しました。
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /profile/{trainee_id}:
    get:
      tags:
        - profile
      summary: API005 プロフィール表示
      operationId: getUserProfile
      responses:
        "200":
          description: プロフィールの取得に成功しました。
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Profile"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
    put:
      tags:
        - profile
      summary: API006 プロフィール更新
      operationId: putUserProfile
      parameters:
        - name: trainee_id
          in: path
          description: トレーニーID
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ProfileRequest"
      responses:
        "200":
          description: プロフィールの更新に成功しました。
        "401":
          $ref: "#/components/responses/Unauthorized"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /trainers:
    get:
      tags:
        - trainer
      summary: API007 パーソナルトレーナー検索
      operationId: searchTrainers
      security: []
      parameters:
        - name: favorite_gym_name
          in: query
          description: 行きつけのジム名
          required: true
          schema:
            type: string
        - name: store_name
          in: query
          description: 店舗名
          required: true
          schema:
            type: string
        - name: training_start_at
          in: query
          description: トレーニング開始
          schema:
            type: string
        - name: training_end_at
          in: query
          description: トレーニング終了時間
          schema:
            type: string
        - name: budget
          in: query
          description: 予算
          schema:
            type: number
            format: integer
        - name: training_menu_typ
          in: query
          description: トレーニングメニュー区分
          schema:
            type: number
            format: integer
            enum: [1, 2, 3]
      responses:
        "200":
          description: トレーナーの検索結果を取得しました。
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Trainers"
        "400":
          $ref: "#/components/responses/BadRequest"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /trainers/{trainer_id}/menus:
    get:
      tags:
        - trainer
      summary: API008 トレーニングメニュー取得
      operationId: getTrainingMenu
      security: []
      parameters:
        - name: trainer_id
          in: path
          description: トレーナーのID
          required: true
          schema:
            type: string
      responses:
        "200":
          description: トレーニングメニューを取得しました。
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TrainingMenus"
        "400":
          $ref: "#/components/responses/BadRequest"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"

  /trainers/{trainer_id}/profile:
    get:
      tags:
        - trainer
      summary: API009 トレーナープロフィール取得
      operationId: getTrainerProfile
      security: []
      parameters:
        - name: trainer_id
          in: path
          description: トレーナーのID
          required: true
          schema:
            type: string
      responses:
        "200":
          description: トレーナープロフィールを取得しました。
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Trainer"
        "400":
          $ref: "#/components/responses/BadRequest"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /trainers/{trainer_id}/reviews:
    get:
      tags:
        - trainer
      summary: API010 トレーナー口コミ取得
      operationId: getTrainerReviews
      security: []
      parameters:
        - name: trainer_id
          in: path
          description: トレーナーのID
          required: true
          schema:
            type: string
      responses:
        "200":
          description: トレーナーの口コミを取得しました。
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Reviews"
        "400":
          $ref: "#/components/responses/BadRequest"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /trainers/{trainer_id}/schedule:
    get:
      tags:
        - trainer
      summary: API011 トレーナースケジュール取得
      operationId: getTrainerSchedule
      security: []
      parameters:
        - name: trainer_id
          in: path
          description: トレーナーのID
          required: true
          schema:
            type: string
      responses:
        "200":
          description: トレーナーのスケジュールを取得しました。
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TrainerSchedules"
        "400":
          $ref: "#/components/responses/BadRequest"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /bookings:
    post:
      tags:
        - booking
      summary: API012 トレーニング予約(仮登録)
      operationId: bookTraining
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BookingRequest"
      responses:
        "200":
          description: 予約が仮登録されました。
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "409":
          $ref: "#/components/responses/Conflict"
        "422":
          $ref: "#/components/responses/UnprocessableEntity"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /bookings/{trainee_id}:
    get:
      tags:
        - booking
      summary: API013 予約済みトレーニング取得
      operationId: getBookings
      parameters:
        - name: trainee_id
          in: path
          description: トレーニーID
          required: true
          schema:
            type: string
        - name: start_at
          in: query
          description: 開始日時
          schema:
            type: string
        - name: end_at
          in: query
          description: 終了日時
          schema:
            type: string
      responses:
        "200":
          description: ユーザーの予約情報を取得しました。
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Bookings"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /bookings/{booking_id}:
    delete:
      tags:
        - booking
      summary: API014 トレーニング予約削除
      operationId: deleteBooking
      parameters:
        - name: booking_id
          in: path
          description: 予約ID
          required: true
          schema:
            type: string
      responses:
        "200":
          description: 予約が削除されました。
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /bookings/{booking_id}/confirm:
    post:
      tags:
        - booking
      summary: API015 トレーニング予約(本登録)
      operationId: confirmBooking
      parameters:
        - name: booking_id
          in: path
          description: 予約ID
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/BookingConfirmationRequest"
      responses:
        "200":
          description: 予約が本登録されました。
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "409":
          $ref: "#/components/responses/Conflict"
        "422":
          $ref: "#/components/responses/UnprocessableEntity"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /booking/{booking_id}/status:
    put:
      tags:
        - booking
      summary: API016 トレーニング受講ステータス変更
      operationId: updateTrainingStatus
      parameters:
        - name: booking_id
          in: path
          description: 予約ID
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TrainingStatusUpdateRequest"
      responses:
        "200":
          description: ステータスが更新されました。
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "422":
          $ref: "#/components/responses/UnprocessableEntity"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /payment:
    post:
      tags:
        - payment
      summary: API017 決済
      operationId: makePayment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PaymentRequest"
      responses:
        "200":
          description: 決済が完了しました。
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "409":
          $ref: "#/components/responses/Conflict"
        "422":
          $ref: "#/components/responses/UnprocessableEntity"
        "500":
          $ref: "#/components/responses/InternalServer"
        "503":
          $ref: "#/components/responses/ServiceUnavailable"
  /reviews:
    post:
      tags:
        - review
      summary: API018 口コミ登録
      operationId: postReview
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReviewRequest"
      responses:
        "200":
          description: 口コミ登録成功
  /reviews/{review_id}:
    put:
      tags:
        - review
      summary: API019 口コミ修正
      operationId: putReview
      parameters:
        - name: review_id
          in: path
          description: レビューID
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReviewUpdateRequest"
      responses:
        "200":
          description: 口コミ修正成功
    delete:
      tags:
        - review
      summary: API020 口コミ削除
      operationId: deleteReview
      parameters:
        - name: review_id
          in: path
          description: 口コミID
          required: true
          schema:
            type: string
      responses:
        "200":
          description: 口コミ削除成功
  /trainer:
    post:
      tags:
        - provider
      summary: API021 トレーナー登録
      operationId: postTrainer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Trainer"
      responses:
        "200":
          description: トレーナー登録成功
    put:
      tags:
        - provider
      summary: API022 トレーナー属性更新
      operationId: putTrainer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Trainer"
      responses:
        "200":
          description: トレーナー属性更新成功
  /training-menus:
    post:
      tags:
        - provider
      summary: API023 トレーニングメニュー登録
      operationId: postTrainingMenu
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TrainingMenu"
      responses:
        "200":
          description: トレーニングメニュー登録成功
  /training-menus/{menu_id}:
    put:
      tags:
        - provider
      summary: API024 トレーニングメニュー更新
      operationId: putTrainingMenu
      parameters:
        - name: menu_id
          in: path
          description: メニューID
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TrainingMenu"
      responses:
        "200":
          description: トレーニングメニュー更新成功
    delete:
      tags:
        - provider
      summary: API025 トレーニングメニュー削除
      operationId: deleteTrainingMenu
      parameters:
        - name: menu_id
          in: path
          description: メニューID
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: トレーニングメニュー削除成功

components:
  schemas:
    ProblemDetailError:
      description: A Problem Details object (RFC 9457)
      type: object
      properties:
        title:
          type: string
          description: A short summary of the problem type. Written in English and readable for engineers (usually not suited for non technical stakeholders and not localized).
          example: Service Unavailable
        status:
          type: integer
          format: int32
          description: The HTTP status code generated by the origin server for this occurrence of the problem.
          minimum: 400
          maximum: 600
          exclusiveMaximum: true
          example: 503
        detail:
          type: string
          description: A human-readable explanation specific to this occurrence of the problem
      example:
        title: Description of the type of problem that occurred
        status: 400 # HTTP response status, appropriate for the problem type
        detail: Description of specific occurrence of the problem

    LoginRequest:
      type: object
      properties:
        email:
          type: string
          format: email
          description: メールアドレス
        password:
          type: string
          format: password
          description: パスワード
    SignupRequest:
      type: object
      properties:
        email:
          type: string
          format: email
          description: メールアドレス
        password:
          type: string
          format: password
          description: パスワード
        name:
          type: string
          description: 名前
    ProfileRequest:
      type: object
      properties:
        trainee_name:
          type: string
          description: トレーニー名
        display_name:
          type: string
          description: 表示名
        self_introduction:
          type: string
          description: 自己紹介
    PaymentRequest:
      type: object
      properties:
        amount:
          type: number
          format: double
          description: 支払金額
        method:
          type: string
          description: 支払方法
    BookingRequest:
      type: object
      properties:
        menu_id:
          type: string
          description: トレーニングメニューのID
        booking_status_typ:
          type: string
          enum: ["0"]
          description: |
            予約ステータス区分
              0: 仮登録
        trainee_id:
          type: string
          description: トレーニーID
        training_start_at:
          type: string
          format: date
          description: トレーニング開始日時
        training_end_at:
          type: string
          format: date
          description: トレーニング終了日時
    BookingConfirmationRequest:
      type: object
      properties:
        booking_status_typ:
          type: string
          enum: ["1"]
          description: |
            予約ステータス区分
              1: 本登録
    TrainingStatusUpdateRequest:
      type: object
      properties:
        booking_status_typ:
          type: string
          enum: ["2", "3"]
          description: |
            予約ステータス区分
              2: 受講中
              3: 受講済み
    ReviewRequest:
      type: object
      properties:
        trainer_id:
          type: string
          description: トレーナーID
        trainee_id:
          type: string
          description: トレー二ーID
        comment:
          type: string
          description: レビューコメント
    ReviewUpdateRequest:
      type: object
      properties:
        review_id:
          type: string
          description: レビューID
        comment:
          type: string
          description: レビューコメント
    Profile:
      type: object
      properties:
        trainee_id:
          type: string
          description: トレーニーID
        trainee_name:
          type: string
          description: トレーニー名
        display_name:
          type: string
          description: 表示名
        self_introduction:
          type: string
          description: 自己紹介
        thumbnail_url:
          type: string
          description: サムネイル画像URL
    Bookings:
      type: object
      properties:
        bokkings:
          type: array
          items:
            $ref: "#/components/schemas/Booking"
    Booking:
      type: object
      properties:
        booking_id:
          type: string
          description: 予約ID
        menu_id:
          type: string
          description: トレーニングメニューのID
        trainer_id:
          type: string
          description: トレーナーのID
        display_order:
          type: string
          description: 表示順序
        menu_name:
          type: string
          description: メニュー名
        menu_description:
          type: string
          description: メニュー説明
        required_time:
          type: integer
          description: 所要時間
        price:
          type: integer
          description: 料金
        start_at:
          type: string
          format: date
          description: 開始日時
        end_at:
          type: string
          format: date
          description: 終了日時
        training_start_at:
          type: string
          format: date
          description: トレーニング開始日時
        training_end_at:
          type: string
          format: date
          description: トレーニング終了日時
    Trainers:
      type: object
      properties:
        count:
          type: integer
          description: 検索件数
        items:
          type: array
          items:
            $ref: "#/components/schemas/Trainer"
    Trainer:
      type: object
      properties:
        trainer_id:
          type: string
          description: トレーナーID
        trainer_name:
          type: string
          description: トレーナー名
        unit_price:
          type: integer
          description: 単価
        business_start_at:
          type: string
          format: date
          description: 営業開始時間
        business_end_at:
          type: string
          format: date
          description: 営業終了時間
        public_mail_addr:
          type: string
          format: email
          description: 公開メールアドレス
        public_tel:
          type: string
          description: 公開電話番号
        store_name:
          type: string
          description: 店舗名
        gym_name:
          type: string
          description: ジム名
        star_count:
          type: number
          format: float
          description: 星の数
    TrainerSchedules:
      type: object
      properties:
        count:
          type: integer
          description: 検索件数
        items:
          type: array
          items:
            $ref: "#/components/schemas/TrainerSchedule"
    TrainerSchedule:
      type: object
      properties:
        trainer_id:
          type: string
          description: トレーナーID
        trainer_name:
          type: string
          description: トレーナー名
        date:
          type: string
          format: date
          description: 日付け
        booking_typ_0000:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 00:00-00:30
              0: 未予約
              1: 予約済み
        booking_typ_0030:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 00:30-01:00
              0: 未予約
              1: 予約済み
        booking_typ_0100:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 01:00-01:30
              0: 未予約
              1: 予約済み
        booking_typ_0130:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 01:30-02:00
              0: 未予約
              1: 予約済み
        booking_typ_0200:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 02:00-02:30
              0: 未予約
              1: 予約済み
        booking_typ_0230:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 02:30-03:00
              0: 未予約
              1: 予約済み
        booking_typ_0300:
          type: string
          description: |
            予約区分 03:00-03:30
              0: 未予約
              1: 予約済み
        booking_typ_0330:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 03:30-04:00
              0: 未予約
              1: 予約済み
        booking_typ_0400:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 04:00-04:30
              0: 未予約
              1: 予約済み
        booking_typ_0430:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 04:30-05:00
              0: 未予約
              1: 予約済み
        booking_typ_0500:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 05:00-05:30
              0: 未予約
              1: 予約済み
        booking_typ_0530:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 05:30-06:00
              0: 未予約
              1: 予約済み
        booking_typ_0600:
          type: string
          description: |
            予約区分 06:00-06:30
              0: 未予約
              1: 予約済み
        booking_typ_0630:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 06:30-07:00
              0: 未予約
              1: 予約済み
        booking_typ_0700:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 07:00-07:30
              0: 未予約
              1: 予約済み
        booking_typ_0730:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 07:30-08:00
              0: 未予約
              1: 予約済み
        booking_typ_0800:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 08:00-08:30
              0: 未予約
              1: 予約済み
        booking_typ_0830:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 08:30-09:00
              0: 未予約
              1: 予約済み
        booking_typ_0900:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 09:00-09:30
              0: 未予約
              1: 予約済み
        booking_typ_0930:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 09:30-10:00
              0: 未予約
              1: 予約済み
        booking_typ_1000:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 10:00-10:30
              0: 未予約
              1: 予約済み
        booking_typ_1030:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 10:30-11:00
              0: 未予約
              1: 予約済み
        booking_typ_1100:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 11:00-11:30
              0: 未予約
              1: 予約済み
        booking_typ_1130:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 11:30-12:00
              0: 未予約
              1: 予約済み
        booking_typ_1200:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 12:00-12:30
              0: 未予約
              1: 予約済み
        booking_typ_1230:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 12:30-13:00
              0: 未予約
              1: 予約済み
        booking_typ_1300:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 13:00-13:30
              0: 未予約
              1: 予約済み
        booking_typ_1330:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 13:30-14:00
              0: 未予約
              1: 予約済み
        booking_typ_1400:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 14:00-14:30
              0: 未予約
              1: 予約済み
        booking_typ_1430:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 14:30-15:00
              0: 未予約
              1: 予約済み
        booking_typ_1500:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 15:00-15:30
              0: 未予約
              1: 予約済み
        booking_typ_1530:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 15:30-16:00
              0: 未予約
              1: 予約済み
        booking_typ_1600:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 16:00-16:30
              0: 未予約
              1: 予約済み
        booking_typ_1630:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 16:30-17:00
              0: 未予約
              1: 予約済み
        booking_typ_1700:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 17:00-17:30
              0: 未予約
              1: 予約済み
        booking_typ_1730:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 17:30-18:00
              0: 未予約
              1: 予約済み
        booking_typ_1800:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 18:00-18:30
              0: 未予約
              1: 予約済み
        booking_typ_1830:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 18:30-19:00
              0: 未予約
              1: 予約済み
        booking_typ_1900:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 19:00-19:30
              0: 未予約
              1: 予約済み
        booking_typ_1930:
          type: string
          description: |
            予約区分 19:30-20:00
              0: 未予約
              1: 予約済み
        booking_typ_2000:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 20:00-20:30
              0: 未予約
              1: 予約済み
        booking_typ_2030:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 20:30-21:00
              0: 未予約
              1: 予約済み
        booking_typ_2100:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 21:00-21:30
              0: 未予約
              1: 予約済み
        booking_typ_2130:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 21:30-22:00
              0: 未予約
              1: 予約済み
        booking_typ_2200:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 22:00-22:30
              0: 未予約
              1: 予約済み
        booking_typ_2230:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 22:30-23:00
              0: 未予約
              1: 予約済み
        booking_typ_2300:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 23:00-23:30
              0: 未予約
              1: 予約済み
        booking_typ_2330:
          type: string
          enum: ["0", "1"]
          description: |
            予約区分 23:30-24:00
              0: 未予約
              1: 予約済み
    TrainingMenus:
      type: object
      properties:
        count:
          type: integer
          description: 検索件数
        items:
          type: array
          items:
            $ref: "#/components/schemas/TrainingMenu"
    TrainingMenu:
      type: object
      properties:
        menu_id:
          type: string
        trainer_id:
          type: string
          description: トレーナーID
        display_order:
          type: string
          description: 表示順序
        menu_name:
          type: string
          description: メニュー名
        menu_description:
          type: string
          description: メニュー説明
        required_time:
          type: integer
          description: 所要時間
        price:
          type: integer
          description: 料金
    Reviews:
      type: object
      properties:
        count:
          type: integer
          description: 検索件数
        items:
          type: array
          items:
            $ref: "#/components/schemas/Review"
    Review:
      type: object
      properties:
        review_id:
          type: string
          description: レビューID
        display_name:
          type: string
          description: トレーニーの表示名
        trainer_name:
          type: string
          description: トレーナー名
        comment:
          type: string
          description: レビューコメント
        posted_at:
          type: string
          format: date
          description: 投稿日時
        star_count:
          type: number
          format: float
          description: 星の数
  responses:
    BadRequest:
      description: 400 Bad Request
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ProblemDetailError"
    Unauthorized:
      description: 401 Unauthorized
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ProblemDetailError"
    Forbidden:
      description: 403 Forbidden
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ProblemDetailError"
    NotFound:
      description: 404 Not Found
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ProblemDetailError"
    Conflict:
      description: 409 Conflict
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ProblemDetailError"
    UnprocessableEntity:
      description: 422 Unprocessable Content
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ProblemDetailError"
    InternalServer:
      description: 500 Internal Server
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ProblemDetailError"
    ServiceUnavailable:
      description: 503 Service Unavailable
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ProblemDetailError"
  securitySchemes:
    Bearer:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: "Bearer トークン認証"