85 lines
2.3 KiB
Lua
85 lines
2.3 KiB
Lua
--[[
|
|
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])
|