## Description The Articles API was ignoring the `status` parameter when creating new articles. All articles were forced to be drafts due to a hardcoded `@article.draft!` call in the controller, even when users explicitly sent `status: 1` (published) in their API request. This PR removes the hardcoded draft enforcement and allows the status parameter to be respected while maintaining backward compatibility. Fixes #12063 ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? **Before:** - API POST with `status: 1` → Created as draft (ignored parameter) - API POST without status → Created as draft **After:** - API POST with `status: 1` → Created as published ✅ - API POST without status → Created as draft (backward compatible) ✅ - UI creates articles → Still creates as draft (UI doesn't send status) ✅ **Tests run:** ```bash bundle exec rspec spec/controllers/api/v1/accounts/articles_controller_spec.rb # 17 examples, 0 failures ``` Updated tests: 1. Changed 2 existing tests that were verifying the broken behavior (expecting draft when published was sent) 2. Added new test to verify articles default to draft when status is not provided 3. All existing tests pass, confirming backward compatibility ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes Co-authored-by: Sojan Jose <sojan@pepalo.com>
87 lines
2.5 KiB
Ruby
87 lines
2.5 KiB
Ruby
class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController
|
|
before_action :portal
|
|
before_action :check_authorization
|
|
before_action :fetch_article, except: [:index, :create, :reorder]
|
|
before_action :set_current_page, only: [:index]
|
|
|
|
def index
|
|
@portal_articles = @portal.articles
|
|
|
|
set_article_count
|
|
|
|
@articles = @articles.search(list_params)
|
|
|
|
@articles = if list_params[:category_slug].present?
|
|
@articles.order_by_position.page(@current_page)
|
|
else
|
|
@articles.order_by_updated_at.page(@current_page)
|
|
end
|
|
end
|
|
|
|
def show; end
|
|
def edit; end
|
|
|
|
def create
|
|
params_with_defaults = article_params
|
|
params_with_defaults[:status] ||= :draft
|
|
@article = @portal.articles.create!(params_with_defaults)
|
|
@article.associate_root_article(article_params[:associated_article_id])
|
|
render json: { error: @article.errors.messages }, status: :unprocessable_entity and return unless @article.valid?
|
|
end
|
|
|
|
def update
|
|
@article.update!(article_params) if params[:article].present?
|
|
render json: { error: @article.errors.messages }, status: :unprocessable_entity and return unless @article.valid?
|
|
end
|
|
|
|
def destroy
|
|
@article.destroy!
|
|
head :ok
|
|
end
|
|
|
|
def reorder
|
|
Article.update_positions(params[:positions_hash])
|
|
head :ok
|
|
end
|
|
|
|
private
|
|
|
|
def set_article_count
|
|
# Search the params without status and author_id, use this to
|
|
# compute mine count published draft etc
|
|
base_search_params = list_params.except(:status, :author_id)
|
|
@articles = @portal_articles.search(base_search_params)
|
|
|
|
@articles_count = @articles.count
|
|
@mine_articles_count = @articles.search_by_author(Current.user.id).count
|
|
@published_articles_count = @articles.published.count
|
|
@draft_articles_count = @articles.draft.count
|
|
@archived_articles_count = @articles.archived.count
|
|
end
|
|
|
|
def fetch_article
|
|
@article = @portal.articles.find(params[:id])
|
|
end
|
|
|
|
def portal
|
|
@portal ||= Current.account.portals.find_by!(slug: params[:portal_id])
|
|
end
|
|
|
|
def article_params
|
|
params.require(:article).permit(
|
|
:title, :slug, :position, :content, :description, :category_id, :author_id, :associated_article_id, :status,
|
|
:locale, meta: [:title,
|
|
:description,
|
|
{ tags: [] }]
|
|
)
|
|
end
|
|
|
|
def list_params
|
|
params.permit(:locale, :query, :page, :category_slug, :status, :author_id)
|
|
end
|
|
|
|
def set_current_page
|
|
@current_page = params[:page] || 1
|
|
end
|
|
end
|