zero-rails_openapi 1.7.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +404 -434
- data/README_zh.md +5 -5
- data/{documentation/examples → examples}/auto_gen_doc.rb +0 -0
- data/{documentation/examples → examples}/open_api.rb +11 -15
- data/{documentation/examples → examples}/output_example.json +0 -0
- data/lib/oas_objs/callback_obj.rb +5 -10
- data/lib/oas_objs/combined_schema.rb +16 -12
- data/lib/oas_objs/example_obj.rb +9 -7
- data/lib/oas_objs/helpers.rb +4 -20
- data/lib/oas_objs/media_type_obj.rb +10 -10
- data/lib/oas_objs/param_obj.rb +8 -11
- data/lib/oas_objs/ref_obj.rb +2 -0
- data/lib/oas_objs/request_body_obj.rb +6 -2
- data/lib/oas_objs/response_obj.rb +5 -2
- data/lib/oas_objs/schema_obj.rb +48 -67
- data/lib/oas_objs/schema_obj_helpers.rb +11 -35
- data/lib/open_api.rb +57 -6
- data/lib/open_api/config.rb +10 -37
- data/lib/open_api/config_dsl.rb +2 -0
- data/lib/open_api/dsl.rb +36 -49
- data/lib/open_api/dsl/api.rb +63 -68
- data/lib/open_api/dsl/components.rb +34 -24
- data/lib/open_api/dsl/helpers.rb +26 -52
- data/lib/open_api/router.rb +50 -0
- data/lib/open_api/support/tip.rb +26 -0
- data/lib/open_api/version.rb +3 -1
- data/zero-rails_openapi.gemspec +6 -6
- metadata +19 -23
- data/documentation/examples/auto_gen_desc.rb +0 -29
- data/documentation/examples/examples_controller.rb +0 -60
- data/documentation/examples/goods_doc.rb +0 -52
- data/documentation/parameter.md +0 -69
- data/lib/open_api/dsl/common_dsl.rb +0 -39
- data/lib/open_api/generator.rb +0 -116
@@ -1,15 +1,19 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'open_api/dsl/helpers'
|
2
4
|
|
3
5
|
module OpenApi
|
4
6
|
module DSL
|
5
7
|
class Components < Hash
|
6
|
-
include DSL::CommonDSL
|
7
8
|
include DSL::Helpers
|
8
9
|
|
9
|
-
def
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
def initialize
|
11
|
+
merge!(%i[ schemas responses parameters examples requestBodies securitySchemes ].map { |k| [ k, { } ] }.to_h)
|
12
|
+
end
|
13
|
+
|
14
|
+
def schema component_key, type = nil, **schema
|
15
|
+
return unless schema = process_schema_input(type, schema, component_key, model: component_key)
|
16
|
+
self[:schemas][component_key.to_s.to_sym] = schema.process
|
13
17
|
end
|
14
18
|
|
15
19
|
arrow_enable :schema
|
@@ -20,31 +24,37 @@ module OpenApi
|
|
20
24
|
|
21
25
|
arrow_enable :example
|
22
26
|
|
23
|
-
def param component_key, param_type, name, type, required,
|
24
|
-
|
27
|
+
def param component_key, param_type, name, type, required, schema = { }
|
28
|
+
return unless schema = process_schema_input(type, schema, name)
|
29
|
+
self[:parameters][component_key] = ParamObj.new(name, param_type, type, required, schema).process
|
25
30
|
end
|
26
31
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
+
%i[ header header! path path! query query! cookie cookie! ].each do |param_type|
|
33
|
+
define_method param_type do |component_key, name, type = nil, **schema|
|
34
|
+
param component_key, param_type, name, type, (param_type['!'] ? :req : :opt), schema
|
35
|
+
end
|
36
|
+
arrow_enable param_type
|
32
37
|
end
|
33
38
|
|
34
|
-
arrow_enable :_param_agent
|
35
|
-
|
36
39
|
def request_body component_key, required, media_type, data: { }, desc: '', **options
|
37
|
-
|
38
|
-
cur = RequestBodyObj.new(required, desc) unless cur.is_a?(RequestBodyObj)
|
39
|
-
self[:requestBodies][component_key] = cur.add_or_fusion(media_type, { data: data, **options })
|
40
|
+
(self[:requestBodies][component_key] ||= RequestBodyObj.new(required, desc)).absorb(media_type, { data: data, **options })
|
40
41
|
end
|
41
42
|
|
42
|
-
|
43
|
-
|
44
|
-
|
43
|
+
%i[ body body! ].each do |method|
|
44
|
+
define_method method do |component_key, media_type, data: { }, **options|
|
45
|
+
request_body component_key, (method['!'] ? :req : :opt), media_type, data: data, **options
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
arrow_enable :body
|
50
|
+
arrow_enable :body!
|
51
|
+
|
52
|
+
def response component_key, desc, media_type = nil, data: { }
|
53
|
+
(self[:responses][component_key] ||= ResponseObj.new(desc)).absorb(desc, media_type, { data: data })
|
45
54
|
end
|
46
55
|
|
47
|
-
|
56
|
+
alias_method :resp, :response
|
57
|
+
alias_method :error, :response
|
48
58
|
|
49
59
|
arrow_enable :resp
|
50
60
|
arrow_enable :response
|
@@ -71,8 +81,7 @@ module OpenApi
|
|
71
81
|
arrow_enable :bearer_auth
|
72
82
|
|
73
83
|
def api_key scheme_name, field:, in: 'header', **other_info
|
74
|
-
|
75
|
-
security_scheme scheme_name, { type: 'apiKey', name: field, in: _in, **other_info }
|
84
|
+
security_scheme scheme_name, { type: 'apiKey', name: field, in: binding.local_variable_get(:in), **other_info }
|
76
85
|
end
|
77
86
|
|
78
87
|
arrow_enable :api_key
|
@@ -80,6 +89,7 @@ module OpenApi
|
|
80
89
|
def process_objs
|
81
90
|
self[:requestBodies].each { |key, body| self[:requestBodies][key] = body.process }
|
82
91
|
self[:responses].each { |code, response| self[:responses][code] = response.process }
|
92
|
+
self.delete_if { |_, v| v.blank? }
|
83
93
|
end
|
84
94
|
end
|
85
95
|
end
|
data/lib/open_api/dsl/helpers.rb
CHANGED
@@ -1,65 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'oas_objs/schema_obj'
|
4
|
+
require 'oas_objs/combined_schema'
|
5
|
+
require 'oas_objs/param_obj'
|
6
|
+
require 'oas_objs/response_obj'
|
7
|
+
require 'oas_objs/request_body_obj'
|
8
|
+
require 'oas_objs/ref_obj'
|
9
|
+
require 'oas_objs/example_obj'
|
10
|
+
require 'oas_objs/callback_obj'
|
11
|
+
|
1
12
|
module OpenApi
|
2
13
|
module DSL
|
3
14
|
module Helpers
|
4
|
-
|
5
|
-
base.extend ClassMethods
|
6
|
-
end
|
15
|
+
extend ActiveSupport::Concern
|
7
16
|
|
8
|
-
# :nocov:
|
9
17
|
def load_schema(model) # TODO: test
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
_load_schema_based_on_show_attr(model)
|
17
|
-
else
|
18
|
-
model.columns.map { |column| _type_mapping(column) }
|
19
|
-
end.compact.reduce({ }, :merge!) rescue ''
|
20
|
-
end
|
21
|
-
|
22
|
-
def _type_mapping(column)
|
23
|
-
type = column.sql_type_metadata.type.to_s.camelize
|
24
|
-
type = 'DateTime' if type == 'Datetime'
|
25
|
-
{ column.name.to_sym => Object.const_get(type) }
|
26
|
-
end
|
27
|
-
|
28
|
-
def _load_schema_based_on_show_attr(model)
|
29
|
-
columns = model.column_names.map(&:to_sym)
|
30
|
-
model.show_attrs.map do |attr|
|
31
|
-
if columns.include?(attr)
|
32
|
-
index = columns.index(attr)
|
33
|
-
_type_mapping(model.columns[index])
|
34
|
-
elsif attr[/_info/]
|
35
|
-
# TODO: 如何获知关系是 many?因为不能只判断结尾是否 ‘s’
|
36
|
-
assoc_model = Object.const_get(attr.to_s.split('_').first.singularize.camelize)
|
37
|
-
{ attr => load_schema(assoc_model) }
|
38
|
-
end rescue next
|
39
|
-
end
|
40
|
-
end
|
41
|
-
# :nocov:
|
42
|
-
|
43
|
-
def fill_in_parameters(param_obj)
|
44
|
-
index = self[:parameters].map(&:name).index(param_obj.name)
|
45
|
-
index.present? ? self[:parameters][index] = param_obj : self[:parameters] << param_obj
|
18
|
+
return unless Config.model_base && model.try(:superclass) == Config.model_base
|
19
|
+
model.columns.map do |column|
|
20
|
+
type = column.sql_type_metadata.type.to_s.camelize
|
21
|
+
type = 'DateTime' if type == 'Datetime'
|
22
|
+
[ column.name.to_sym, Object.const_get(type) ]
|
23
|
+
end.to_h rescue ''
|
46
24
|
end
|
47
25
|
|
48
26
|
def _combined_schema(one_of: nil, all_of: nil, any_of: nil, not: nil, **other)
|
49
27
|
input = (_not = binding.local_variable_get(:not)) || one_of || all_of || any_of
|
50
|
-
CombinedSchema.new(one_of: one_of, all_of: all_of, any_of: any_of,
|
28
|
+
CombinedSchema.new(one_of: one_of, all_of: all_of, any_of: any_of, not: _not) if input
|
51
29
|
end
|
52
30
|
|
53
|
-
def
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
combined: combined_schema,
|
60
|
-
info: schema_info,
|
61
|
-
type: type
|
62
|
-
}
|
31
|
+
def process_schema_input(schema_type, schema, name, model: nil)
|
32
|
+
schema = { type: schema } unless schema.is_a?(Hash)
|
33
|
+
combined_schema = _combined_schema(schema)
|
34
|
+
type = schema[:type] ||= schema_type
|
35
|
+
return Tip.param_no_type(name) if type.nil? && combined_schema.nil?
|
36
|
+
combined_schema || SchemaObj.new(type, load_schema(model) || schema)
|
63
37
|
end
|
64
38
|
|
65
39
|
# Arrow Writing:
|
@@ -75,7 +49,7 @@ module OpenApi
|
|
75
49
|
end
|
76
50
|
end
|
77
51
|
|
78
|
-
|
52
|
+
class_methods do
|
79
53
|
def arrow_enable method
|
80
54
|
alias_method :"_#{method}", method
|
81
55
|
define_method method do |*args|
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OpenApi
|
4
|
+
module Router
|
5
|
+
module_function
|
6
|
+
|
7
|
+
def routes
|
8
|
+
@routes ||=
|
9
|
+
if (file = Config.rails_routes_file)
|
10
|
+
File.read(file)
|
11
|
+
else
|
12
|
+
# :nocov:
|
13
|
+
# ref https://github.com/rails/rails/blob/master/railties/lib/rails/tasks/routes.rake
|
14
|
+
require './config/routes'
|
15
|
+
all_routes = Rails.application.routes.routes
|
16
|
+
require 'action_dispatch/routing/inspector'
|
17
|
+
inspector = ActionDispatch::Routing::RoutesInspector.new(all_routes)
|
18
|
+
inspector.format(ActionDispatch::Routing::ConsoleFormatter.new, nil)
|
19
|
+
# :nocov:
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def routes_list
|
24
|
+
@routes_list ||= routes.split("\n").drop(1).map do |line|
|
25
|
+
next unless line['#']
|
26
|
+
infos = line.match(/[A-Z|].*/).to_s.split(' ') # => [GET, /api/v1/examples/:id, api/v1/examples#index]
|
27
|
+
|
28
|
+
{
|
29
|
+
http_verb: infos[0].downcase, # => "get" / "get|post"
|
30
|
+
path: infos[1][0..-11].split('/').map do |item|
|
31
|
+
item[':'] ? "{#{item[1..-1]}}" : item
|
32
|
+
end.join('/'), # => "/api/v1/examples/{id}"
|
33
|
+
action_path: infos[2] # => "api/v1/examples#index"
|
34
|
+
} rescue next
|
35
|
+
end.compact.group_by { |api| api[:action_path].split('#').first } # => { "api/v1/examples" => [..] }, group by paths
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_actions_by_route_base(route_base)
|
39
|
+
routes_list[route_base]&.map { |action_info| action_info[:action_path].split('#').last }
|
40
|
+
end
|
41
|
+
|
42
|
+
def find_path_httpverb_by(route_base, action)
|
43
|
+
routes_list[route_base]&.map do |action_info|
|
44
|
+
if action_info[:action_path].split('#').last == action.to_s
|
45
|
+
return [ action_info[:path], action_info[:http_verb].split('|').first ]
|
46
|
+
end
|
47
|
+
end ; nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OpenApi
|
4
|
+
module Tip
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def no_config; puts ' OpenApi'.red + ' No documents have been configured!' end
|
8
|
+
def loaded; puts ' OpenApi'.green + ' loaded' if ENV['RAILS_ENV'] end
|
9
|
+
|
10
|
+
def generated(name)
|
11
|
+
puts ' OpenApi'.green + " `#{name}.json` has been generated."
|
12
|
+
end
|
13
|
+
|
14
|
+
def schema_no_type(component_key)
|
15
|
+
puts ' OpenApi'.red + " Syntax Error: component schema `#{component_key}` has no type!"
|
16
|
+
end
|
17
|
+
|
18
|
+
def param_no_type(name)
|
19
|
+
puts ' OpenApi'.red + " Syntax Error: param `#{name}` has no schema type!"
|
20
|
+
end
|
21
|
+
|
22
|
+
def no_route(action_path)
|
23
|
+
puts ' OpenApi'.red + " Route mapping failed: #{action_path}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/open_api/version.rb
CHANGED
data/zero-rails_openapi.gemspec
CHANGED
@@ -23,15 +23,15 @@ Gem::Specification.new do |spec|
|
|
23
23
|
|
24
24
|
spec.required_ruby_version = '>= 2.3.0'
|
25
25
|
|
26
|
-
spec.add_development_dependency 'bundler'
|
27
|
-
spec.add_development_dependency 'rake'
|
28
|
-
spec.add_development_dependency 'rspec'
|
26
|
+
spec.add_development_dependency 'bundler'
|
27
|
+
spec.add_development_dependency 'rake'
|
28
|
+
spec.add_development_dependency 'rspec'
|
29
29
|
spec.add_development_dependency 'simplecov'
|
30
30
|
spec.add_development_dependency 'pry'
|
31
31
|
|
32
|
-
spec.
|
33
|
-
spec.
|
34
|
-
spec.
|
32
|
+
spec.add_dependency 'colorize'
|
33
|
+
spec.add_dependency 'activesupport', '>= 4.1'
|
34
|
+
spec.add_dependency 'rails', '>= 4.1'
|
35
35
|
|
36
36
|
# spec.post_install_message = ""
|
37
37
|
end
|
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zero-rails_openapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zhandao
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: simplecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,13 +143,9 @@ files:
|
|
143
143
|
- Rakefile
|
144
144
|
- bin/console
|
145
145
|
- bin/setup
|
146
|
-
-
|
147
|
-
-
|
148
|
-
-
|
149
|
-
- documentation/examples/goods_doc.rb
|
150
|
-
- documentation/examples/open_api.rb
|
151
|
-
- documentation/examples/output_example.json
|
152
|
-
- documentation/parameter.md
|
146
|
+
- examples/auto_gen_doc.rb
|
147
|
+
- examples/open_api.rb
|
148
|
+
- examples/output_example.json
|
153
149
|
- lib/oas_objs/callback_obj.rb
|
154
150
|
- lib/oas_objs/combined_schema.rb
|
155
151
|
- lib/oas_objs/example_obj.rb
|
@@ -166,10 +162,10 @@ files:
|
|
166
162
|
- lib/open_api/config_dsl.rb
|
167
163
|
- lib/open_api/dsl.rb
|
168
164
|
- lib/open_api/dsl/api.rb
|
169
|
-
- lib/open_api/dsl/common_dsl.rb
|
170
165
|
- lib/open_api/dsl/components.rb
|
171
166
|
- lib/open_api/dsl/helpers.rb
|
172
|
-
- lib/open_api/
|
167
|
+
- lib/open_api/router.rb
|
168
|
+
- lib/open_api/support/tip.rb
|
173
169
|
- lib/open_api/version.rb
|
174
170
|
- zero-rails_openapi.gemspec
|
175
171
|
homepage: https://github.com/zhandao/zero-rails_openapi
|
@@ -1,29 +0,0 @@
|
|
1
|
-
class V1::GoodsDoc < BaseDoc
|
2
|
-
api :index, 'GET list of goods.' do
|
3
|
-
desc 'listing goods',
|
4
|
-
view!: 'search view, allows:<br/>',
|
5
|
-
# '1/ all goods (default):all<br/>' \
|
6
|
-
# '2/ only online:online<br/>' \
|
7
|
-
# '3/ only offline:offline<br/>' \
|
8
|
-
# '4/ expensive goods:expensive<br/>' \
|
9
|
-
# '5/ cheap goods:cheap<br/>',
|
10
|
-
search_type!: 'search field, allows:<br/>'
|
11
|
-
# '1/ name<br/>2/ creator,<br/>3/ category<br/>4/ price<br/>'
|
12
|
-
|
13
|
-
# Instead of:
|
14
|
-
# query :view, String, enum: %w[ all online offline expensive cheap ]
|
15
|
-
query :view, String, enum!: {
|
16
|
-
'all goods (default)': :all,
|
17
|
-
'only online': :online,
|
18
|
-
'only offline': :offline,
|
19
|
-
'expensive goods': :expensive,
|
20
|
-
'cheap goods': :cheap
|
21
|
-
}
|
22
|
-
query :search_type, String, enum: %w[ name creator category price ]
|
23
|
-
# Same as:
|
24
|
-
# query :search_type, String, desc!: 'search field, allows:<br/>',
|
25
|
-
# enum: %w[ name creator category price ]
|
26
|
-
|
27
|
-
# TODO: Support `desc: '', auto_desc: true or %i[ enum must_be ]`
|
28
|
-
end
|
29
|
-
end
|
@@ -1,60 +0,0 @@
|
|
1
|
-
class Api::V1::ExamplesController < Api::V1::BaseController
|
2
|
-
doc_tag name: 'ExampleTagName', desc: 'ExamplesController\'s APIs'
|
3
|
-
|
4
|
-
components do
|
5
|
-
schema :DogSchema => [ String, dft: 'doge' ]
|
6
|
-
schema :PetSchema => [ not: [ Integer, Boolean ] ]
|
7
|
-
query! :UidQuery => [ :uid, String, desc: 'user uid' ]
|
8
|
-
path! :IdPath => [ :id, Integer, desc: 'product id' ]
|
9
|
-
resp :BadRqResp => [ 'bad request', :json ]
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
api_dry %i[ index show ], 'common parts of :index and :show' do
|
14
|
-
header! :Token, String
|
15
|
-
response 1000, 'data export', :pdf, type: File
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
api :index, 'GET examples', use: :Token do
|
20
|
-
this_api_is_invalid! 'do not use!'
|
21
|
-
desc '**GET** list of examples,<br/>and get the status 200.',
|
22
|
-
id: 'user id',
|
23
|
-
email: 'email addr\'s desc'
|
24
|
-
email = 'a@b.c'
|
25
|
-
|
26
|
-
query! :count, Integer, enum: 0..5, length: [1, 2], pattern: /^[0-9]$/, range: { gt: 0, le: 5 }
|
27
|
-
query! :done, Boolean, must_be: false, default: true, desc: 'must be false'
|
28
|
-
query :email, String, lth: :ge_3, default: email # is_a: :email
|
29
|
-
file :pdf, 'upload a file: the media type should be application/pdf'
|
30
|
-
|
31
|
-
query :test_type, type: String
|
32
|
-
query :combination, one_of: [ :DogSchema, String, { type: Integer, desc: 'integer input'}]
|
33
|
-
form data: {
|
34
|
-
:combination => { any_of: [ Integer, String ] }
|
35
|
-
}
|
36
|
-
|
37
|
-
response :success, 'success response', :json#, data: :Pet
|
38
|
-
security :Token
|
39
|
-
|
40
|
-
resp 200, '', :json, data: {
|
41
|
-
a: String
|
42
|
-
}
|
43
|
-
end
|
44
|
-
|
45
|
-
|
46
|
-
api :show, skip: :Token do
|
47
|
-
param_ref :IdPath, :UidQuery
|
48
|
-
response_ref 400 => :BadRqResp
|
49
|
-
end
|
50
|
-
|
51
|
-
|
52
|
-
api :create do
|
53
|
-
form! data: {
|
54
|
-
:name! => String, # <= schema_type is `String`
|
55
|
-
:password! => { type: String, pattern: /[0-9]{6,10}/, desc: 'password' },
|
56
|
-
# optional
|
57
|
-
:remarks => { type: String, desc: 'remarks' }, # <= schema_type is `String`, and schema_info is { desc: '..' }
|
58
|
-
}
|
59
|
-
end
|
60
|
-
end
|