diff --git a/app/controllers/api/v1/accounts/articles_controller.rb b/app/controllers/api/v1/accounts/articles_controller.rb index a2aab527c..d650b19d9 100644 --- a/app/controllers/api/v1/accounts/articles_controller.rb +++ b/app/controllers/api/v1/accounts/articles_controller.rb @@ -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 diff --git a/app/models/article.rb b/app/models/article.rb index 1044e1107..f7318c497 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -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 diff --git a/db/migrate/20220926164441_add_slug_to_article.rb b/db/migrate/20220926164441_add_slug_to_article.rb new file mode 100644 index 000000000..4eac09b86 --- /dev/null +++ b/db/migrate/20220926164441_add_slug_to_article.rb @@ -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 diff --git a/db/schema.rb b/db/schema.rb index a20a90f65..ad5c8241a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -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| diff --git a/spec/controllers/api/v1/accounts/articles_controller_spec.rb b/spec/controllers/api/v1/accounts/articles_controller_spec.rb index 1e98af260..8e79ba7c3 100644 --- a/spec/controllers/api/v1/accounts/articles_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/articles_controller_spec.rb @@ -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}", diff --git a/spec/factories/articles.rb b/spec/factories/articles.rb index 9ba5d9ac4..f820ddd6c 100644 --- a/spec/factories/articles.rb +++ b/spec/factories/articles.rb @@ -4,6 +4,7 @@ FactoryBot.define do category_id { 1 } author_id { 1 } title { 'MyString' } + slug { 'MyString' } content { 'MyText' } description { 'MyDescrption' } status { 1 } diff --git a/spec/models/article_spec.rb b/spec/models/article_spec.rb index 6a66838ef..3fffa63d6 100644 --- a/spec/models/article_spec.rb +++ b/spec/models/article_spec.rb @@ -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)