chore: Add articles metadata (#5125)
This commit is contained in:
@@ -2,10 +2,11 @@ class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController
|
|||||||
before_action :portal
|
before_action :portal
|
||||||
before_action :check_authorization
|
before_action :check_authorization
|
||||||
before_action :fetch_article, except: [:index, :create]
|
before_action :fetch_article, except: [:index, :create]
|
||||||
|
before_action :set_current_page, only: [:index]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@articles = @portal.articles
|
@articles = @portal.articles
|
||||||
@articles = @articles.search(list_params) if params[:payload].present?
|
@articles = @articles.search(list_params) if list_params.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@@ -45,8 +46,10 @@ class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def list_params
|
def list_params
|
||||||
params.require(:payload).permit(
|
params.permit(:locale, :query, :page, :category_slug)
|
||||||
:category_slug, :locale, :query, :page
|
end
|
||||||
)
|
|
||||||
|
def set_current_page
|
||||||
|
@current_page = params[:page] || 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ class Api::V1::Accounts::CategoriesController < Api::V1::Accounts::BaseControlle
|
|||||||
before_action :portal
|
before_action :portal
|
||||||
before_action :check_authorization
|
before_action :check_authorization
|
||||||
before_action :fetch_category, except: [:index, :create]
|
before_action :fetch_category, except: [:index, :create]
|
||||||
|
before_action :set_current_page, only: [:index]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@categories = @portal.categories.search(params)
|
@categories = @portal.categories.search(params)
|
||||||
@@ -49,4 +50,8 @@ class Api::V1::Accounts::CategoriesController < Api::V1::Accounts::BaseControlle
|
|||||||
:name, :description, :position, :slug, :locale, :parent_category_id, :associated_category_id
|
:name, :description, :position, :slug, :locale, :parent_category_id, :associated_category_id
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_current_page
|
||||||
|
@current_page = params[:page] || 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ class Api::V1::Accounts::PortalsController < Api::V1::Accounts::BaseController
|
|||||||
|
|
||||||
before_action :fetch_portal, except: [:index, :create]
|
before_action :fetch_portal, except: [:index, :create]
|
||||||
before_action :check_authorization
|
before_action :check_authorization
|
||||||
|
before_action :set_current_page, only: [:index]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@portals = Current.account.portals
|
@portals = Current.account.portals
|
||||||
@@ -66,4 +67,8 @@ class Api::V1::Accounts::PortalsController < Api::V1::Accounts::BaseController
|
|||||||
def portal_member_params
|
def portal_member_params
|
||||||
params.require(:portal).permit(:account_id, member_ids: [])
|
params.require(:portal).permit(:account_id, member_ids: [])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_current_page
|
||||||
|
@current_page = params[:page] || 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ class Public::Api::V1::Portals::ArticlesController < ApplicationController
|
|||||||
|
|
||||||
def index
|
def index
|
||||||
@articles = @portal.articles
|
@articles = @portal.articles
|
||||||
@articles = @articles.search(list_params) if params[:payload].present?
|
@articles = @articles.search(list_params) if list_params.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
def show; end
|
def show; end
|
||||||
@@ -20,6 +20,6 @@ class Public::Api::V1::Portals::ArticlesController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def list_params
|
def list_params
|
||||||
params.require(:payload).permit(:query)
|
params.permit(:query)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class Portal < ApplicationRecord
|
|||||||
|
|
||||||
scope :active, -> { where(archived: false) }
|
scope :active, -> { where(archived: false) }
|
||||||
|
|
||||||
CONFIG_JSON_KEYS = %w[allowed_locales].freeze
|
CONFIG_JSON_KEYS = %w[allowed_locales default_locale].freeze
|
||||||
|
|
||||||
def file_base_data
|
def file_base_data
|
||||||
{
|
{
|
||||||
@@ -60,9 +60,14 @@ class Portal < ApplicationRecord
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def default_locale
|
||||||
|
config['default_locale'] || 'en'
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def config_json_format
|
def config_json_format
|
||||||
|
config['default_locale'] = 'en'
|
||||||
denied_keys = config.keys - CONFIG_JSON_KEYS
|
denied_keys = config.keys - CONFIG_JSON_KEYS
|
||||||
errors.add(:cofig, "in portal on #{denied_keys.join(',')} is not supported.") if denied_keys.any?
|
errors.add(:cofig, "in portal on #{denied_keys.join(',')} is not supported.") if denied_keys.any?
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
json.payload do
|
json.payload do
|
||||||
json.array! @articles, partial: 'article', as: :article
|
json.array! @articles, partial: 'article', as: :article
|
||||||
end
|
end
|
||||||
|
|
||||||
|
json.meta do
|
||||||
|
json.current_page @current_page
|
||||||
|
json.articles_count @articles.size
|
||||||
|
end
|
||||||
|
|||||||
@@ -26,4 +26,6 @@ if category.root_category.present?
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
json.articles_count category.articles.published.try(:count)
|
json.meta do
|
||||||
|
json.articles_count category.articles.size
|
||||||
|
end
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
json.payload do
|
json.payload do
|
||||||
json.array! @categories, partial: 'category', as: :category
|
json.array! @categories, partial: 'category', as: :category
|
||||||
end
|
end
|
||||||
|
|
||||||
|
json.meta do
|
||||||
|
json.current_page @current_page
|
||||||
|
json.categories_count @categories.size
|
||||||
|
end
|
||||||
|
|||||||
@@ -17,3 +17,9 @@ json.portal_members do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
json.meta do
|
||||||
|
json.articles_count portal.articles.size
|
||||||
|
json.categories_count portal.categories.size
|
||||||
|
json.default_locale portal.default_locale
|
||||||
|
end
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
json.payload do
|
json.payload do
|
||||||
json.array! @portals, partial: 'portal', as: :portal
|
json.array! @portals, partial: 'portal', as: :portal
|
||||||
end
|
end
|
||||||
|
|
||||||
|
json.meta do
|
||||||
|
json.current_page @current_page
|
||||||
|
json.portals_count @portals.size
|
||||||
|
end
|
||||||
|
|||||||
@@ -24,4 +24,6 @@ if category.root_category.present?
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
json.articles_count category.articles.published.try(:count)
|
json.meta do
|
||||||
|
json.articles_count category.articles.published.size
|
||||||
|
end
|
||||||
|
|||||||
@@ -8,7 +8,13 @@ json.slug portal.slug
|
|||||||
json.categories do
|
json.categories do
|
||||||
if portal.categories.any?
|
if portal.categories.any?
|
||||||
json.array! portal.categories.each do |category|
|
json.array! portal.categories.each do |category|
|
||||||
json.partial! 'categories/category.json.jbuilder', category: category
|
json.partial! 'api/v1/models/category.json.jbuilder', category: category
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
json.meta do
|
||||||
|
json.articles_count portal.articles.published.size
|
||||||
|
json.categories_count portal.categories.size
|
||||||
|
json.default_locale portal.default_locale
|
||||||
|
end
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
json.payload do
|
json.payload do
|
||||||
json.array! @articles, partial: 'public/api/v1/models/article.json.jbuilder', as: :article
|
json.array! @articles, partial: 'public/api/v1/models/article.json.jbuilder', as: :article
|
||||||
end
|
end
|
||||||
|
|
||||||
|
json.meta do
|
||||||
|
json.articles_count @articles.published.size
|
||||||
|
end
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
|||||||
|
|
||||||
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles",
|
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles",
|
||||||
headers: agent.create_new_auth_token,
|
headers: agent.create_new_auth_token,
|
||||||
params: { payload: {} }
|
params: {}
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
expect(json_response['payload'].count).to be 2
|
expect(json_response['payload'].count).to be 2
|
||||||
@@ -169,7 +169,7 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
|||||||
|
|
||||||
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles",
|
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles",
|
||||||
headers: agent.create_new_auth_token,
|
headers: agent.create_new_auth_token,
|
||||||
params: { payload: { category_slug: category.slug } }
|
params: { category_slug: category.slug }
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
expect(json_response['payload'].count).to be 2
|
expect(json_response['payload'].count).to be 2
|
||||||
@@ -186,10 +186,11 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
|||||||
|
|
||||||
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles",
|
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles",
|
||||||
headers: agent.create_new_auth_token,
|
headers: agent.create_new_auth_token,
|
||||||
params: { payload: { query: 'funny' } }
|
params: { query: 'funny' }
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
expect(json_response['payload'].count).to be 1
|
expect(json_response['payload'].count).to be 1
|
||||||
|
expect(json_response['meta']['articles_count']).to be json_response['payload'].size
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ RSpec.describe 'Api::V1::Accounts::Portals', type: :request do
|
|||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
expect(json_response['name']).to eql(portal_params[:portal][:name])
|
expect(json_response['name']).to eql(portal_params[:portal][:name])
|
||||||
expect(json_response['config']).to eql({ 'allowed_locales' => %w[en es] })
|
expect(json_response['config']).to eql({ 'allowed_locales' => %w[en es], 'default_locale' => 'en' })
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'archive portal' do
|
it 'archive portal' do
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ RSpec.describe 'Public Articles API', type: :request do
|
|||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
|
|
||||||
expect(json_response['payload'].length).to eql portal.articles.count
|
expect(json_response['payload'].length).to eql portal.articles.count
|
||||||
|
expect(json_response['meta']['articles_count']).to be json_response['payload'].size
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'get all articles with searched text query' do
|
it 'get all articles with searched text query' do
|
||||||
@@ -36,10 +37,11 @@ RSpec.describe 'Public Articles API', type: :request do
|
|||||||
|
|
||||||
get "/public/api/v1/portals/#{portal.slug}/articles",
|
get "/public/api/v1/portals/#{portal.slug}/articles",
|
||||||
headers: agent.create_new_auth_token,
|
headers: agent.create_new_auth_token,
|
||||||
params: { payload: { query: 'funny' } }
|
params: { query: 'funny' }
|
||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
expect(json_response['payload'].count).to be 1
|
expect(json_response['payload'].count).to be 1
|
||||||
|
expect(json_response['meta']['articles_count']).to be json_response['payload'].size
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ RSpec.describe 'Public Categories API', type: :request do
|
|||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
|
|
||||||
expect(json_response['slug']).to eql category_slug
|
expect(json_response['slug']).to eql category_slug
|
||||||
|
expect(json_response['meta']['articles_count']).to be 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ RSpec.describe 'Public Portals API', type: :request do
|
|||||||
expect(response).to have_http_status(:success)
|
expect(response).to have_http_status(:success)
|
||||||
json_response = JSON.parse(response.body)
|
json_response = JSON.parse(response.body)
|
||||||
expect(json_response['slug']).to eql 'test-portal'
|
expect(json_response['slug']).to eql 'test-portal'
|
||||||
|
expect(json_response['meta']['articles_count']).to be 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ RSpec.describe Portal, type: :model do
|
|||||||
it 'Adds default allowed_locales en' do
|
it 'Adds default allowed_locales en' do
|
||||||
expect(portal.config).to be_present
|
expect(portal.config).to be_present
|
||||||
expect(portal.config['allowed_locales']).to eq(['en'])
|
expect(portal.config['allowed_locales']).to eq(['en'])
|
||||||
|
expect(portal.config['default_locale']).to eq('en')
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'Does not allow any other config than allowed_locales' do
|
it 'Does not allow any other config than allowed_locales' do
|
||||||
|
|||||||
Reference in New Issue
Block a user