chatwoot/lib/tasks
Muhsin Keloth 20fa5eeaa5
fix: Prevent SLA deletion timeouts by moving to async job (#12944)
This PR fixes the HTTP 500 timeout errors occurring when deleting SLA
policies that have large volumes of historical data.
The fix moves the deletion workflow to asynchronous background
processing using the existing `DeleteObjectJob`.
By offloading heavy cascaded deletions (applied SLAs, SLA events,
conversation nullifications) from the request cycle, the API can now
return immediately while the cleanup continues in the background
avoiding the `Rack::Timeout::RequestTimeoutException`. This ensures that
SLA policies can be deleted reliably, regardless of data size.


### Problem
Deleting an SLA policy via `DELETE
/api/v1/accounts/{account_id}/sla_policies/{id}` fails consistently with
`Rack::Timeout::RequestTimeoutException (15s)` for policies with large
amounts of related data.

Because the current implementation performs all dependent deletions
**synchronously**, Rails processes:

- `has_many :applied_slas, dependent: :destroy` (thousands)
- Each `AppliedSla#destroy` → triggers destruction of many `SlaEvent`
records
- `has_many :conversations, dependent: :nullify` (thousands)

This processing far exceeds the Rack timeout window and consistently
triggers HTTP 500 errors for users.

### Solution

This PR applies the same pattern used successfully in Inbox deletion.

**Move deletion to async background jobs**

- Uses `DeleteObjectJob` for centralized, reliable cleanup.
- Allows the DELETE API call to respond immediately.

**Chunk large datasets**

- Records are processed in **batches of 5,000** to reduce DB load and
avoid job timeouts.
2025-12-10 12:28:47 +05:30
..
dev feat: Add development variant toggle rake task (#11696) 2025-06-10 09:47:59 -04:00
ops feat: add ops task to purge orphan conversations (#12279) 2025-08-27 14:42:11 +02:00
.keep Initial Commit 2019-08-14 15:18:44 +05:30
apply_sla.rake fix: Prevent SLA deletion timeouts by moving to async job (#12944) 2025-12-10 12:28:47 +05:30
asset_clean.rake chore: Upgrade Tailwind CSS to 3.3.2 (#7380) 2023-06-26 11:27:16 -07:00
auto_annotate_models.rake feat: Standardize rich editor across all channels (#12600) 2025-12-08 14:43:45 +05:30
build.rake feat: Vite + vue 3 💚 (#10047) 2024-10-02 00:36:30 -07:00
bulk_conversations.rake fix: Prevent SLA deletion timeouts by moving to async job (#12944) 2025-12-10 12:28:47 +05:30
captain_chat.rake feat(ee): Captain custom http tools (#12584) 2025-10-06 07:53:15 -07:00
companies.rake feat: Add company backfill migration for existing contacts (Part 1) (#12657) 2025-11-03 20:03:47 +05:30
db_enhancements.rake fix: use supported access method for schema_format in Rails 7 (#11576) 2025-05-27 15:34:59 -06:00
generate_test_data.rake chore: Generate test data for bulk insertion (#11229) 2025-05-06 11:13:11 +05:30
instance_id.rake feat: Report cwctl events to hub (#8009) 2023-10-10 09:16:03 +05:30
ip_lookup.rake fix: ip-lookup database lazy loading for all environments (#8052) 2024-10-22 23:18:30 -07:00
mfa.rake fix: Session controller to not generate auth tokens before mfa verification (#12487) 2025-09-23 19:13:47 +05:30
seed_reports_data.rake feat: label reports overview (#11194) 2025-06-11 14:35:46 +05:30
sidekiq_tasks.rake feat: Add rake task to clear ActionCable jobs (#9307) 2024-04-30 08:03:40 -07:00
swagger.rake feat: Update swagger to openapi 3.0.4, update request payloads with examples (#11533) 2025-05-22 17:57:12 +07:00