summaryrefslogtreecommitdiff
path: root/lib/gitlab/quick_actions/timeline_text_and_date_time_separator.rb
blob: e8002656ff5920819f4bee1da1ff53025ada4e35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
# frozen_string_literal: true

module Gitlab
  module QuickActions
    class TimelineTextAndDateTimeSeparator
      DATETIME_REGEX = %r{(\d{2,4}[\-.]\d{1,2}[\-.]\d{1,2} \d{1,2}:\d{2})}.freeze
      MIXED_DELIMITER = %r{([/.])}.freeze
      TIME_REGEX = %r{(\d{1,2}:\d{2})}.freeze

      def initialize(timeline_event_arg)
        @timeline_event_arg = timeline_event_arg
        @timeline_text = get_text
        @timeline_date_string = get_raw_date_string
      end

      def execute
        return if @timeline_event_arg.blank?
        return if date_contains_mixed_delimiters?
        return [@timeline_text, get_current_date_time] unless date_time_present?
        return unless valid_date?

        [@timeline_text, get_actual_date_time]
      end

      private

      def get_text
        @timeline_event_arg.split('|')[0]&.strip
      end

      def get_raw_date_string
        @timeline_event_arg.split('|')[1]&.strip
      end

      def get_current_date_time
        DateTime.current.strftime("%Y-%m-%d %H:%M:00 UTC")
      end

      def get_actual_date_time
        DateTime.parse(@timeline_date_string)
      end

      def date_time_present?
        DATETIME_REGEX =~ @timeline_date_string || TIME_REGEX =~ @timeline_date_string
      end

      def date_contains_mixed_delimiters?
        MIXED_DELIMITER =~ @timeline_date_string
      end

      def valid_date?
        get_actual_date_time
      rescue Date::Error
        nil
      end
    end
  end
end