## Summary - Remove label deletion dependency on association cleanup by deleting immediately and enqueueing a background job. - Add `Labels::RemoveAssociationsJob` to strip deleted label references from tagged conversations and contacts. - Keep this version simple by removing the label count/prompt requirement requested. ## Implementation notes - Enqueue job from `Api::V1::Accounts::LabelsController#destroy` with label title + account id. - Background work performed in `Labels::DestroyService`. ## References - Linear issue: https://linear.app/chatwoot/issue/CW-4765/cw-2857-enhancement-removing-labels-is-inconsistent - GitHub issue: https://github.com/chatwoot/chatwoot/issues/1249 ## Testing - `bundle exec rspec spec/controllers/api/v1/accounts/labels_controller_spec.rb spec/services/labels/destroy_service_spec.rb spec/jobs/labels/remove_associations_job_spec.rb spec/services/labels/update_service_spec.rb` - `bundle exec rubocop app/controllers/api/v1/accounts/labels_controller.rb app/jobs/labels/remove_associations_job.rb spec/controllers/api/v1/accounts/labels_controller_spec.rb spec/jobs/labels/remove_associations_job_spec.rb spec/services/labels/destroy_service_spec.rb` --------- Co-authored-by: Sony Mathew <sony@chatwoot.com> Co-authored-by: Sony Mathew <2040199+sony-mathew@users.noreply.github.com>
44 lines
952 B
Ruby
44 lines
952 B
Ruby
class Api::V1::Accounts::LabelsController < Api::V1::Accounts::BaseController
|
|
before_action :current_account
|
|
before_action :fetch_label, except: [:index, :create]
|
|
before_action :check_authorization
|
|
|
|
def index
|
|
@labels = policy_scope(Current.account.labels)
|
|
end
|
|
|
|
def show; end
|
|
|
|
def create
|
|
@label = Current.account.labels.create!(permitted_params)
|
|
end
|
|
|
|
def update
|
|
@label.update!(permitted_params)
|
|
end
|
|
|
|
def destroy
|
|
label_title = @label.title
|
|
account_id = Current.account.id
|
|
label_deleted_at = Time.current
|
|
|
|
@label.destroy!
|
|
Labels::RemoveAssociationsJob.perform_later(
|
|
label_title: label_title,
|
|
account_id: account_id,
|
|
label_deleted_at: label_deleted_at
|
|
)
|
|
head :ok
|
|
end
|
|
|
|
private
|
|
|
|
def fetch_label
|
|
@label = Current.account.labels.find(params[:id])
|
|
end
|
|
|
|
def permitted_params
|
|
params.require(:label).permit(:title, :description, :color, :show_on_sidebar)
|
|
end
|
|
end
|