22
33require_relative '../../../account_manager'
44require_relative '../../../auth'
5- require_relative '../../../auto_source'
65require_relative '../../../exceptions'
76require_relative '../../../feed_response_format'
8- require_relative '../../../feed_generator'
7+ require_relative '../../../feeds/json_renderer'
8+ require_relative '../../../feeds/request_parser'
9+ require_relative '../../../feeds/resolver'
10+ require_relative '../../../feeds/rss_renderer'
11+ require_relative '../../../feeds/service'
912require_relative '../../../http_cache'
1013require_relative '../../../observability'
11- require_relative '../../../url_validator'
1214
1315module Html2rss
1416 module Web
@@ -28,97 +30,61 @@ class << self
2830 # @param token [String] signed public feed token.
2931 # @return [String] serialized feed response body.
3032 def call ( request , token )
31- format = FeedResponseFormat . for_request ( request )
32- normalized_token = FeedResponseFormat . strip_known_extension ( token )
33- feed_token , strategy = resolve_authorized_feed ( normalized_token )
34- rendered = render_generated_feed ( request , feed_token . url , strategy , format )
35- emit_render_success ( strategy , feed_token . url )
36- rendered
33+ feed_request , resolved_source , result = feed_pipeline ( request , token )
34+ configure_response ( request , feed_request . representation , result . ttl_seconds )
35+ emit_success_from ( resolved_source )
36+ render_result ( result , feed_request . representation )
3737 rescue StandardError => error
3838 emit_render_failure ( error )
3939 raise
4040 end
4141
4242 private
4343
44- # @return [void]
45- def ensure_auto_source_enabled!
46- raise ForbiddenError , Contract ::MESSAGES [ :auto_source_disabled ] unless AutoSource . enabled?
47- end
48-
44+ # @param request [Rack::Request]
4945 # @param token [String]
50- # @return [Html2rss::Web::FeedToken]
51- def validated_token_for ( token )
52- feed_token = Auth . validate_and_decode_feed_token ( token )
53- raise UnauthorizedError , 'Invalid token' unless feed_token
54-
55- feed_token
56- end
57-
58- # @param feed_token [Html2rss::Web::FeedToken]
59- # @return [Hash{Symbol=>Object}] account attributes.
60- def account_for ( feed_token )
61- account = AccountManager . get_account_by_username ( feed_token . username )
62- raise UnauthorizedError , 'Account not found' unless account
63-
64- account
65- end
66-
67- # @param account [Hash{Symbol=>Object}]
68- # @param url [String]
69- # @return [void]
70- def ensure_access! ( account , url )
71- raise ForbiddenError , 'Access Denied' unless UrlValidator . url_allowed? ( account , url )
72- end
73-
74- # @param feed_token [Html2rss::Web::FeedToken]
75- # @return [String] validated strategy identifier.
76- def resolve_token_strategy ( feed_token )
77- strategy = feed_token . strategy . to_s . strip
78- strategy = default_strategy if strategy . empty?
79-
80- raise BadRequestError , 'Unsupported strategy' unless supported_strategies . include? ( strategy )
81-
82- strategy
83- end
84-
85- # @return [Array<String>] supported strategy identifiers.
86- def supported_strategies
87- Html2rss ::RequestService . strategy_names . map ( &:to_s )
88- end
46+ # @return [Array<(Html2rss::Web::Feeds::Request, Html2rss::Web::Feeds::ResolvedSource, Html2rss::Web::Feeds::Result)>]
47+ def feed_pipeline ( request , token )
48+ feed_request = ::Html2rss ::Web ::Feeds ::RequestParser . call (
49+ request : request ,
50+ target_kind : :token ,
51+ identifier : token
52+ )
53+ resolved_source = ::Html2rss ::Web ::Feeds ::Resolver . call ( feed_request )
54+ result = ::Html2rss ::Web ::Feeds ::Service . call ( resolved_source )
55+ raise InternalServerError , result . message if result . status == :error
8956
90- # @return [String] default strategy identifier.
91- def default_strategy
92- Html2rss ::RequestService . default_strategy_name . to_s
57+ [ feed_request , resolved_source , result ]
9358 end
9459
95- # Builds HTTP response headers and returns XML body.
96- #
9760 # @param request [Rack::Request]
98- # @param url [String]
99- # @param strategy [String]
10061 # @param format [Symbol]
101- # @return [String] rendered feed body.
102- def render_generated_feed ( request , url , strategy , format )
103- rendered_feed = AutoSource . generate_feed_result ( url , strategy , format :)
104-
62+ # @param ttl_seconds [Integer]
63+ # @return [void]
64+ def configure_response ( request , format , ttl_seconds )
10565 request . response [ 'Content-Type' ] = FeedResponseFormat . content_type ( format )
106- HttpCache . expires ( request . response , rendered_feed . ttl_seconds , cache_control : 'public' )
66+ HttpCache . expires ( request . response , ttl_seconds , cache_control : 'public' )
10767 HttpCache . vary ( request . response , 'Accept' )
68+ end
10869
109- rendered_feed . body
70+ # @param resolved_source [Html2rss::Web::Feeds::ResolvedSource]
71+ # @return [void]
72+ def emit_success_from ( resolved_source )
73+ emit_render_success (
74+ resolved_source . generator_input [ :strategy ] ,
75+ resolved_source . generator_input . dig ( :channel , :url )
76+ )
11077 end
11178
112- # @param token [String ]
113- # @return [Array<(Html2rss::Web::FeedToken, String)> ]
114- def resolve_authorized_feed ( token )
115- feed_token = validated_token_for ( token )
116- account = account_for ( feed_token )
117- ensure_access! ( account , feed_token . url )
118- ensure_auto_source_enabled!
79+ # @param result [Html2rss::Web::Feeds::Result ]
80+ # @param format [Symbol ]
81+ # @return [String]
82+ def render_result ( result , format )
83+ if format == :: Html2rss :: Web :: Feeds :: ResponseFormat :: JSON_FEED
84+ return :: Html2rss :: Web :: Feeds :: JsonRenderer . call ( result )
85+ end
11986
120- strategy = resolve_token_strategy ( feed_token )
121- [ feed_token , strategy ]
87+ ::Html2rss ::Web ::Feeds ::RssRenderer . call ( result )
12288 end
12389
12490 # @param strategy [String]
0 commit comments