Welcome to mirror list, hosted at ThFree Co, Russian Federation.

update_package_file_service.rb « packages « services « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 9a8a78e509a73fc8aaa00a4341d3a8a908259953 (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
50
51
52
53
54
55
56
57
58
# frozen_string_literal: true

module Packages
  class UpdatePackageFileService
    delegate :file, to: :@package_file

    def initialize(package_file, params)
      @package_file = package_file
      @params = params
    end

    def execute
      check_params

      return if same_as_params?

      # we need to access the file *before* updating the attributes linked to its path/key.
      file_storage_mode = file.file_storage?

      @package_file.package_id = package_id if package_id
      @package_file.file_name = file_name if file_name

      if file_storage_mode
        # package file is in mode LOCAL: we can pass the `file` to the update
        @package_file.file = file
      else
        # package file is in mode REMOTE: don't pass the `file` to the update
        # instead, pass the new file path. This will move the file
        # in object storage.
        @package_file.new_file_path = File.join(file.store_dir, @package_file.file_name)
      end

      @package_file.save!
    end

    private

    def check_params
      raise ArgumentError, 'package_file not persisted' unless @package_file.persisted?
      raise ArgumentError, 'package_id and file_name are blank' if package_id.blank? && file_name.blank?
    end

    def same_as_params?
      return false if package_id && package_id != @package_file.package_id
      return false if file_name && file_name != @package_file.file_name

      true
    end

    def package_id
      @params[:package_id]
    end

    def file_name
      @params[:file_name]
    end
  end
end