module Symphonia module Swagger module BaseController extend ActiveSupport::Concern # General swagger description # # How to use: # `include Symphonia::Swagger::BaseController` # # it include all necessary methods then you need call # `swagger_me entity: "MyModelName", base_path: "/my_entities"` # for change which tags list are used with all this endpoints override method `tag_list` # class_methods do # @param [String] name of swagger model def entity=(name) @entity = name end # @param [String] path - route def base_path=(path) @base_path = path end # @abstract guess entity name from controller def entity @entity || name.demodulize.remove("Controller").singularize end # @abstract base route to described controller def base_path @base_path || "/#{entity_name.pluralize}" end # @abstract name used in params def entity_name entity.underscore end # @return [Array] def tag_list [entity] end # @param [String] entity is singular name of described model # @param [String] base_path in URL where is model located in app def swagger_me(entity: name.demodulize.remove("Controller").singularize, base_path: nil) self.entity = entity self.base_path = base_path || "/#{entity_name.pluralize}" include GeneralDefinitions end end module GeneralDefinitions extend ActiveSupport::Concern included do include ::Swagger::Blocks base = self swagger_path "#{base.base_path}.json" do operation :get do key :summary, "List" key :tags, base.tag_list parameter do key :name, "q" key :description, "free-text filter of current entity - `like`" key :in, "query" schema type: "string" end parameter do key :name, "set_filter" key :description, "enable filtering" key :in, "query" schema type: "boolean" end parameter do key :name, "sort" key :description, "name of 'column' for sort. Can be also in format name:asc or :desc" key :example, "email:desc (for reverse order users by e-mail" key :in, "query" schema type: "string" end parameter do key :name, "page" key :description, "number of requested page" key :in, "query" schema type: "integer" end extend Symphonia::Swagger::Responses response 200 do key :description, "ok" content "application/json" do schema type: "array" do items do key "$ref", base.entity end end end end end end swagger_path "#{base.base_path}/{id}.json" do operation :get do key :summary, 'Find by ID' key :description, 'Returns a single entity' key :tags, base.tag_list parameter do key :name, "id" key :in, "path" key :description, 'ID to fetch' key :required, true schema do key :type, "integer" key :format, "int64" end end extend Symphonia::Swagger::Responses response 200 do key :description, 'detail object response' content "application/json" do schema do key :'$ref', base.entity end end end end end end end end end end