Bulk topic timers

For adding topic timers, e.g., close topic 1 month after last update, it would be great to have a bulk option. This would allow for adding topic timers to multiple topics at once, without going into each individual topic.

2 Likes

Interesting idea. Are you referring to this modal?

If so, an edge cases to consider: What happens if there’s already a topic timer on one (or more) of the selected topics?

1 Like

Yes, exactly this modal.

I’d find it natural to have the same behavior as if the set topic timer action is performed again on a topic that already has one, i.e., overwrite the existing timer.

2 Likes

May I ask why the “Auto-close topic hours” setting on the category isn’t enough?
Are you adding these timers on topics spanning multiple categories?

3 Likes

Absolutely. I’ve added this setting (720 hours and ticked Don’t close until the last post in the topic is at least this old) and it seems to affect only newly added topics, not those that are currently in this category.

I wanted to bulk add the topic timer to the topics that already existed in the category.

4 Likes

I thought we had a rails command to apply the category setting retroactively too all topics within the category, but I’m failing to find it right now. I’ll keep looking…

1 Like

This is a pretty unique request, why not consume the api, my feeling is that your own custom sword here will fit way better

4 Likes

Thanks for the suggestion.

I’ve went with a combination of database queries to identify the relevant topic IDs and requests to the timer API.

I just found this topic, looking for the same functionality.

Is anyone able to share how I might be able to apply a timer to all topics within a category? I have already created hundreds of Documentation topics and just discovered this feature and want to apply it retroactively.

If it is still not possible to do via the front end, are you able to provide any guidance on how to do so via the api? I’m not very familiar with it yet.

Thanks!

@fhe any chance you can share what you did to achieve this?

I didn’t make any notes unfortunately :innocent:

Disclaimer: Please only do any of that if you understand what I’m proposing and if you have a backup of your Discourse instance and know how to apply it. I haven’t tested this myself, so it might need some adjustments.

1. Get the relevant topic IDs

This would get any topic IDs from category with ID 11 which are not deleted and not closed.

SELECT id FROM topics WHERE category_id = 11 AND deleted_at IS NULL AND closed = FALSE ORDER BY id

Lets say, the result is 3, 6, 12, 24

2. Create the topic timers

Next enter the rails console in your container and use something like

auto_close_hours = 720
topic_ids = [3,6,12,24]
Topic.where(id: topic_ids).find_each do |topic| 
	topic.set_or_create_timer(
		TopicTimer.types[:close],
		auto_close_hours,
		based_on_last_post: true
	)
	MessageBus.publish("/topic/#{topic.id}", reload_topic: true)
end

Please test it with one topic first, hope this helps!

2 Likes