56 lines
1.9 KiB
Ruby
56 lines
1.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module DiscoursePostEvent
|
|
class EventValidator
|
|
def initialize(post)
|
|
@post = post
|
|
end
|
|
|
|
def validate_event
|
|
extracted_events = DiscoursePostEvent::EventParser::extract_events(@post.raw)
|
|
|
|
if extracted_events.count == 0
|
|
return false
|
|
end
|
|
|
|
if extracted_events.count > 1
|
|
@post.errors.add(:base, I18n.t("discourse_post_event.errors.models.event.only_one_event"))
|
|
return false
|
|
end
|
|
|
|
if !@post.is_first_post?
|
|
@post.errors.add(:base, I18n.t("discourse_post_event.errors.models.event.must_be_in_first_post"))
|
|
return false
|
|
end
|
|
|
|
extracted_event = extracted_events.first
|
|
|
|
if extracted_event[:start].blank? || (DateTime.parse(extracted_event[:start]) rescue nil).nil?
|
|
@post.errors.add(:base, I18n.t("discourse_post_event.errors.models.event.start_must_be_present_and_a_valid_date"))
|
|
return false
|
|
end
|
|
|
|
if extracted_event[:end].present? && (DateTime.parse(extracted_event[:end]) rescue nil).nil?
|
|
@post.errors.add(:base, I18n.t("discourse_post_event.errors.models.event.end_must_be_a_valid_date"))
|
|
return false
|
|
end
|
|
|
|
if extracted_event[:start].present? && extracted_event[:end].present?
|
|
if Time.parse(extracted_event[:start]) > Time.parse(extracted_event[:end])
|
|
@post.errors.add(:base, I18n.t("discourse_post_event.errors.models.event.ends_at_before_starts_at"))
|
|
return false
|
|
end
|
|
end
|
|
|
|
if extracted_event[:name].present? && extracted_event[:name]
|
|
if !(Event::MIN_NAME_LENGTH..Event::MAX_NAME_LENGTH).cover?(extracted_event[:name].length)
|
|
@post.errors.add(:base, I18n.t('discourse_post_event.errors.models.event.name.length', minimum: Event::MIN_NAME_LENGTH, maximum: Event::MAX_NAME_LENGTH))
|
|
return false
|
|
end
|
|
end
|
|
|
|
true
|
|
end
|
|
end
|
|
end
|