-
Notifications
You must be signed in to change notification settings - Fork 2
/
app.rb
171 lines (143 loc) · 4.93 KB
/
app.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# app.rb
require 'sinatra'
require 'sinatra/activerecord'
require 'sinatra/namespace'
require 'sinatra/reloader' if development?
current_dir = Dir.pwd
Dir["#{current_dir}/models/*.rb"].each { |file| require file }
get '/' do
@timeline = []
db = Contact.select(:uploader, :contact, :start_time, :end_time)
.order(:start_time, :contact)
db.each { |item|
@timeline.append(uploader: item.uploader, contact: item.contact,
start: item.start_time, end: item.end_time)
}
erb :chart
end
get '/terms' do
'Terms and Conditions'
end
namespace '/api/v1' do
helpers do
def base_url
@base_url ||= "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}"
end
def json_params
begin
JSON.parse(request.body.read)
rescue
halt 400, { message: "Invalid JSON: #{request.body.read}" }.to_json
end
end
end
before do
content_type 'application/json'
end
get '/contacts' do
contacts = Contact.all
%i[uploader contact].each do |filter|
contacts = contacts.send(filter, params[filter]) if params[filter]
end
contacts.to_json
end
get '/health' do
{ version: '0.0.4' }.to_json
end
post '/contacts' do
input = json_params
list = input.is_a?(Array) ? input : [input]
result = []
list.each { |params|
# { uploader:_uploader, contact: _contact, rssi:_rssi, date:_date };
contact = Contact.where(['uploader = ? and contact = ? and start_time >= ? and end_time <= ?',
params['uploader'], params['contact'],
DateTime.parse(params['date']),
DateTime.parse(params['date'])
]).first
if contact
result.push(contact)
next
end
# Interface: { uploader:_uploader, contact: _contact, rssi:_rssi, date:_date };
contact = Contact.where(['uploader = ? and contact = ? and ? > start_time and ? < end_time',
params['uploader'], params['contact'],
DateTime.parse(params['date']) + 3.minute,
DateTime.parse(params['date']) - 3.minute]).first
if contact
contact.start_time = params['date'] if params['date'] < contact.start_time
contact.end_time = params['date'] if params['date'] > contact.end_time
contact.rssi = params['rssi'] if params['rssi']
else
contact = Contact.new
contact.uploader = params['uploader']
contact.contact = params['contact']
contact.start_time = params['date']
contact.end_time = params['date']
contact.rssi = params['rssi']
contact.ip_address = params['ip_address']
contact.employee_id = params['employee_id']
end
if contact.save
result.push(contact)
end
}
p "Processed #{list.length} inputs into #{result.length} outputs"
if !result.empty?
if result.length == 1
result[0].to_json
else
result.to_json
end
else
status 422
end
end
get '/check' do
users = Contact.select(:contact).group(:contact)
users.each { |user|
users.each { |contact|
contacts = Contact.where(uploader: user.contact, contact: contact.contact).order(:start_time)
contacts.each_with_index do |contact, index|
next if index.zero?
prev_con = contacts[index - 1]
if prev_con.end_time >= contact.start_time # goes into the next timeline
if contact.end_time > prev_con.end_time
prev_con.end_time = contact.end_time
prev_con.save!
# contact.destroy! #make it in. Then delete.
puts "Up #{prev_con.start_time}, #{contact.start_time}, #{prev_con.end_time}, #{contact.end_time}"
else
contact.destroy!
puts "In #{prev_con.start_time}, #{contact.start_time}, #{contact.end_time}, #{prev_con.end_time}"
end
end
end
}
}
users.to_json
end
get '/merge' do
users = Contact.select(:contact).group(:contact)
users.each { |user|
users.each { |contact|
contacts = Contact.where(uploader: user.contact, contact: contact.contact).order(:start_time)
contacts.each_with_index do |contact, index|
next if index.zero?
prev_con = contacts[index - 1]
if (contact.start_time - prev_con.end_time).to_f / 60 < 3
if contact.end_time >= prev_con.end_time
prev_con.end_time = contact.end_time
prev_con.save!
# contact.destroy!
puts "Join #{prev_con.start_time}, #{prev_con.end_time}, #{contact.start_time}, #{contact.end_time} with #{(contact.start_time - prev_con.end_time).to_f / 60}"
else
puts ">?>?? #{prev_con.end_time} #{contact.end_time}"
end
end
end
}
}
users.to_json
end
end