require 'swagger/blocks'

module Msf::WebServices::Documentation::Api::V1::SessionApiDoc
  include Swagger::Blocks

# Swagger documentation for sessions model
  swagger_schema :Session do
    key :required, [:id]
    property :id, type: :integer, format: :int32
    property :stype, type: :string
    property :via_exploit, type: :string
    property :via_payload, type: :string
    property :desc, type: :string
    property :port, type: :integer, format: :int32
    property :platform, type: :string
    property :opened_at, type: :string, format: :date_time
    property :closed_at, type: :string, format: :date_time
    property :closed_reason, type: :string
    property :local_id, type: :integer, format: :int32
    property :last_seen, type: :string, format: :date_time
    property :module_run_id, type: :integer, format: :int32
  end

  swagger_path '/api/v1/sessions' do
    # Swagger documentation for /api/v1/sessions GET
    operation :get do
      key :description, 'Return sessions that are stored in the database.'
      key :tags, [ 'session' ]

      parameter :workspace

      response 200 do
        key :description, 'Returns session data.'
        schema do
          property :data do
            key :type, :array
            items do
              key :'$ref', :Session
            end
          end
        end
      end

      response 401 do
        key :description, Msf::WebServices::Documentation::Api::V1::RootApiDoc::DEFAULT_RESPONSE_401
        schema do
          key :'$ref', :AuthErrorModel
        end
      end

      response 500 do
        key :description, Msf::WebServices::Documentation::Api::V1::RootApiDoc::DEFAULT_RESPONSE_500
        schema do
          key :'$ref', :ErrorModel
        end
      end
    end

    # Swagger documentation for /api/v1/sessions POST

    # API based creation of session objects is not yet supported from a user-facing perspective.
    # Once this is implemented in a sensible way we will need to uncomment and update the below doc code.

    # operation :post do
    #   key :description, 'Create a session entry.'
    #   key :tags, [ 'session' ]
    #
    #   parameter do
    #     key :in, :body
    #     key :name, :body
    #     key :description, 'The attributes to assign to the session.'
    #     key :required, true
    #     schema do
    #       key :'$ref', :Session
    #     end
    #   end
    #
    #   response 200 do
    #     key :description, Msf::WebServices::Documentation::Api::V1::RootApiDoc::DEFAULT_RESPONSE_200
    #     schema do
    #       key :type, :object
    #       key :'$ref', :Session
    #     end
    #   end
    # end
  end

  swagger_path '/api/v1/sessions/{id}' do
    # Swagger documentation for /api/v1/sessions/:id GET
    operation :get do
      key :description, 'Return a specific session that is stored in the database.'
      key :tags, [ 'session' ]

      parameter do
        key :name, :id
        key :in, :path
        key :description, 'ID of session to retrieve.'
        key :required, true
        key :type, :integer
        key :format, :int32
      end

      response 200 do
        key :description, 'Returns session data.'
        schema do
          property :data do
            key :'$ref', :Session
          end
        end
      end

      response 401 do
        key :description, Msf::WebServices::Documentation::Api::V1::RootApiDoc::DEFAULT_RESPONSE_401
        schema do
          key :'$ref', :AuthErrorModel
        end
      end

      response 500 do
        key :description, Msf::WebServices::Documentation::Api::V1::RootApiDoc::DEFAULT_RESPONSE_500
        schema do
          key :'$ref', :ErrorModel
        end
      end
    end
  end
end
