0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-14 13:58:53 +08:00
discourse/plugins/discourse-calendar/jobs/scheduled/update_holiday_usernames.rb
Jarek Radosz e372355fd0
DEV: Clean up scope resolution operators in plugins (#34979)
Co-authored-by: Loïc Guitaut <loic@discourse.org>
2025-09-30 14:36:34 +02:00

55 lines
1.8 KiB
Ruby
Vendored

# frozen_string_literal: true
module Jobs
module DiscourseCalendar
class UpdateHolidayUsernames < ::Jobs::Scheduled
every 10.minutes
def execute(args)
return unless SiteSetting.calendar_enabled
return unless topic_id = SiteSetting.holiday_calendar_topic_id.presence
events = CalendarEvent.where(topic_id: topic_id)
users_on_holiday = ::DiscourseCalendar::UsersOnHoliday.from(events)
::DiscourseCalendar.users_on_holiday = users_on_holiday.values.map { |u| u[:username] }
synchronize_user_custom_fields(users_on_holiday)
set_holiday_statuses(users_on_holiday)
end
private
def synchronize_user_custom_fields(users_on_holiday)
custom_field_name = ::DiscourseCalendar::HOLIDAY_CUSTOM_FIELD
if users_on_holiday.present?
user_ids = users_on_holiday.keys
values = user_ids.map { |id| "(#{id}, '#{custom_field_name}', 't', now(), now())" }
DB.exec <<~SQL, custom_field_name
INSERT INTO user_custom_fields (user_id, name, value, created_at, updated_at)
VALUES #{values.join(",")}
ON CONFLICT (user_id, name) WHERE (name = ?) DO NOTHING
SQL
DB.exec <<~SQL, custom_field_name, user_ids
DELETE FROM user_custom_fields
WHERE name = ?
AND user_id NOT IN (?)
SQL
else
DB.exec("DELETE FROM user_custom_fields WHERE name = ?", custom_field_name)
end
end
def set_holiday_statuses(users_on_holiday)
return if !SiteSetting.enable_user_status
User
.where(id: users_on_holiday.keys)
.includes(:user_status)
.each { |u| ::DiscourseCalendar::HolidayStatus.set!(u, users_on_holiday[u.id][:ends_at]) }
end
end
end
end