summaryrefslogtreecommitdiff
path: root/app/services/packages/mark_package_files_for_destruction_service.rb
blob: e7fdd88843a84edc17d9037301d5322187c4132f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# frozen_string_literal: true

module Packages
  # WARNING: ensure that permissions are verified before using this service.
  class MarkPackageFilesForDestructionService
    BATCH_SIZE = 500

    def initialize(package_files)
      @package_files = package_files
    end

    def execute(batch_deadline: nil, batch_size: BATCH_SIZE)
      timeout = false
      updates_count = 0
      min_batch_size = [batch_size, BATCH_SIZE].min

      @package_files.each_batch(of: min_batch_size) do |batched_package_files|
        if batch_deadline && Time.zone.now > batch_deadline
          timeout = true
          break
        end

        updates_count += batched_package_files.update_all(status: :pending_destruction)
      end

      payload = { marked_package_files_count: updates_count }

      return response_error(payload) if timeout

      response_success(payload)
    end

    private

    def response_success(payload)
      ServiceResponse.success(
        message: 'Package files are now pending destruction',
        payload: payload
      )
    end

    def response_error(payload)
      ServiceResponse.error(
        message: 'Timeout while marking package files as pending destruction',
        payload: payload
      )
    end
  end
end