1
1
module My
2
2
class HeartbeatsController < ApplicationController
3
+ include ActionController ::Live
3
4
before_action :ensure_current_user
4
5
5
-
6
6
def export
7
7
all_data = params [ :all_data ] == "true"
8
8
if all_data
@@ -15,29 +15,59 @@ def export
15
15
end_date = Date . current
16
16
end
17
17
else
18
- start_date = params [ :start_date ] . present? ? Date . parse ( params [ :start_date ] ) : 30 . days . ago . to_date
19
- end_date = params [ :end_date ] . present? ? Date . parse ( params [ :end_date ] ) : Date . current
18
+ start_date =
19
+ params [ :start_date ] . present? ?
20
+ Date . parse ( params [ :start_date ] ) :
21
+ 30 . days . ago . to_date
22
+ end_date =
23
+ params [ :end_date ] . present? ?
24
+ Date . parse ( params [ :end_date ] ) :
25
+ Date . current
20
26
start_time = start_date . beginning_of_day . to_f
21
27
end_time = end_date . end_of_day . to_f
22
28
23
- heartbeats = current_user . heartbeats
24
- . where ( "time >= ? AND time <= ?" , start_time , end_time )
25
- . order ( time : :asc )
29
+ heartbeats =
30
+ current_user . heartbeats . where (
31
+ "time >= ? AND time <= ?" ,
32
+ start_time ,
33
+ end_time
34
+ ) . order ( time : :asc )
26
35
end
27
36
37
+ total_heartbeats = heartbeats . count
38
+ total_duration_seconds = heartbeats . duration_seconds
39
+
40
+ filename =
41
+ "heartbeats_#{ current_user . slack_uid } _#{ start_date . strftime ( '%Y%m%d' ) } _#{ end_date . strftime ( '%Y%m%d' ) } .json"
42
+
43
+ response . headers [ "Content-Type" ] = "application/json"
44
+ response . headers [ "Content-Disposition" ] =
45
+ "attachment; filename=\" #{ filename } \" "
46
+ response . headers [ "X-Accel-Buffering" ] = "no"
47
+
48
+ response . stream . write "{"
49
+ response . stream . write "\" export_info\" : {"
50
+ response . stream . write "\" exported_at\" : \" " + Time . current . iso8601 + "\" ,"
51
+ response . stream . write "\" date_range\" : {"
52
+ response . stream . write "\" start_date\" : \" " + start_date . iso8601 + "\" ,"
53
+ response . stream . write "\" end_date\" : \" " + end_date . iso8601 + "\" "
54
+ response . stream . write "},"
55
+ response . stream . write "\" total_heartbeats\" : " + total_heartbeats . to_s + ","
56
+ response . stream . write (
57
+ "\" total_duration_seconds\" : " + total_duration_seconds . to_s
58
+ )
59
+ response . stream . write "},"
60
+ response . stream . write "\" heartbeats\" : ["
28
61
29
- export_data = {
30
- export_info : {
31
- exported_at : Time . current . iso8601 ,
32
- date_range : {
33
- start_date : start_date . iso8601 ,
34
- end_date : end_date . iso8601
35
- } ,
36
- total_heartbeats : heartbeats . count ,
37
- total_duration_seconds : heartbeats . duration_seconds
38
- } ,
39
- heartbeats : heartbeats . map do |heartbeat |
40
- {
62
+ first = true
63
+ heartbeats . find_in_batches ( batch_size : 1000 ) do |batch |
64
+ batch . each do |heartbeat |
65
+ if first
66
+ first = false
67
+ else
68
+ response . stream . write ","
69
+ end
70
+ hb_json = {
41
71
id : heartbeat . id ,
42
72
time : Time . at ( heartbeat . time ) . iso8601 ,
43
73
entity : heartbeat . entity ,
@@ -60,26 +90,24 @@ def export
60
90
source_type : heartbeat . source_type ,
61
91
created_at : heartbeat . created_at . iso8601 ,
62
92
updated_at : heartbeat . updated_at . iso8601
63
- }
93
+ } . to_json
94
+ response . stream . write hb_json
64
95
end
65
- }
66
-
67
- filename = "heartbeats_#{ current_user . slack_uid } _#{ start_date . strftime ( '%Y%m%d' ) } _#{ end_date . strftime ( '%Y%m%d' ) } .json"
68
-
69
- respond_to do |format |
70
- format . json {
71
- send_data export_data . to_json ,
72
- filename : filename ,
73
- type : "application/json" ,
74
- disposition : "attachment"
75
- }
76
96
end
97
+
98
+ response . stream . write "]"
99
+ response . stream . write "}"
100
+ ensure
101
+ response . stream . close
77
102
end
78
103
79
104
private
80
105
81
106
def ensure_current_user
82
- redirect_to root_path , alert : "You must be logged in to view this page!!" unless current_user
107
+ unless current_user
108
+ redirect_to root_path ,
109
+ alert : "You must be logged in to view this page!!"
110
+ end
83
111
end
84
112
end
85
113
end
0 commit comments