From 3bd06fd2c053de379dca292e89e4f971285f51e8 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 18 Jun 2025 19:52:52 +0530 Subject: [PATCH] refactor: separate presenter --- app/presenters/notion_page_presenter.rb | 60 ++++++++++++++++++++ lib/integrations/notion/processor_service.rb | 36 ++---------- 2 files changed, 64 insertions(+), 32 deletions(-) create mode 100644 app/presenters/notion_page_presenter.rb diff --git a/app/presenters/notion_page_presenter.rb b/app/presenters/notion_page_presenter.rb new file mode 100644 index 000000000..27a7ecdc3 --- /dev/null +++ b/app/presenters/notion_page_presenter.rb @@ -0,0 +1,60 @@ +class NotionPagePresenter + def initialize(page_response, blocks_response) + @page_response = page_response + @blocks_response = blocks_response + end + + def to_hash + { + 'id' => @page_response['id'], + 'icon' => @page_response['icon'], + 'title' => extract_page_title, + 'created_time' => @page_response['created_time'], + 'last_edited_time' => @page_response['last_edited_time'], + 'md' => generate_markdown, + 'child_pages' => extract_child_pages + } + end + + private + + def extract_page_title + # Try to get title from properties (for database pages) + if @page_response['properties'] + title_property = @page_response['properties'].values.find { |prop| prop['type'] == 'title' } + return title_property['title'].map { |t| t['plain_text'] }.join if title_property && title_property['title']&.any? + end + + nil + end + + def generate_markdown + title = extract_page_title + content_md = NotionToMarkdown.new.convert(@blocks_response['results']) + title_md = title ? "# #{title}\n\n" : '' + + "#{title_md}#{content_md}" + end + + def extract_child_pages + extract_child_pages_from_blocks(@blocks_response['results']) + end + + def extract_child_pages_from_blocks(blocks) + child_pages = [] + + blocks.each do |block| + if block['type'] == 'child_page' + child_pages << { + 'id' => block['id'], + 'title' => block['child_page']['title'] + } + end + + # Recursively check nested blocks + child_pages.concat(extract_child_pages_from_blocks(block['children'])) if block['has_children'] && block['children'] + end + + child_pages + end +end \ No newline at end of file diff --git a/lib/integrations/notion/processor_service.rb b/lib/integrations/notion/processor_service.rb index 80aa46046..abe12eb81 100644 --- a/lib/integrations/notion/processor_service.rb +++ b/lib/integrations/notion/processor_service.rb @@ -17,25 +17,15 @@ class Integrations::Notion::ProcessorService def full_page(page_id) # Get page metadata - page_data = page(page_id) - return page_data if page_data[:error] + page_response = notion_client.page(page_id) + return { error: page_response[:error] } if page_response[:error] # Get page content blocks blocks_response = notion_client.page_blocks(page_id) return { error: blocks_response[:error] } if blocks_response[:error] - # Convert blocks to markdown - content_md = NotionToMarkdown.new.convert(blocks_response['results']) - title_md = page_data['title'] ? "# #{page_data['title']}\n\n" : '' - - # Get child pages - child_pages = extract_child_page_ids(blocks_response['results']) - - # Add markdown and child pages to page data - page_data.merge( - 'md' => "#{title_md}#{content_md}", - 'child_pages' => child_pages - ) + # Use presenter to format the complete page data + NotionPagePresenter.new(page_response, blocks_response).to_hash end private @@ -68,24 +58,6 @@ class Integrations::Notion::ProcessorService nil end - def extract_child_page_ids(blocks) - child_pages = [] - - blocks.each do |block| - if block['type'] == 'child_page' - child_pages << { - 'id' => block['id'], - 'title' => block['child_page']['title'] - } - end - - # Recursively check nested blocks - child_pages.concat(extract_child_page_ids(block['children'])) if block['has_children'] && block['children'] - end - - child_pages - end - def notion_hook @notion_hook ||= account.hooks.find_by!(app_id: 'notion') end