Class: Todos::Destroy::DestroyedIssuableService

Inherits:
Object
  • Object
show all
Defined in:
app/services/todos/destroy/destroyed_issuable_service.rb

Constant Summary collapse

BATCH_SIZE =
100
BOUND_TARGET_TYPES =

Since we are moving towards work items, in some instances we create todos with ‘target_type: WorkItem` in other instances we still create todos with `target_type: Issue` So when an issue/work item is deleted, we just make sure to delete todos for both target types

%w[Issue WorkItem].freeze

Instance Method Summary collapse

Constructor Details

#initialize(target_id, target_type) ⇒ DestroyedIssuableService

Returns a new instance of DestroyedIssuableService.



13
14
15
16
# File 'app/services/todos/destroy/destroyed_issuable_service.rb', line 13

def initialize(target_id, target_type)
  @target_id = target_id
  @target_type = BOUND_TARGET_TYPES.include?(target_type) ? BOUND_TARGET_TYPES : target_type
end

Instance Method Details

#executeObject



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'app/services/todos/destroy/destroyed_issuable_service.rb', line 18

def execute
  inner_query = Todo.select(:id).for_target(target_id).for_type(target_type).limit(BATCH_SIZE)

  delete_query = <<~SQL
  DELETE FROM "#{Todo.table_name}"
  WHERE id IN (#{inner_query.to_sql})
  RETURNING user_id
  SQL

  loop do
    result = Todo.connection.execute(delete_query)

    break if result.cmd_tuples == 0

    user_ids = result.map { |row| row['user_id'] }.uniq

    invalidate_todos_cache_counts(user_ids)
  end
end