device-tracker 0.1.0

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