Class: Assistant::TechnicalArticleManagementToolBuilder::UpdateRevisionTool

Inherits:
ManagementTool
  • Object
show all
Defined in:
app/services/assistant/technical_article_management_tool_builder.rb

Overview

Edits only the open ArticleRevision proposal, never the live Article.

Instance Method Summary collapse

Methods inherited from ManagementTool

#initialize

Constructor Details

This class inherits a constructor from Assistant::TechnicalArticleManagementToolBuilder::ManagementTool

Instance Method Details

#execute(id:, revision_id:, edit_token:, **attributes) ⇒ String

Updates an editable proposal under optimistic locking.

Parameters:

  • id (Integer)

    stable live Technical Article ID

  • revision_id (Integer)

    open ArticleRevision ID

  • edit_token (String)

    exact token from the latest revision snapshot

  • attributes (Hash)

    partial content, classification, and assignee changes

Options Hash (**attributes):

  • any (Object)

    REVISION_EDITABLE_FIELDS or
    ArticleRevision::ARTICLE_DATA_FIELDS key; other keys are ignored

Returns:

  • (String)

    JSON revision snapshot or safe error



462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
# File 'app/services/assistant/technical_article_management_tool_builder.rb', line 462

def execute(id:, revision_id:, edit_token:, **attributes)
  safely('update revision') do
    article = find_article!(id)
    authorize!(:update, article)
    attrs = attributes.symbolize_keys.slice(
      *REVISION_EDITABLE_FIELDS,
      *ArticleRevision::ARTICLE_DATA_FIELDS
    )
    raise ToolError, 'No editable revision fields were provided.' if attrs.empty?

    TechnicalArticleManagementToolBuilder.validate_association_ids!(attrs)
    TechnicalArticleManagementToolBuilder.validate_revision_assignee!(attrs[:review_assignee_id]) if attrs.key?(:review_assignee_id)
    revision = find_revision!(article, revision_id)
    revision.with_lock do
      raise ToolError, 'Only a draft content revision can be edited.' unless revision.draft?
      raise ToolError, 'This content revision changed since it was read. Refresh it before editing.' unless TechnicalArticleManagementToolBuilder.revision_edit_token(revision) == edit_token.to_s

      revision.update!(attrs)
    end
    revision_response(article, revision)
  end
end

#nameString

Returns stable tool name.

Returns:

  • (String)

    stable tool name



451
# File 'app/services/assistant/technical_article_management_tool_builder.rb', line 451

def name = 'update_technical_article_revision'