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