lib/meta/route_dsl/application_builder.rb in meta-api-0.0.6 vs lib/meta/route_dsl/application_builder.rb in meta-api-0.0.7
- old
+ new
@@ -1,42 +1,39 @@
# frozen_string_literal: true
require_relative 'route_builder'
require_relative 'meta_builder'
+require_relative '../utils/route_dsl_builders'
module Meta
module RouteDSL
class ApplicationBuilder
include MetaBuilder::Delegator
- def initialize(prefix = nil, &block)
- @mod_prefix = prefix
+ def initialize(full_prefix = '/', &block)
+ @full_prefix = full_prefix
@callbacks = []
@error_guards = []
- @meta_builder = MetaBuilder.new
+ @meta_builder = MetaBuilder.new(route_full_path: full_prefix)
@mod_builders = []
@shared_mods = []
instance_exec &block if block_given?
end
- def build(parent_path: '', meta: {}, callbacks: [])
- # 合并 meta 时不仅仅是覆盖,比如 parameters 参数需要合并
- meta2 = (meta || {}).merge(@meta_builder.build)
- if meta[:parameters] && meta2[:parameters]
- meta2[:parameters] = meta[:parameters].merge(meta2[:parameters])
- end
+ # meta 和 callbacks 是父级传递过来的,需要合并到当前模块或子模块中。
+ #
+ # 为什么一定要动态传递 meta_options 参数?由于 OpenAPI 文档是面向路由的,parameters、request_body、
+ # responses 都存在于路由文档中,对应地 Metadata 对象最终只存在于路由文档中。因此,在构建过程中,需要将父
+ # 级传递过来的 Metadata 对象合并到当前模块,再层层合并到子模块。
+ def build(meta_options: {}, callbacks: [])
+ meta_options = Utils::RouteDSLBuilders.merge_meta_options(meta_options, @meta_builder.build)
+ callbacks = Utils::RouteDSLBuilders.merge_callbacks(callbacks, @callbacks)
+ mods = @mod_builders.map { |builder| builder.build(meta_options: meta_options, callbacks: callbacks) }
- # 构建子模块
- # 合并父级传递过来的 callbacks,将 before 和 around 放在前面,after 放在后面
- parent_before = callbacks.filter { |cb| cb[:lifecycle] == :before || cb[:lifecycle] == :around }
- parent_after = callbacks.filter { |cb| cb[:lifecycle] == :after }
- callbacks = parent_before + @callbacks + parent_after
- mods = @mod_builders.map { |builder| builder.build(parent_path: Utils::Path.join(parent_path, @mod_prefix), meta: meta2, callbacks: callbacks) }
-
Application.new(
- prefix: @mod_prefix,
+ prefix: @full_prefix,
mods: mods,
shared_mods: @shared_mods,
error_guards: @error_guards
)
end
@@ -46,11 +43,11 @@
@shared_mods << Module.new(&block) if block_given?
end
# 定义路由块
def route(path, method = nil, &block)
- route_builder = RouteDSL::RouteBuilder.new(path, method, &block)
+ route_builder = RouteBuilder.new(path, method, parent_path: @full_prefix, &block)
@mod_builders << route_builder
route_builder
end
# 定义子模块
@@ -106,16 +103,12 @@
def initialize(builder, meta)
@builder = builder
@meta = meta
end
- def build(parent_path: '', meta: {}, **kwargs)
- # 合并 meta 时不仅仅是覆盖,比如 parameters 参数需要合并
- meta2 = (meta || {}).merge(@meta)
- if meta[:parameters] && meta2[:parameters]
- meta2[:parameters] = meta[:parameters].merge(meta2[:parameters])
- end
- @builder.build(parent_path: parent_path, meta: meta2, **kwargs)
+ def build(meta_options: {}, **kwargs)
+ meta_options = Utils::RouteDSLBuilders.merge_meta_options(meta_options, @meta)
+ @builder.build(meta_options: meta_options, **kwargs)
end
end
end
end
end