device_tracker 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +4 -0
  5. data/Gemfile +4 -0
  6. data/Rakefile +10 -0
  7. data/Readme.md +32 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +7 -0
  10. data/device_tracker.gemspec +63 -0
  11. data/exe/device_tracker +91 -0
  12. data/lib/device_tracker/app.rb +22 -0
  13. data/lib/device_tracker/config-schema.json +111 -0
  14. data/lib/device_tracker/config.ru +9 -0
  15. data/lib/device_tracker/controllers/application_controller.rb +226 -0
  16. data/lib/device_tracker/controllers/devices_controller.rb +315 -0
  17. data/lib/device_tracker/controllers/heartbeat_controller.rb +50 -0
  18. data/lib/device_tracker/controllers/os_controller.rb +38 -0
  19. data/lib/device_tracker/controllers/transactions_controller.rb +18 -0
  20. data/lib/device_tracker/controllers/users_controller.rb +131 -0
  21. data/lib/device_tracker/db/migrate/20150521071815_create_users.rb +14 -0
  22. data/lib/device_tracker/db/migrate/20150521082155_create_devices.rb +19 -0
  23. data/lib/device_tracker/db/migrate/20150521120335_create_operating_systems.rb +9 -0
  24. data/lib/device_tracker/db/migrate/20150527162242_create_transactions.rb +12 -0
  25. data/lib/device_tracker/db/migrate/20151027073050_create_heartbeat.rb +11 -0
  26. data/lib/device_tracker/db/migrate/20151028132946_add_user_verification.rb +8 -0
  27. data/lib/device_tracker/db/migrate/20151028141328_remove_is_active_from_users.rb +6 -0
  28. data/lib/device_tracker/db/migrate/20151029085629_add_password_reset_code_to_users.rb +8 -0
  29. data/lib/device_tracker/db/migrate/20151030130341_add_missing_column_to_devices.rb +8 -0
  30. data/lib/device_tracker/db/migrate/20151102141601_add_serial_number_to_devices.rb +8 -0
  31. data/lib/device_tracker/db/schema.rb +61 -0
  32. data/lib/device_tracker/db/seeds.rb +21 -0
  33. data/lib/device_tracker/dependencies.rb +16 -0
  34. data/lib/device_tracker/device_tracker.rb +18 -0
  35. data/lib/device_tracker/helpers/application_helper.rb +116 -0
  36. data/lib/device_tracker/helpers/user_helper.rb +24 -0
  37. data/lib/device_tracker/models/device.rb +42 -0
  38. data/lib/device_tracker/models/heartbeat.rb +7 -0
  39. data/lib/device_tracker/models/operating_system.rb +7 -0
  40. data/lib/device_tracker/models/transaction.rb +62 -0
  41. data/lib/device_tracker/models/user.rb +28 -0
  42. data/lib/device_tracker/public/css/bootstrap-sortable.css +100 -0
  43. data/lib/device_tracker/public/css/bootstrap.min.css +5 -0
  44. data/lib/device_tracker/public/css/custom.css +88 -0
  45. data/lib/device_tracker/public/favicon/android-chrome-144x144.png +0 -0
  46. data/lib/device_tracker/public/favicon/android-chrome-192x192.png +0 -0
  47. data/lib/device_tracker/public/favicon/android-chrome-36x36.png +0 -0
  48. data/lib/device_tracker/public/favicon/android-chrome-48x48.png +0 -0
  49. data/lib/device_tracker/public/favicon/android-chrome-72x72.png +0 -0
  50. data/lib/device_tracker/public/favicon/android-chrome-96x96.png +0 -0
  51. data/lib/device_tracker/public/favicon/apple-touch-icon-114x114.png +0 -0
  52. data/lib/device_tracker/public/favicon/apple-touch-icon-120x120.png +0 -0
  53. data/lib/device_tracker/public/favicon/apple-touch-icon-144x144.png +0 -0
  54. data/lib/device_tracker/public/favicon/apple-touch-icon-152x152.png +0 -0
  55. data/lib/device_tracker/public/favicon/apple-touch-icon-180x180.png +0 -0
  56. data/lib/device_tracker/public/favicon/apple-touch-icon-57x57.png +0 -0
  57. data/lib/device_tracker/public/favicon/apple-touch-icon-60x60.png +0 -0
  58. data/lib/device_tracker/public/favicon/apple-touch-icon-72x72.png +0 -0
  59. data/lib/device_tracker/public/favicon/apple-touch-icon-76x76.png +0 -0
  60. data/lib/device_tracker/public/favicon/apple-touch-icon-precomposed.png +0 -0
  61. data/lib/device_tracker/public/favicon/apple-touch-icon.png +0 -0
  62. data/lib/device_tracker/public/favicon/browserconfig.xml +12 -0
  63. data/lib/device_tracker/public/favicon/favicon-16x16.png +0 -0
  64. data/lib/device_tracker/public/favicon/favicon-32x32.png +0 -0
  65. data/lib/device_tracker/public/favicon/favicon-96x96.png +0 -0
  66. data/lib/device_tracker/public/favicon/favicon.ico +0 -0
  67. data/lib/device_tracker/public/favicon/manifest.json +41 -0
  68. data/lib/device_tracker/public/favicon/mstile-144x144.png +0 -0
  69. data/lib/device_tracker/public/favicon/mstile-150x150.png +0 -0
  70. data/lib/device_tracker/public/favicon/mstile-310x150.png +0 -0
  71. data/lib/device_tracker/public/favicon/mstile-310x310.png +0 -0
  72. data/lib/device_tracker/public/favicon/mstile-70x70.png +0 -0
  73. data/lib/device_tracker/public/favicon/safari-pinned-tab.svg +21 -0
  74. data/lib/device_tracker/public/favicon.png +0 -0
  75. data/lib/device_tracker/public/fonts/glyphicons-halflings-regular.eot +0 -0
  76. data/lib/device_tracker/public/fonts/glyphicons-halflings-regular.svg +288 -0
  77. data/lib/device_tracker/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  78. data/lib/device_tracker/public/fonts/glyphicons-halflings-regular.woff +0 -0
  79. data/lib/device_tracker/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
  80. data/lib/device_tracker/public/js/bootstrap-sortable.js +211 -0
  81. data/lib/device_tracker/public/js/bootstrap.min.js +7 -0
  82. data/lib/device_tracker/public/js/jquery-2.1.4.min.js +4 -0
  83. data/lib/device_tracker/version.rb +4 -0
  84. data/lib/device_tracker/views/404.erb +25 -0
  85. data/lib/device_tracker/views/_alert.erb +5 -0
  86. data/lib/device_tracker/views/_device_form.erb +52 -0
  87. data/lib/device_tracker/views/_device_list.erb +47 -0
  88. data/lib/device_tracker/views/_footer.erb +3 -0
  89. data/lib/device_tracker/views/_header.erb +97 -0
  90. data/lib/device_tracker/views/_heartbeat_list.erb +25 -0
  91. data/lib/device_tracker/views/_user_form.erb +30 -0
  92. data/lib/device_tracker/views/devices/edit.erb +11 -0
  93. data/lib/device_tracker/views/devices/index.erb +12 -0
  94. data/lib/device_tracker/views/devices/new.erb +10 -0
  95. data/lib/device_tracker/views/devices/show.erb +283 -0
  96. data/lib/device_tracker/views/devices/users.erb +14 -0
  97. data/lib/device_tracker/views/emails/new_password.erb +17 -0
  98. data/lib/device_tracker/views/emails/password_reset.erb +18 -0
  99. data/lib/device_tracker/views/emails/registration.erb +16 -0
  100. data/lib/device_tracker/views/emails/reminder.erb +15 -0
  101. data/lib/device_tracker/views/emails/verification.erb +18 -0
  102. data/lib/device_tracker/views/forgot_password.erb +6 -0
  103. data/lib/device_tracker/views/index.erb +38 -0
  104. data/lib/device_tracker/views/layout.erb +8 -0
  105. data/lib/device_tracker/views/login.erb +14 -0
  106. data/lib/device_tracker/views/operating_system/operating_systems.json.jbuilder +9 -0
  107. data/lib/device_tracker/views/os/manage.erb +38 -0
  108. data/lib/device_tracker/views/transactions/_transactions_list.erb +18 -0
  109. data/lib/device_tracker/views/transactions/index.erb +3 -0
  110. data/lib/device_tracker/views/users/edit.erb +9 -0
  111. data/lib/device_tracker/views/users/manage.erb +31 -0
  112. data/lib/device_tracker/views/users/new.erb +7 -0
  113. metadata +505 -0
@@ -0,0 +1,315 @@
1
+ require_relative 'application_controller'
2
+
3
+ module DeviceTracker
4
+ # :nodoc:
5
+ class DevicesController < ApplicationController
6
+ before { protected! }
7
+
8
+ get '/new' do
9
+ admin_check
10
+
11
+ @device = Device.new
12
+ @operating_systems = OperatingSystem.select(:name, :id)
13
+ .distinct.order(:name)
14
+ erb :"devices/new"
15
+ end
16
+
17
+ post '/create' do
18
+ admin_check
19
+
20
+ attributes = {
21
+ unid: params[:device][:unid],
22
+ manufacturer: params[:device][:manufacturer],
23
+ device: params[:device][:device],
24
+ description: params[:device][:description],
25
+ imei: params[:device][:imei],
26
+ serial_number: params[:device][:serial_number],
27
+ operating_system_id: params[:device][:operating_system_id]
28
+ }
29
+
30
+ attributes[:sim_card] = true if params[:device][:sim_card]
31
+
32
+ attributes[:debug_device] = true if params[:device][:debug_device]
33
+
34
+ attributes.each do |key, value|
35
+ flash[key] = value
36
+ end
37
+
38
+ @device = Device.new(attributes)
39
+
40
+ if @device.valid?
41
+ @device.save
42
+ create_flash 'success', ["Created new device #{@device.full_name}"]
43
+ redirect "/devices/#{@device.id}"
44
+ else
45
+ create_flash 'warning', @device.errors.full_messages
46
+ redirect back
47
+ end
48
+ end
49
+
50
+ get '/' do
51
+ @title = 'All Devices'
52
+
53
+ @devices = Device.all
54
+ @users = User.all
55
+
56
+ @show_search = true
57
+
58
+ if params[:device_name] && !params[:device_name].empty?
59
+ @show_search = false
60
+ @devices = @devices.where(
61
+ 'device like ? or manufacturer like ?',
62
+ "%#{params[:device_name]}%",
63
+ "%#{params[:device_name]}%"
64
+ )
65
+ end
66
+
67
+ @devices = @devices.sort { |a, b| a.full_name <=> b.full_name }
68
+
69
+ erb :"devices/index"
70
+ end
71
+
72
+ get '/checked-out' do
73
+ @devices = Device.where(available: false).order(checked_out_since: :desc)
74
+ @users = User.all
75
+
76
+ if params[:device_name] && !params[:device_name].empty?
77
+ @devices = @devices.where(
78
+ 'description like ?',
79
+ "%#{params[:device_name]}%"
80
+ )
81
+ end
82
+
83
+ @title = 'Checked out Devices'
84
+
85
+ erb :"devices/index"
86
+ end
87
+
88
+ get '/:device_id' do |device_id|
89
+ fail Sinatra::NotFound unless Device.exists?(device_id)
90
+
91
+ @users = User.where(is_verified: true).order(email: :desc)
92
+
93
+ @device = Device.find(device_id)
94
+
95
+ if @device.missing?
96
+ @last_checkout_transaction = Transaction.where(
97
+ transaction_type: 'CHECKOUT',
98
+ device_id:
99
+ @device.id
100
+ ).order(id: :desc).first
101
+ end
102
+
103
+ @transactions = @device.transactions.order(created_at: :desc).take(10)
104
+
105
+ @current_user = logged_in_user
106
+
107
+ erb :"devices/show"
108
+ end
109
+
110
+ put '/:device_id' do |device_id|
111
+ admin_check
112
+
113
+ fail Sinatra::NotFound unless Device.exists?(device_id)
114
+
115
+ params[:device].each do |key, value|
116
+ flash[key.to_sym] = value
117
+ end
118
+
119
+ @device = Device.find(device_id)
120
+ @device.update(params[:device])
121
+
122
+ if @device.save
123
+
124
+ create_flash 'success', ['The device has been successfully updated.']
125
+ redirect "/devices/#{device_id}"
126
+ else
127
+ create_flash 'warning', @device.errors.full_messages
128
+ redirect back
129
+ end
130
+ end
131
+
132
+ # devices/users/1
133
+ get '/users/:user_id' do |user_id|
134
+ user = logged_in_user
135
+
136
+ if user[:id] != user_id.to_i
137
+ create_flash 'warning', ["You don't have permission to view this page."]
138
+ redirect back
139
+ end
140
+
141
+ fail Sinatra::NotFound unless User.exists?(user_id)
142
+
143
+ # Get the user
144
+ @user = User.find(user_id)
145
+
146
+ @devices = @user.devices
147
+
148
+ erb :"devices/users", devices: @devices
149
+ end
150
+
151
+ put '/:device_id/return' do |device_id|
152
+ unid = device_id.upcase
153
+
154
+ if Device.exists?(unid: unid)
155
+ @device = Device.find_by_unid(unid)
156
+
157
+ user = @device.user
158
+
159
+ current_user = logged_in_user
160
+ if current_user[:id] == @device.user.id
161
+ report_transaction(
162
+ "#{user.email} returned #{@device.device}",
163
+ Transaction.return, @device
164
+ )
165
+ else
166
+ report_transaction(
167
+ "#{current_user[:email]} returned #{@device.device} " \
168
+ "on behalf of #{@device.user.email}",
169
+ Transaction.return,
170
+ @device
171
+ )
172
+ end
173
+
174
+ @device.user = nil
175
+ @device.available = true
176
+ @device.checked_out_since = nil
177
+
178
+ @device.save
179
+
180
+ create_flash 'success',
181
+ ['Device has been successfully returned, thank you.']
182
+ redirect back
183
+ else
184
+ create_flash 'warning', ["Device not found with id #{device_id}."]
185
+ redirect back
186
+ end
187
+ end
188
+
189
+ put '/:device_id/checkout' do |device_id|
190
+ unid = device_id.upcase
191
+
192
+ if Device.exists?(unid: unid)
193
+
194
+ @user = User.find(session[:user][:id])
195
+
196
+ device = Device.find_by_unid(unid)
197
+ device.user = @user
198
+
199
+ device.available = false
200
+ device.checked_out_since = Time.now.utc.iso8601
201
+
202
+ if device.save
203
+ report_transaction(
204
+ "#{@user.email} checked out #{device.device}.",
205
+ Transaction.checkout,
206
+ device
207
+ )
208
+
209
+ create_flash 'success',
210
+ ['Device successfully checked out.']
211
+ redirect back
212
+
213
+ else
214
+ create_flash 'warning', device.errors.full_messages
215
+ redirect back
216
+ end
217
+
218
+ end
219
+ end
220
+
221
+ # /devices/<%= @device.id %>/assign
222
+ put '/:device_id/assign' do |device_id|
223
+ admin_check
224
+
225
+ if Device.exists?(device_id)
226
+
227
+ user_id = params[:user_id]
228
+
229
+ if user_id.nil?
230
+ create_flash 'warning',
231
+ ['You must select a user to assign the device to']
232
+ redirect back
233
+ end
234
+
235
+ @current_user = User.find(session[:user][:id])
236
+ unless User.exists?(user_id)
237
+ create_flash 'danger', ["User not found with id #{user_id}"]
238
+ end
239
+
240
+ @assigned_user = User.find(user_id)
241
+
242
+ device = Device.find(device_id)
243
+ device.user = @assigned_user
244
+
245
+ device.available = false
246
+ device.checked_out_since = Time.now.utc.iso8601
247
+
248
+ if device.save
249
+ report_transaction(
250
+ "#{@current_user.email} checked out #{device.device} on " \
251
+ "behalf of #{@assigned_user.email}",
252
+ Transaction.checkout,
253
+ device
254
+ )
255
+ end
256
+
257
+ create_flash 'success',
258
+ ["Device has been assigned to #{@assigned_user.name}."]
259
+ redirect back
260
+
261
+ end
262
+ end
263
+
264
+ post '/:device_id/send_reminder' do |device_id|
265
+ admin_check
266
+
267
+ if Device.exists?(device_id)
268
+
269
+ @device = Device.find(device_id)
270
+ @device_url = request.base_url + '/devices/' + device_id
271
+
272
+ template = File.read(settings.email_path + '/reminder.erb')
273
+ body = ERB.new(template).result(binding)
274
+
275
+ send_email(
276
+ to: @device.user.email,
277
+ from: 'no-reply@device-tracker',
278
+ subject: 'Reminder | Device Tracker',
279
+ body: body
280
+ )
281
+
282
+ # Send email
283
+ create_flash 'success',
284
+ ["A reminder email has been sent to #{@device.user.name}."]
285
+ redirect "/devices/#{device_id}"
286
+
287
+ else
288
+ create_flash 'warning', ['Sorry, That device doesn\'t exists.']
289
+ redirect "/devices/#{device_id}"
290
+ end
291
+ end
292
+
293
+ get '/:device_id/edit' do |device_id|
294
+ admin_check
295
+
296
+ fail Sinatra::NotFound unless Device.exists?(device_id)
297
+
298
+ @device = Device.find(device_id)
299
+ @operating_systems = OperatingSystem.select(:name, :id)
300
+ .distinct.order(:name)
301
+
302
+ erb :"devices/edit"
303
+ end
304
+
305
+ delete '/:device_id' do |device_id|
306
+ admin_check
307
+
308
+ fail Sinatra::NotFound unless Device.exists?(device_id)
309
+
310
+ @device = Device.find(device_id).destroy
311
+ create_flash 'success', ["Deleted device #{@device.unid}"]
312
+ redirect '/devices'
313
+ end
314
+ end
315
+ end
@@ -0,0 +1,50 @@
1
+ require_relative 'application_controller'
2
+
3
+ module DeviceTracker
4
+ # :nodoc:
5
+ class HeartbeatController < ApplicationController
6
+ post '/' do
7
+ begin
8
+ heartbeat = JSON.parse(request.body.read)
9
+ rescue JSON::ParserError
10
+ halt 412, {
11
+ error: true,
12
+ message: 'Error parsing payload, check and try again.'
13
+ }.to_json
14
+ end
15
+
16
+ # {"heartbeat": {"device_id": "BBCFM003",
17
+ # "longitude": 53.470096, "latitude": -2.281457}}
18
+ if valid_heartbeat?(heartbeat)
19
+
20
+ heartbeat = heartbeat['heartbeat']
21
+
22
+ unid = heartbeat['device_id'].upcase
23
+
24
+ if Device.exists?(unid: unid)
25
+ device = Device.find_by_unid(unid)
26
+
27
+ Heartbeat.create(longitude: heartbeat['longitude'],
28
+ latitude: heartbeat['latitude'],
29
+ device_id: device.id)
30
+
31
+ halt 201, {
32
+ error: false,
33
+ message: "Heartbeat for device: #{unid} received."
34
+ }.to_json
35
+ else
36
+ halt 404, {
37
+ error: true,
38
+ message: "The device with id: #{unid} doesn't exist."
39
+ }.to_json
40
+ end
41
+
42
+ else
43
+ halt 412, {
44
+ error: true,
45
+ message: 'Manformed heartbeat received, so will not be processed.'
46
+ }.to_json
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,38 @@
1
+ require_relative 'application_controller'
2
+ module DeviceTracker
3
+ # :nodoc:
4
+ class OSController < ApplicationController
5
+ before do
6
+ admin_check
7
+ end
8
+
9
+ get '/manage' do
10
+ @os = OperatingSystem.all.order(:name)
11
+ erb :"os/manage"
12
+ end
13
+
14
+ post '/create' do
15
+ @os = OperatingSystem.create(params[:os])
16
+
17
+ if @os.valid?
18
+ @os.save
19
+ create_flash 'success', ["Successfully added #{@os.name}"]
20
+ redirect back
21
+ else
22
+ create_flash 'warning', @os.errors.full_messages
23
+ redirect back
24
+ end
25
+ end
26
+
27
+ delete '/:os_id/delete' do |os_id|
28
+ if OperatingSystem.exists?(os_id)
29
+ OperatingSystem.destroy(os_id)
30
+ create_flash 'success', ['Operating system deleted.']
31
+ redirect back
32
+ else
33
+ create_flash 'warning', ['Operating system not found.']
34
+ redirect back
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'application_controller'
2
+
3
+ module DeviceTracker
4
+ # :nodoc:
5
+ class TransactionsController < ApplicationController
6
+ get '/' do
7
+ @transactions = Transaction.limit(100).order(created_at: :desc).all
8
+
9
+ erb :"transactions/index"
10
+ end
11
+
12
+ get '/:device_id' do |device_id|
13
+ @transactions = Transaction.where(device_id: device_id)
14
+ .limit(100).order(created_at: :desc).all
15
+ erb :"transactions/index"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,131 @@
1
+ require_relative 'application_controller'
2
+
3
+ module DeviceTracker
4
+ # :nodoc:
5
+ class UsersController < ApplicationController
6
+ helpers UserHelper
7
+
8
+ before do
9
+ path = request.path_info.split('/')[1]
10
+ protected! unless %w(new create).include? path
11
+ admin_check if %w(manage).include? path
12
+ end
13
+
14
+ get '/manage' do
15
+ @users = User.all
16
+ erb :"users/manage"
17
+ end
18
+
19
+ get '/new' do
20
+ erb :"users/new"
21
+ end
22
+
23
+ get '/:user_id/edit' do |user_id|
24
+ unless allowed_to_edit_page?(logged_in_user, user_id)
25
+ flash_and_go_back 'warning',
26
+ ["You don't have permission to view this page."]
27
+ end
28
+
29
+ @current_user = logged_in_user
30
+
31
+ if User.exists?(user_id)
32
+ @user = User.find(user_id)
33
+ @is_admin = @current_user[:is_admin]
34
+ erb :"users/edit"
35
+ else
36
+ flash_and_go_back 'warning', ["Sorry, but that user doesn't exist"]
37
+ end
38
+ end
39
+
40
+ put '/:user_id' do |user_id|
41
+ unless User.exists?(user_id)
42
+ flash_and_go_back 'warning',
43
+ ['I\'m sorry but that user does not exist!']
44
+ end
45
+
46
+ user = User.find(user_id)
47
+ users_previous_verification = user.is_verified
48
+
49
+ original_params = params[:user].clone
50
+ user.assign_attributes(user_params)
51
+
52
+ if admin?
53
+ user.is_admin = (!params[:user][:is_admin].nil? &&
54
+ params[:user][:is_admin] == 'on')
55
+ user.is_verified = (!params[:user][:is_verified].nil? &&
56
+ params[:user][:is_verified] == 'on')
57
+ end
58
+
59
+ unless original_params[:password].empty?
60
+ user.password = original_params[:password]
61
+ user.password_confirmation = original_params[:password_confirmation]
62
+ end
63
+
64
+ if user.save
65
+ if user.is_verified && users_previous_verification == false
66
+ verification_email(user)
67
+ end
68
+ flash_and_go_back 'success', ['The account was successfully updated.']
69
+ else
70
+ flash_and_go_back 'warning', user.errors.full_messages
71
+ end
72
+ end
73
+
74
+ post '/create' do
75
+ user = User.new(params[:user])
76
+
77
+ user.flashable_attrs.each do |key|
78
+ flash[key] = user.send(:"#{key}")
79
+ end
80
+
81
+ if user.valid?
82
+ user.is_verified = true if admin?
83
+
84
+ user.save
85
+
86
+ if admin?
87
+ create_flash 'info', ["#{user.name}'s account has been created"]
88
+ redirect '/users/manage'
89
+ else
90
+ report_transaction(
91
+ "#{user.email} registered a new account.",
92
+ Transaction.registration
93
+ )
94
+ admin_email_registration(request, user)
95
+ create_flash 'info',
96
+ ['Success, check your email and activate your account.']
97
+ redirect '/'
98
+ end
99
+
100
+ else
101
+ flash_and_go_back 'warning', [user.errors.full_messages.first]
102
+ end
103
+ end
104
+
105
+ delete '/:user_id/delete' do |user_id|
106
+ if User.exists?(user_id)
107
+ user = User.find(user_id)
108
+
109
+ email = user.email
110
+
111
+ if user.devices.count > 0
112
+ Device.where(user_id: user.id)
113
+ .update_all(available: true, checked_out_since: nil, user_id: nil)
114
+ end
115
+
116
+ if user.destroy
117
+ report_transaction(
118
+ "#{email} was deleted by #{logged_in_user[:email]}.",
119
+ Transaction.deletion
120
+ )
121
+ end
122
+
123
+ flash_and_go_back 'success',
124
+ ['The user account has been successfully removed.']
125
+ else
126
+ flash_and_go_back 'warning',
127
+ ['Unable to remove the user account, try again.']
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,14 @@
1
+ # :nodoc:
2
+ class CreateUsers < ActiveRecord::Migration
3
+ def change
4
+ create_table :users do |t|
5
+ t.string :username, index: true
6
+ t.string :name
7
+ t.string :password_digest
8
+ t.string :email
9
+ t.boolean :is_active, default: false
10
+ t.boolean :is_admin, default: false
11
+ t.timestamps null: false
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ # :nodoc:
2
+ class CreateDevices < ActiveRecord::Migration
3
+ def change
4
+ create_table :devices do |t|
5
+ t.string :unid, index: true
6
+ t.string :manufacturer
7
+ t.string :device
8
+ t.text :description
9
+ t.datetime :checked_out_since
10
+ t.boolean :available, default: true
11
+ t.string :imei, default: nil
12
+ t.belongs_to :operating_system
13
+ t.belongs_to :user
14
+ t.boolean :sim_card, default: false
15
+ t.boolean :debug_device, default: false
16
+ t.timestamps null: false
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ # :nodoc:
2
+ class CreateOperatingSystems < ActiveRecord::Migration
3
+ def change
4
+ create_table :operating_systems do |t|
5
+ t.string :name
6
+ t.integer :api_level
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ # :nodoc:
2
+ class CreateTransactions < ActiveRecord::Migration
3
+ def change
4
+ create_table :transactions do |t|
5
+ t.string :transaction_type, index: true
6
+ t.belongs_to :user
7
+ t.belongs_to :device
8
+ t.text :description
9
+ t.datetime :created_at
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ # :nodoc:
2
+ class CreateHeartbeat < ActiveRecord::Migration
3
+ def change
4
+ create_table :heartbeats do |t|
5
+ t.decimal :longitude, precision: 10, scale: 6
6
+ t.decimal :latitude, precision: 10, scale: 6
7
+ t.belongs_to :device
8
+ t.timestamps null: false
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ # :nodoc:
2
+ class AddUserVerification < ActiveRecord::Migration
3
+ def change
4
+ change_table :users do |t|
5
+ t.boolean :is_verified, default: false
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ # :nodoc:
2
+ class RemoveIsActiveFromUsers < ActiveRecord::Migration
3
+ def change
4
+ remove_column :users, :is_active, :boolean, default: false
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ # :nodoc:
2
+ class AddPasswordResetCodeToUsers < ActiveRecord::Migration
3
+ def change
4
+ change_table :users do |t|
5
+ t.string :reset_code, default: nil
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # :nodoc:
2
+ class AddMissingColumnToDevices < ActiveRecord::Migration
3
+ def change
4
+ change_table :devices do |t|
5
+ t.boolean :missing, default: false
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # :nodoc:
2
+ class AddSerialNumberToDevices < ActiveRecord::Migration
3
+ def change
4
+ change_table :devices do |t|
5
+ t.string :serial_number
6
+ end
7
+ end
8
+ end