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
59
60
61
62
63
64
65
66
67
68
69
70
71
|
# File 'app/services/collavre/tools/cron_create_service.rb', line 27
def call(creative_id:, topic_name:, schedule:, message:, description: nil)
raise "Current.user is required" unless Current.user
creative = Creative.find_by(id: creative_id)
return { error: "Creative not found", id: creative_id } unless creative
unless creative.has_permission?(Current.user, :write)
return { error: "No write permission on this Creative", id: creative_id }
end
topic_id = resolve_topic_id(creative, topic_name)
return topic_id if topic_id.is_a?(Hash) && topic_id[:error]
parsed = Fugit.parse(schedule)
unless parsed.is_a?(Fugit::Cron)
return { error: "Invalid cron schedule: #{schedule}. Use cron syntax like '0 9 * * *'." }
end
suffix = SecureRandom.hex(4)
key = "cron_#{creative_id}_#{suffix}"
task = SolidQueue::RecurringTask.create!(
key: key,
class_name: "Collavre::CronActionJob",
schedule: schedule,
queue_name: "default",
static: false,
description: description || "Cron job for creative #{creative_id}",
arguments: [ {
creative_id: creative_id,
topic_id: topic_id,
agent_id: Current.user.id,
message: message
} ]
)
{
success: true,
key: task.key,
schedule: task.schedule,
description: task.description,
creative_id: creative_id,
topic_name: topic_name,
next_run: task.next_time&.iso8601
}
end
|