95 lines
2.1 KiB
Ruby
95 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module DesignManagement
|
|
class DesignCollection
|
|
attr_reader :issue
|
|
|
|
delegate :designs, :project, to: :issue
|
|
delegate :empty?, to: :designs
|
|
|
|
state_machine :copy_state, initial: :ready, namespace: :copy do
|
|
after_transition any => any, do: :update_stored_copy_state!
|
|
|
|
event :start do
|
|
transition ready: :in_progress
|
|
end
|
|
|
|
event :end do
|
|
transition in_progress: :ready
|
|
end
|
|
|
|
event :error do
|
|
transition in_progress: :error
|
|
end
|
|
|
|
event :reset do
|
|
transition any => :ready
|
|
end
|
|
end
|
|
|
|
def initialize(issue)
|
|
super() # Necessary to initialize state_machine
|
|
|
|
@issue = issue
|
|
|
|
if stored_copy_state = get_stored_copy_state
|
|
@copy_state = stored_copy_state
|
|
end
|
|
end
|
|
|
|
def ==(other)
|
|
other.is_a?(self.class) && issue == other.issue
|
|
end
|
|
|
|
def find_or_create_design!(filename:)
|
|
designs.find { |design| design.filename == filename } ||
|
|
designs.safe_find_or_create_by!(project: project, filename: filename)
|
|
end
|
|
|
|
def versions
|
|
@versions ||= DesignManagement::Version.for_designs(designs)
|
|
end
|
|
|
|
def repository
|
|
project.design_repository
|
|
end
|
|
|
|
def designs_by_filename(filenames)
|
|
designs.current.where(filename: filenames)
|
|
end
|
|
|
|
private
|
|
|
|
def update_stored_copy_state!
|
|
# As "ready" is the initial copy state we can clear the cached value
|
|
# rather than persist it.
|
|
if copy_ready?
|
|
unset_store_copy_state!
|
|
else
|
|
set_stored_copy_state!
|
|
end
|
|
end
|
|
|
|
def copy_state_cache_key
|
|
"DesignCollection/copy_state/issue=#{issue.id}"
|
|
end
|
|
|
|
def get_stored_copy_state
|
|
Gitlab::Redis::SharedState.with do |redis|
|
|
redis.get(copy_state_cache_key)
|
|
end
|
|
end
|
|
|
|
def set_stored_copy_state!
|
|
Gitlab::Redis::SharedState.with do |redis|
|
|
redis.set(copy_state_cache_key, copy_state)
|
|
end
|
|
end
|
|
|
|
def unset_store_copy_state!
|
|
Gitlab::Redis::SharedState.with do |redis|
|
|
redis.del(copy_state_cache_key)
|
|
end
|
|
end
|
|
end
|
|
end
|