redmine_dmsf/lib/dav4rack/lock_store.rb
2023-05-12 15:59:01 +02:00

64 lines
1.5 KiB
Ruby

# frozen_string_literal: true
require "#{File.dirname(__FILE__)}/lock"
module Dav4rack
# Lock store
class LockStore
class << self
def create
@locks_by_path = {}
@locks_by_token = {}
end
def add(lock)
@locks_by_path[lock.path] = lock
@locks_by_token[lock.token] = lock
end
def remove(lock)
@locks_by_path.delete lock.path
@locks_by_token.delete lock.token
end
def find_by_path(path)
@locks_by_path.filter_map { |lpath, lock| lpath == path && lock.remaining_timeout.positive? ? lock : nil }
.first
end
def find_by_token(token)
@locks_by_token.filter_map do |ltoken, lock|
ltoken == token && lock.remaining_timeout.positive? ? lock : nil
end.first
end
def explicit_locks(path)
@locks_by_path.filter_map { |lpath, lock| lpath == path && lock.remaining_timeout.positive? ? lock : nil }
end
def implicit_locks(path)
@locks_by_path.filter_map do |lpath, lock|
lpath =~ /^#{Regexp.escape(path)}/ && lock.remaining_timeout.positive? && lock.depth.positive? ? lock : nil
end
end
def explicitly_locked?(path)
!explicit_locks(path).empty?
end
def implicitly_locked?(path)
!implicit_locks(path).empty?
end
def generate(path, user, token)
l = Lock.new(path: path, user: user, token: token)
l.store = self
add l
l
end
end
end
end
Dav4rack::LockStore.create