namespace :api_docs do desc 'Generate OpenAPI schema' task generate: :environment do Rails.application.eager_load! api_definitions = ApiRegulator.configuration.base_controller_klass.descendants.flat_map(&:api_definitions) ApiRegulator::OpenApiGenerator.generate(api_definitions) end desc "Upload OpenAPI schema to ReadMe" task :upload => :environment do # ReadMe API key and version readme_api_key = ENV['RDME_API_KEY'] || raise("RDME_API_KEY is not set") # ReadMe API endpoint readme_api_endpoint = "https://dash.readme.com/api/v1/api-specification" # Read the OpenAPI schema file unless File.exist?(ApiRegulator.configuration.docs_path) raise "OpenAPI schema file not found at #{ApiRegulator.configuration.docs_path}" end openapi_content = File.read(ApiRegulator.configuration.docs_path) # Upload to ReadMe require 'net/http' require 'uri' require 'json' if ApiRegulator.configuration.rdme_api_id uri = URI.parse("#{readme_api_endpoint}/#{ApiRegulator.configuration.rdme_api_id}") request = Net::HTTP::Put.new(uri) else uri = URI.parse(readme_api_endpoint) request = Net::HTTP::Post.new(uri) end request["Authorization"] = "Basic #{Base64.strict_encode64(readme_api_key)}" request["Content-Type"] = "application/json" request.body = { spec: JSON.parse(openapi_content) }.to_json response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http| http.request(request) end if response.code.to_i == 200 puts "OpenAPI schema successfully updated!" elsif response.code.to_i == 201 puts "OpenAPI schema successfully created!" puts "To use this for future publishing, add this to your ApiRegulator configs:" puts "" puts " config.rdme_api_id = \"#{JSON.parse(response.body)["_id"]}\"" puts "" else puts "Failed to upload OpenAPI schema to ReadMe!" puts "Response Code: #{response.code}" puts "Response Body:" pp JSON.parse(response.body) end end desc 'Generate and upload OpenAPI schema' task publish: :environment do Rake::Task["api_docs:generate"].invoke Rake::Task["api_docs:upload"].invoke end end