Class: ArticleTechnical::PromoteAttachment

Inherits:
Object
  • Object
show all
Includes:
Service
Defined in:
app/services/article_technical/promote_attachment.rb

Overview

Moves a reusable Technical Article document into the existing Publication
library, links the resulting source through ContentLink, and only then removes
the old attachment relationship. The Upload row and stored bytes are reused;
nothing is copied or deleted.

Defined Under Namespace

Classes: Failed, Result

Constant Summary collapse

DEFAULT_CATEGORY_PATH =

Default internal Publication category for promoted support documents.

'goods.publications.technical_support'

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Service

#attributes_used, #build_result, call, #logger

Methods included from Service::Initializer

#initialize

Instance Attribute Details

#article_idInteger?

Returns Technical Article whose attachment is normalized.

Returns:

  • (Integer, nil)

    Technical Article whose attachment is normalized

Validations:



18
# File 'app/services/article_technical/promote_attachment.rb', line 18

attribute :article_id, :integer

#category_pathString

Returns target Publication category ltree path.

Returns:

  • (String)

    target Publication category ltree path



33
# File 'app/services/article_technical/promote_attachment.rb', line 33

attribute :category_path, :string, default: DEFAULT_CATEGORY_PATH

#contextString?

Returns editorial explanation stored on the content link.

Returns:

  • (String, nil)

    editorial explanation stored on the content link



39
# File 'app/services/article_technical/promote_attachment.rb', line 39

attribute :context, :string

#created_by_typeString

Returns ContentLink provenance type.

Returns:

  • (String)

    ContentLink provenance type

Validations:

  • Inclusion ({ in: ContentLink::CREATED_BY_TYPES })


42
# File 'app/services/article_technical/promote_attachment.rb', line 42

attribute :created_by_type, :string, default: 'manual'

#localesArray<String>

Returns Publication language codes.

Returns:

  • (Array<String>)

    Publication language codes



36
# File 'app/services/article_technical/promote_attachment.rb', line 36

attribute :locales, default: -> { ['en'] }

#publication_idInteger?

Returns optional existing canonical Publication.

Returns:

  • (Integer, nil)

    optional existing canonical Publication



24
# File 'app/services/article_technical/promote_attachment.rb', line 24

attribute :publication_id, :integer

#skuString?

Returns Publication SKU for a newly promoted document.

Returns:

  • (String, nil)

    Publication SKU for a newly promoted document



30
# File 'app/services/article_technical/promote_attachment.rb', line 30

attribute :sku, :string

#titleString?

Returns Publication title override.

Returns:

  • (String, nil)

    Publication title override



27
# File 'app/services/article_technical/promote_attachment.rb', line 27

attribute :title, :string

#upload_idInteger?

Returns attached Upload promoted or linked as a Publication.

Returns:

  • (Integer, nil)

    attached Upload promoted or linked as a Publication

Validations:



21
# File 'app/services/article_technical/promote_attachment.rb', line 21

attribute :upload_id, :integer

Instance Method Details

#callResult

Promote or relink one attached source document.

Returns:

  • (Result)

    the publication/link outcome; failed operations make no changes



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'app/services/article_technical/promote_attachment.rb', line 103

def call
  return failure(errors.full_messages) unless valid?

  publication_created = false
  attachment_detached = false
  content_link = nil

  ActiveRecord::Base.transaction do
    load_locked_records!
    ensure_no_open_revision!
    publication = resolve_publication
    @publication = publication
    ensure_attached_or_already_normalized!(publication)

    unless publication
      publication = create_publication!
      publication_created = true
    end

    content_link = link_publication!(publication)
    attachment_detached = detach_attachment!
    @publication = publication
  end

  Result.new(
    success: true,
    publication: @publication,
    content_link: content_link,
    publication_created: publication_created,
    attachment_detached: attachment_detached
  )
rescue Failed, ActiveRecord::RecordInvalid, ActiveRecord::RecordNotFound => e
  failure(error_messages_for(e))
end

#preflightResult

Validate one promotion without changing the article, Upload, Publication,
or ContentLink records.

Returns:

  • (Result)

    the resolved Publication and readiness errors



85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'app/services/article_technical/promote_attachment.rb', line 85

def preflight
  return failure(errors.full_messages) unless valid?

  load_records!
  ensure_no_open_revision!
  publication = resolve_publication
  @publication = publication
  ensure_attached_or_already_normalized!(publication)
  validate_new_publication! unless publication

  Result.new(success: true, publication: publication)
rescue Failed, ActiveRecord::RecordInvalid, ActiveRecord::RecordNotFound => e
  failure(error_messages_for(e))
end