chore: Limit the number of articles retrieved by widget (#11095)
The UI displays only six articles, and this update introduces a per_page parameter to control the number of articles returned per API call. The value is capped between 1 and 100, with a default fallback if a lower number is set. This change is necessary due to high website traffic, where excessive payloads are returned without adding value. **Changes:** - Add index to status, account_id, portal_id, views. - Add per_page param in the API. - Update the code in the frontend to fetch only 6
This commit is contained in:
@@ -6,17 +6,25 @@ class Public::Api::V1::Portals::ArticlesController < Public::Api::V1::Portals::B
|
||||
layout 'portal'
|
||||
|
||||
def index
|
||||
@articles = @portal.articles.published
|
||||
@articles = @portal.articles.published.includes(:category, :author)
|
||||
@articles_count = @articles.count
|
||||
search_articles
|
||||
order_by_sort_param
|
||||
@articles = @articles.page(list_params[:page]) if list_params[:page].present?
|
||||
limit_results
|
||||
end
|
||||
|
||||
def show; end
|
||||
|
||||
private
|
||||
|
||||
def limit_results
|
||||
return if list_params[:per_page].blank?
|
||||
|
||||
per_page = [list_params[:per_page].to_i, 100].min
|
||||
per_page = 25 if per_page < 1
|
||||
@articles = @articles.page(list_params[:page]).per(per_page)
|
||||
end
|
||||
|
||||
def search_articles
|
||||
@articles = @articles.search(list_params) if list_params.present?
|
||||
end
|
||||
@@ -45,7 +53,7 @@ class Public::Api::V1::Portals::ArticlesController < Public::Api::V1::Portals::B
|
||||
end
|
||||
|
||||
def list_params
|
||||
params.permit(:query, :locale, :sort, :status, :page)
|
||||
params.permit(:query, :locale, :sort, :status, :page, :per_page)
|
||||
end
|
||||
|
||||
def permitted_params
|
||||
|
||||
@@ -103,6 +103,7 @@ const getMostReadArticles = (slug, locale) => ({
|
||||
page: 1,
|
||||
sort: 'views',
|
||||
status: 1,
|
||||
per_page: 6,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -23,9 +23,13 @@
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_articles_on_account_id (account_id)
|
||||
# index_articles_on_associated_article_id (associated_article_id)
|
||||
# index_articles_on_author_id (author_id)
|
||||
# index_articles_on_portal_id (portal_id)
|
||||
# index_articles_on_slug (slug) UNIQUE
|
||||
# index_articles_on_status (status)
|
||||
# index_articles_on_views (views)
|
||||
#
|
||||
class Article < ApplicationRecord
|
||||
include PgSearch::Model
|
||||
|
||||
@@ -4,5 +4,5 @@ json.payload do
|
||||
end
|
||||
|
||||
json.meta do
|
||||
json.articles_count @articles.published.size
|
||||
json.articles_count @articles_count
|
||||
end
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
|
||||
|
||||
<body>
|
||||
</body>
|
||||
|
||||
<%
|
||||
user_id = 1
|
||||
|
||||
Reference in New Issue
Block a user