-
Notifications
You must be signed in to change notification settings - Fork 0
/
report_service.rb
59 lines (46 loc) · 1.64 KB
/
report_service.rb
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
59
class ReportService
InvalidDateRange = Class.new(StandardError)
attr_reader :data, :error
def initialize(params, user)
@params = params
@user = user
end
# calls the perform instance method.
def self.perform(params, user)
new(params, user).perform
end
# retrieving the search results and filter by date if @params[:daterange] present.
def perform
begin
@data = SearchResult.joins(search_file: :user)
.where('users.id = ?', @user.id)
.select(:id, :key, :links, :ad_words, :results)
.order('key')
filter_by_date if @params[:daterange].present? # filter by date
rescue InvalidDateRange
@error = 'Select a valid daterange!'
end
self # returns ReportService with readable data and error.
end
private
# filter the query byr date.
def filter_by_date
start_date, end_date = parse_daterange
@data = @data.where('search_files.created_at BETWEEN ? AND ?', start_date, end_date)
end
# parses the daterange parameter to start_date and end_date
def parse_daterange
from_date, to_date = @params[:daterange].delete(' ').split('-')
start_date = valid_date? from_date
end_date = valid_date? to_date
[start_date.beginning_of_day, end_date.beginning_of_day]
end
# checks if date string is valid by checking a regex and formatting date.
# raise InvalidDateRange if something goes wrong.
def valid_date?(string)
raise InvalidDateRange if %r{(\d{4}/\d{2}/\d{2})}.match(string).blank?
Date.strptime(string, '%Y/%m/%d')
rescue ArgumentError
raise InvalidDateRange
end
end