--[[ Adds a repeatable job Input: KEYS[1] 'repeat' key KEYS[2] 'delayed' key ARGV[1] next milliseconds ARGV[2] msgpacked options [1] name [2] tz? [3] pattern? [4] endDate? [5] every? ARGV[3] legacy custom key TODO: remove this logic in next breaking change ARGV[4] custom key ARGV[5] prefix key Output: repeatableKey - OK ]] local rcall = redis.call local repeatKey = KEYS[1] local delayedKey = KEYS[2] local nextMillis = ARGV[1] local legacyCustomKey = ARGV[3] local customKey = ARGV[4] local prefixKey = ARGV[5] -- Includes --- @include "includes/removeJob" local function storeRepeatableJob(repeatKey, customKey, nextMillis, rawOpts) rcall("ZADD", repeatKey, nextMillis, customKey) local opts = cmsgpack.unpack(rawOpts) local optionalValues = {} if opts['tz'] then table.insert(optionalValues, "tz") table.insert(optionalValues, opts['tz']) end if opts['pattern'] then table.insert(optionalValues, "pattern") table.insert(optionalValues, opts['pattern']) end if opts['endDate'] then table.insert(optionalValues, "endDate") table.insert(optionalValues, opts['endDate']) end if opts['every'] then table.insert(optionalValues, "every") table.insert(optionalValues, opts['every']) end rcall("HMSET", repeatKey .. ":" .. customKey, "name", opts['name'], unpack(optionalValues)) return customKey end -- If we are overriding a repeatable job we must delete the delayed job for -- the next iteration. local prevMillis = rcall("ZSCORE", repeatKey, customKey) if prevMillis then local delayedJobId = "repeat:" .. customKey .. ":" .. prevMillis local nextDelayedJobId = repeatKey .. ":" .. customKey .. ":" .. nextMillis if rcall("ZSCORE", delayedKey, delayedJobId) and rcall("EXISTS", nextDelayedJobId) ~= 1 then removeJob(delayedJobId, true, prefixKey, true --[[remove debounce key]]) rcall("ZREM", delayedKey, delayedJobId) end end -- Keep backwards compatibility with old repeatable jobs (<= 3.0.0) if rcall("ZSCORE", repeatKey, legacyCustomKey) ~= false then return storeRepeatableJob(repeatKey, legacyCustomKey, nextMillis, ARGV[2]) end return storeRepeatableJob(repeatKey, customKey, nextMillis, ARGV[2])