diff --git a/lib/community_landing/data_fetcher.rb b/lib/community_landing/data_fetcher.rb index 0a82a1f..580e7c8 100644 --- a/lib/community_landing/data_fetcher.rb +++ b/lib/community_landing/data_fetcher.rb @@ -7,42 +7,57 @@ module CommunityLanding data = {} # Top contributors - data[:contributors] = if s.contributors_enabled - User - .joins(:posts) - .where(posts: { created_at: s.contributors_days.days.ago.. }) - .where.not(username: %w[system discobot]) - .where(active: true, staged: false) - .group("users.id") - .order("COUNT(posts.id) DESC") - .limit(s.contributors_count) - .select("users.*, COUNT(posts.id) AS post_count") + data[:contributors] = begin + if s.contributors_enabled + User + .joins(:posts) + .where(posts: { created_at: s.contributors_days.days.ago.. }) + .where.not(username: %w[system discobot]) + .where(active: true, staged: false) + .group("users.id") + .order("COUNT(posts.id) DESC") + .limit(s.contributors_count) + .select("users.*, COUNT(posts.id) AS post_count") + end + rescue => e + Rails.logger.warn("[CommunityLanding] contributors fetch failed: #{e.message}") + nil end # Public groups — optionally filtered by selected names - data[:groups] = if s.groups_enabled - selected = s.groups_selected.presence - scope = Group - .where(visibility_level: Group.visibility_levels[:public]) - .where(automatic: false) + data[:groups] = begin + if s.groups_enabled + selected = s.groups_selected.presence + scope = Group + .where(visibility_level: Group.visibility_levels[:public]) + .where(automatic: false) - if selected - names = selected.split("|").map(&:strip).reject(&:empty?) - scope = scope.where(name: names) if names.any? + if selected + names = selected.split("|").map(&:strip).reject(&:empty?) + scope = scope.where(name: names) if names.any? + end + + scope.limit(s.groups_count) end - - scope.limit(s.groups_count) + rescue => e + Rails.logger.warn("[CommunityLanding] groups fetch failed: #{e.message}") + nil end # Trending topics - data[:topics] = if s.topics_enabled - Topic - .listable_topics - .where(visible: true) - .where("topics.created_at > ?", 30.days.ago) - .order(posts_count: :desc) - .limit(s.topics_count) - .includes(:category, :user) + data[:topics] = begin + if s.topics_enabled + Topic + .listable_topics + .where(visible: true) + .where("topics.created_at > ?", 30.days.ago) + .order(posts_count: :desc) + .limit(s.topics_count) + .includes(:category, :user) + end + rescue => e + Rails.logger.warn("[CommunityLanding] topics fetch failed: #{e.message}") + nil end # Aggregate stats @@ -53,13 +68,18 @@ module CommunityLanding chat_count = 0 end - data[:stats] = { - members: User.real.count, - topics: Topic.listable_topics.count, - posts: Post.where(user_deleted: false).count, - likes: Post.sum(:like_count), - chats: chat_count, - } + data[:stats] = begin + { + members: User.real.count, + topics: Topic.listable_topics.count, + posts: Post.where(user_deleted: false).count, + likes: Post.sum(:like_count), + chats: chat_count, + } + rescue => e + Rails.logger.warn("[CommunityLanding] stats fetch failed: #{e.message}") + { members: 0, topics: 0, posts: 0, likes: 0, chats: 0 } + end data end diff --git a/lib/community_landing/page_builder.rb b/lib/community_landing/page_builder.rb index 24c61ec..ab739c6 100644 --- a/lib/community_landing/page_builder.rb +++ b/lib/community_landing/page_builder.rb @@ -128,7 +128,7 @@ module CommunityLanding def render_hero hero_card = @s.hero_card_enabled rescue true hero_img_first = @s.hero_image_first rescue false - hero_bg_img = @s.hero_background_image_url.presence + hero_bg_img = (@s.hero_background_image_url.presence rescue nil) hero_border = @s.hero_border_style rescue "none" hero_min_h = @s.hero_min_height rescue 0 site_name = @s.title @@ -197,7 +197,7 @@ module CommunityLanding html << "
\n" html << "

#{e(creators_title)}

\n" if show_title top3.each_with_index do |user, idx| - avatar_url = user.avatar_template.gsub("{size}", "120") + avatar_url = user.avatar_template.to_s.gsub("{size}", "120") activity_count = user.attributes["post_count"].to_i rescue 0 rank_color = rank_colors[idx] count_prefix = show_count_label && count_label.present? ? "#{e(count_label)} " : "" @@ -217,8 +217,8 @@ module CommunityLanding html << "
\n" - hero_image_urls_raw = @s.hero_image_urls.presence - hero_video = @s.hero_video_url.presence rescue nil + hero_image_urls_raw = (@s.hero_image_urls.presence rescue nil) + hero_video = (@s.hero_video_url.presence rescue nil) blur_attr = (@s.hero_video_blur_on_hover rescue true) ? " data-blur-hover=\"true\"" : "" has_images = false diff --git a/lib/community_landing/style_builder.rb b/lib/community_landing/style_builder.rb index db77879..fcff351 100644 --- a/lib/community_landing/style_builder.rb +++ b/lib/community_landing/style_builder.rb @@ -10,15 +10,15 @@ module CommunityLanding # CSS custom properties for accent colors, gradients, backgrounds def color_overrides - accent = hex(@s.accent_color) || "#d4a24e" - accent_hover = hex(@s.accent_hover_color) || "#c4922e" - dark_bg = hex(@s.dark_bg_color) || "#06060f" - light_bg = hex(@s.light_bg_color) || "#faf6f0" - stat_icon = hex(@s.stat_icon_color) || accent - about_bg_img = @s.about_background_image_url.presence - app_g1 = hex(@s.app_cta_gradient_start) || accent - app_g2 = hex(@s.app_cta_gradient_mid) || accent_hover - app_g3 = hex(@s.app_cta_gradient_end) || accent_hover + accent = (hex(@s.accent_color) rescue nil) || "#d4a24e" + accent_hover = (hex(@s.accent_hover_color) rescue nil) || "#c4922e" + dark_bg = (hex(@s.dark_bg_color) rescue nil) || "#06060f" + light_bg = (hex(@s.light_bg_color) rescue nil) || "#faf6f0" + stat_icon = (hex(@s.stat_icon_color) rescue nil) || accent + about_bg_img = (@s.about_background_image_url.presence rescue nil) + app_g1 = (hex(@s.app_cta_gradient_start) rescue nil) || accent + app_g2 = (hex(@s.app_cta_gradient_mid) rescue nil) || accent_hover + app_g3 = (hex(@s.app_cta_gradient_end) rescue nil) || accent_hover stat_icon_bg = hex(@s.stat_icon_bg_color.presence) rescue nil stat_counter = hex(@s.stat_counter_color.presence) rescue nil video_btn_bg = hex(@s.hero_video_button_color.presence) rescue nil diff --git a/plugin.rb b/plugin.rb index 7d0c53c..08bb83f 100644 --- a/plugin.rb +++ b/plugin.rb @@ -53,6 +53,10 @@ after_initialize do response.headers["Content-Security-Policy"] = csp render html: html.html_safe, layout: false, content_type: "text/html" + rescue => e + Rails.logger.error("[CommunityLanding] 500 error: #{e.class}: #{e.message}\n#{e.backtrace&.first(10)&.join("\n")}") + render html: "".html_safe, + layout: false, content_type: "text/html", status: 500 end private