|
30 | 30 |
|
31 | 31 | module Wikis |
32 | 32 | class PageLinkMetadataService |
33 | | - # @param relation [ActiveRecord::Relation<Wikis::PageLink>] |
34 | | - # @return [ServiceResult<ActiveRecord::Relation<Wikis::PageLink>] |
35 | | - def self.call(relation) = new.call(relation) |
36 | | - |
37 | | - def initialize |
| 33 | + # @param page_links [ActiveRecord::Relation<Wikis::PageLink>] |
| 34 | + def initialize(page_links) |
38 | 35 | @result = ServiceResult.success(errors: ActiveModel::Errors.new(self)) |
| 36 | + @relation = page_links |
39 | 37 | end |
40 | 38 |
|
41 | | - def call(relation) |
| 39 | + # @return [ServiceResult<ActiveRecord::Relation<Wikis::PageLink>] |
| 40 | + def call |
42 | 41 | metadata = relation.group_by(&:provider).flat_map do |provider, page_links| |
43 | 42 | build_inputs(page_links).filter_map do |input_data| |
44 | 43 | provider.resolve("queries.page_info").call(input_data).value_or(nil) |
45 | 44 | end |
46 | 45 | end |
47 | 46 |
|
48 | | - @result.result = enrich_models(relation, metadata) |
| 47 | + @result.result = enrich_models(metadata) |
49 | 48 | @result |
50 | 49 | end |
51 | 50 |
|
52 | 51 | private |
53 | 52 |
|
| 53 | + attr_reader :relation |
| 54 | + |
54 | 55 | def build_inputs(page_links) |
55 | 56 | page_links.filter_map do |page_link| |
56 | 57 | Adapters::Input::PageInfo.build(identifier: page_link.identifier).value_or(nil) |
57 | 58 | end |
58 | 59 | end |
59 | 60 |
|
60 | | - def enrich_models(page_links, metadata) |
| 61 | + def enrich_models(metadata) |
61 | 62 | identifier_title_map = metadata.sort_by(&:identifier).to_h { [it.identifier, it.title] } |
62 | 63 | variable_placeholders = build_placeholders(identifier_title_map.size) |
63 | 64 |
|
64 | | - result_scope(page_links, metadata_join_sql(variable_placeholders, identifier_title_map)) |
| 65 | + result_scope(metadata_join_sql(variable_placeholders, identifier_title_map)) |
65 | 66 | end |
66 | 67 |
|
67 | | - def result_scope(page_links, join_expression) |
68 | | - page_links.joins(join_expression).select("wiki_page_links.*, metadata.title as title") |
| 68 | + def result_scope(join_expression) |
| 69 | + relation.joins(join_expression).select("wiki_page_links.*, metadata.title as title") |
69 | 70 | end |
70 | 71 |
|
71 | 72 | def metadata_join_sql(variable_placeholders, identifier_title_map) |
|
0 commit comments