fix: Add slug to articles (#5500)
This commit is contained in:
parent
8e5d8fcdaf
commit
c1c57fb2cd
7 changed files with 46 additions and 14 deletions
|
@ -42,8 +42,8 @@ class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController
|
|||
|
||||
def article_params
|
||||
params.require(:article).permit(
|
||||
:title, :content, :description, :position, :category_id, :author_id, :associated_article_id, :status, meta: [:title, :description,
|
||||
{ tags: [] }]
|
||||
:title, :slug, :content, :description, :position, :category_id, :author_id, :associated_article_id, :status, meta: [:title, :description,
|
||||
{ tags: [] }]
|
||||
)
|
||||
end
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
# content :text
|
||||
# description :text
|
||||
# meta :jsonb
|
||||
# slug :string not null
|
||||
# status :integer
|
||||
# title :string
|
||||
# views :integer
|
||||
|
@ -22,6 +23,7 @@
|
|||
#
|
||||
# index_articles_on_associated_article_id (associated_article_id)
|
||||
# index_articles_on_author_id (author_id)
|
||||
# index_articles_on_slug (slug)
|
||||
#
|
||||
class Article < ApplicationRecord
|
||||
include PgSearch::Model
|
||||
|
|
21
db/migrate/20220926164441_add_slug_to_article.rb
Normal file
21
db/migrate/20220926164441_add_slug_to_article.rb
Normal file
|
@ -0,0 +1,21 @@
|
|||
class AddSlugToArticle < ActiveRecord::Migration[6.1]
|
||||
def up
|
||||
add_column :articles, :slug, :string
|
||||
|
||||
update_past_articles_with_slug
|
||||
|
||||
add_index :articles, :slug
|
||||
change_column_null(:articles, :slug, false)
|
||||
end
|
||||
|
||||
def down
|
||||
remove_column(:articles, :slug)
|
||||
end
|
||||
|
||||
def update_past_articles_with_slug
|
||||
Article.all.each_with_index do |article, index|
|
||||
slug = article.title.underscore.parameterize(separator: '-')
|
||||
article.update!(slug: "#{slug}-#{index}")
|
||||
end
|
||||
end
|
||||
end
|
|
@ -10,7 +10,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 2022_09_20_014549) do
|
||||
ActiveRecord::Schema.define(version: 2022_09_26_164441) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "pg_stat_statements"
|
||||
|
@ -131,8 +131,10 @@ ActiveRecord::Schema.define(version: 2022_09_20_014549) do
|
|||
t.bigint "author_id"
|
||||
t.bigint "associated_article_id"
|
||||
t.jsonb "meta", default: {}
|
||||
t.string "slug", null: false
|
||||
t.index ["associated_article_id"], name: "index_articles_on_associated_article_id"
|
||||
t.index ["author_id"], name: "index_articles_on_author_id"
|
||||
t.index ["slug"], name: "index_articles_on_slug"
|
||||
end
|
||||
|
||||
create_table "attachments", id: :serial, force: :cascade do |t|
|
||||
|
|
|
@ -24,6 +24,7 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
|||
category_id: category.id,
|
||||
description: 'test description',
|
||||
title: 'MyTitle',
|
||||
slug: 'my-title',
|
||||
content: 'This is my content.',
|
||||
status: :published,
|
||||
author_id: agent.id
|
||||
|
@ -39,8 +40,9 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
|||
end
|
||||
|
||||
it 'associate to the root article' do
|
||||
root_article = create(:article, category: category, portal: portal, account_id: account.id, author_id: agent.id, associated_article_id: nil)
|
||||
parent_article = create(:article, category: category, portal: portal, account_id: account.id, author_id: agent.id,
|
||||
root_article = create(:article, category: category, slug: 'root-article', portal: portal, account_id: account.id, author_id: agent.id,
|
||||
associated_article_id: nil)
|
||||
parent_article = create(:article, category: category, slug: 'parent-article', portal: portal, account_id: account.id, author_id: agent.id,
|
||||
associated_article_id: root_article.id)
|
||||
|
||||
article_params = {
|
||||
|
@ -48,6 +50,7 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
|||
category_id: category.id,
|
||||
description: 'test description',
|
||||
title: 'MyTitle',
|
||||
slug: 'MyTitle',
|
||||
content: 'This is my content.',
|
||||
status: :published,
|
||||
author_id: agent.id,
|
||||
|
@ -73,6 +76,7 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
|||
category_id: category.id,
|
||||
description: 'test description',
|
||||
title: 'MyTitle',
|
||||
slug: 'MyTitle',
|
||||
content: 'This is my content.',
|
||||
status: :published,
|
||||
author_id: agent.id,
|
||||
|
@ -210,9 +214,9 @@ RSpec.describe 'Api::V1::Accounts::Articles', type: :request do
|
|||
|
||||
it 'get associated articles' do
|
||||
root_article = create(:article, category: category, portal: portal, account_id: account.id, author_id: agent.id, associated_article_id: nil)
|
||||
child_article_1 = create(:article, category: category, portal: portal, account_id: account.id, author_id: agent.id,
|
||||
child_article_1 = create(:article, slug: 'child-1', category: category, portal: portal, account_id: account.id, author_id: agent.id,
|
||||
associated_article_id: root_article.id)
|
||||
child_article_2 = create(:article, category: category, portal: portal, account_id: account.id, author_id: agent.id,
|
||||
child_article_2 = create(:article, slug: 'child-2', category: category, portal: portal, account_id: account.id, author_id: agent.id,
|
||||
associated_article_id: root_article.id)
|
||||
|
||||
get "/api/v1/accounts/#{account.id}/portals/#{portal.slug}/articles/#{root_article.id}",
|
||||
|
|
|
@ -4,6 +4,7 @@ FactoryBot.define do
|
|||
category_id { 1 }
|
||||
author_id { 1 }
|
||||
title { 'MyString' }
|
||||
slug { 'MyString' }
|
||||
content { 'MyText' }
|
||||
description { 'MyDescrption' }
|
||||
status { 1 }
|
||||
|
|
|
@ -25,13 +25,15 @@ RSpec.describe Article, type: :model do
|
|||
let!(:category_3) { create(:category, slug: 'category_3', locale: 'es', portal_id: portal_2.id) }
|
||||
|
||||
before do
|
||||
create(:article, category_id: category_1.id, content: 'This is the content', description: 'this is the description', title: 'this is title',
|
||||
create(:article, category_id: category_1.id, content: 'This is the content', description: 'this is the description',
|
||||
slug: 'this-is-title', title: 'this is title',
|
||||
portal_id: portal_1.id, author_id: user.id)
|
||||
create(:article, category_id: category_1.id, title: 'title 1', content: 'This is the content', portal_id: portal_1.id, author_id: user.id)
|
||||
create(:article, category_id: category_2.id, title: 'title 2', portal_id: portal_2.id, author_id: user.id)
|
||||
create(:article, category_id: category_2.id, title: 'title 3', portal_id: portal_1.id, author_id: user.id)
|
||||
create(:article, category_id: category_3.id, title: 'title 6', portal_id: portal_2.id, author_id: user.id, status: :published)
|
||||
create(:article, category_id: category_2.id, title: 'title 7', portal_id: portal_1.id, author_id: user.id, status: :published)
|
||||
create(:article, category_id: category_1.id, slug: 'title-1', title: 'title 1', content: 'This is the content', portal_id: portal_1.id,
|
||||
author_id: user.id)
|
||||
create(:article, category_id: category_2.id, slug: 'title-2', title: 'title 2', portal_id: portal_2.id, author_id: user.id)
|
||||
create(:article, category_id: category_2.id, slug: 'title-3', title: 'title 3', portal_id: portal_1.id, author_id: user.id)
|
||||
create(:article, category_id: category_3.id, slug: 'title-6', title: 'title 6', portal_id: portal_2.id, author_id: user.id, status: :published)
|
||||
create(:article, category_id: category_2.id, slug: 'title-7', title: 'title 7', portal_id: portal_1.id, author_id: user.id, status: :published)
|
||||
end
|
||||
|
||||
context 'when no parameters passed' do
|
||||
|
@ -121,7 +123,7 @@ RSpec.describe Article, type: :model do
|
|||
|
||||
context 'with pagination' do
|
||||
it 'returns paginated articles' do
|
||||
create_list(:article, 30, category_id: category_2.id, title: 'title 1', portal_id: portal_2.id, author_id: user.id)
|
||||
create_list(:article, 30, category_id: category_2.id, slug: 'title-1', title: 'title 1', portal_id: portal_2.id, author_id: user.id)
|
||||
params = { category_slug: 'category_2' }
|
||||
records = portal_2.articles.search(params)
|
||||
expect(records.count).to eq(25)
|
||||
|
|
Loading…
Reference in a new issue