usman 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/api/v1/registrations_controller.rb +38 -0
- data/app/helpers/usman/api_helper.rb +5 -4
- data/app/models/device.rb +46 -0
- data/app/models/registration.rb +12 -1
- data/app/models/user.rb +12 -0
- data/app/services/usman/mobile_registration_service.rb +4 -2
- data/config/locales/usman/general.ar.yml +5 -0
- data/config/locales/usman/general.en.yml +5 -0
- data/config/locales/usman/mobile_registration.ar.yml +10 -1
- data/config/locales/usman/mobile_registration.en.yml +10 -1
- data/config/routes.rb +2 -2
- data/db/migrate/20170825020624_add_otp_verified_at_to_devices.rb +5 -0
- data/lib/usman/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 335b7ba4af0e58280de99aa7211b1d91d992de85
|
4
|
+
data.tar.gz: ea3bd4266a24ce29aa0b0602f3e7f4f89e820dda
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f269b5fc47555878826becdcdc0499a56f199ae04e46e016fb3847add390e23e74aab6aec88f9a170bacd9860b4b96acf05329c40e4cd5a49bd5c570bce4325
|
7
|
+
data.tar.gz: 3d49ae90104d363911ff1ae39a0ea017020e47b4a8abc504b0cc6ec5522c243a1eae75bb85c27e890893cf866269c8cd2deec66671102883d00f6522795d4010
|
@@ -26,12 +26,50 @@ module Api
|
|
26
26
|
|
27
27
|
def resend_otp
|
28
28
|
proc_code = Proc.new do
|
29
|
+
|
29
30
|
end
|
30
31
|
render_json_response(proc_code)
|
31
32
|
end
|
32
33
|
|
33
34
|
def verify
|
34
35
|
proc_code = Proc.new do
|
36
|
+
@device = Device.where("uuid = ?", params[:uuid]).first
|
37
|
+
if @device
|
38
|
+
if @device.blocked?
|
39
|
+
@success = false
|
40
|
+
@errors = {
|
41
|
+
heading: I18n.translate("mobile_registration.device_blocked.heading"),
|
42
|
+
message: I18n.translate("mobile_registration.device_blocked.message"),
|
43
|
+
details: {}
|
44
|
+
}
|
45
|
+
else
|
46
|
+
valid, validation_errors = @device.validate_otp(params[:otp], params[:dialing_prefix], params[:mobile_number])
|
47
|
+
if valid
|
48
|
+
@success = true
|
49
|
+
@alert = {
|
50
|
+
heading: I18n.translate("mobile_registration.verification_success.heading"),
|
51
|
+
message: I18n.translate("mobile_registration.verification_success.message")
|
52
|
+
}
|
53
|
+
@data = { api_token: @device.api_token }
|
54
|
+
else
|
55
|
+
@success = false
|
56
|
+
@errors = {
|
57
|
+
heading: I18n.translate("mobile_registration.otp_not_matching.heading"),
|
58
|
+
message: I18n.translate("mobile_registration.otp_not_matching.message"),
|
59
|
+
details: validation_errors
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
else
|
64
|
+
@success = false
|
65
|
+
@errors = {
|
66
|
+
heading: I18n.translate("general.unexpected_failure.heading"),
|
67
|
+
message: I18n.translate("general.unexpected_failure.message"),
|
68
|
+
details: {
|
69
|
+
uuid: "is invalid"
|
70
|
+
}
|
71
|
+
}
|
72
|
+
end
|
35
73
|
end
|
36
74
|
render_json_response(proc_code)
|
37
75
|
end
|
@@ -43,7 +43,8 @@ module Usman
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def embed_stack_in_json_response?
|
46
|
-
|
46
|
+
return true if Rails.env.development?
|
47
|
+
Rails.env.production? && ["true", "t", "1", "yes"].include?(params[:debug].to_s.downcase.strip)
|
47
48
|
end
|
48
49
|
|
49
50
|
## This method will accept a proc, execute it and render the json
|
@@ -55,9 +56,9 @@ module Usman
|
|
55
56
|
rescue Exception => e
|
56
57
|
@success = false
|
57
58
|
@errors = {
|
58
|
-
heading: I18n.translate("
|
59
|
-
message:
|
60
|
-
details:
|
59
|
+
heading: I18n.translate("general.unexpected_failure.heading"),
|
60
|
+
message: I18n.translate("general.unexpected_failure.message"),
|
61
|
+
details: e.message,
|
61
62
|
stacktrace: (embed_stack_in_json_response? ? e.backtrace : nil)
|
62
63
|
}
|
63
64
|
end
|
data/app/models/device.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
class Device < ApplicationRecord
|
2
2
|
|
3
3
|
# Constants
|
4
|
+
EXCLUDED_JSON_ATTRIBUTES = [:last_accessed_at, :last_accessed_api, :otp, :otp_sent_at, :api_token, :token_created_at, :status, :created_at, :updated_at]
|
5
|
+
|
4
6
|
PENDING = "pending"
|
5
7
|
VERIFIED = "verified"
|
6
8
|
BLOCKED = "blocked"
|
@@ -63,6 +65,15 @@ class Device < ApplicationRecord
|
|
63
65
|
# Instance Methods
|
64
66
|
# ------------------
|
65
67
|
|
68
|
+
# Exclude some attributes info from json output.
|
69
|
+
def as_json(options={})
|
70
|
+
options[:except] ||= EXCLUDED_JSON_ATTRIBUTES
|
71
|
+
#options[:include] ||= []
|
72
|
+
#options[:methods] = []
|
73
|
+
#options[:methods] << :profile_image
|
74
|
+
super(options)
|
75
|
+
end
|
76
|
+
|
66
77
|
# Status Methods
|
67
78
|
# --------------
|
68
79
|
|
@@ -135,6 +146,41 @@ class Device < ApplicationRecord
|
|
135
146
|
self.otp = rand(10000..99999)
|
136
147
|
end
|
137
148
|
|
149
|
+
def validate_otp(otp, dialing_prefix, mobile_number)
|
150
|
+
|
151
|
+
# Validate OTP and other parameters
|
152
|
+
validation_errors = {}
|
153
|
+
|
154
|
+
# TODO - remove 11111 after implementing Twilio
|
155
|
+
validation_errors[:otp] = "doesn't match with our database" unless (self.otp.to_s == otp.to_s || self.otp.to_s == "11111")
|
156
|
+
validation_errors[:mobile_number] = "doesn't match with our database" unless self.registration.mobile_number.to_s == mobile_number.to_s
|
157
|
+
validation_errors[:dialing_prefix] = "doesn't match with our database" unless self.registration.dialing_prefix.to_s == dialing_prefix.to_s
|
158
|
+
|
159
|
+
if validation_errors.empty?
|
160
|
+
if self.otp_verified_at.blank?
|
161
|
+
|
162
|
+
# Create API Token if OTP is verified
|
163
|
+
self.otp_verified_at = Time.now
|
164
|
+
self.api_token = SecureRandom.hex
|
165
|
+
self.token_created_at = Time.now
|
166
|
+
self.save
|
167
|
+
|
168
|
+
self.verify!
|
169
|
+
self.registration.verify!
|
170
|
+
|
171
|
+
return true, {}
|
172
|
+
else
|
173
|
+
|
174
|
+
# Check if this OTP was already verified
|
175
|
+
validation_errors[:otp_verified_at] = "This OTP was already used."
|
176
|
+
|
177
|
+
return false, validation_errors
|
178
|
+
end
|
179
|
+
else
|
180
|
+
return false, validation_errors
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
138
184
|
# Other Methods
|
139
185
|
# -------------
|
140
186
|
|
data/app/models/registration.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
class Registration < ApplicationRecord
|
2
2
|
|
3
3
|
# Constants
|
4
|
+
EXCLUDED_JSON_ATTRIBUTES = [:status, :created_at, :updated_at]
|
5
|
+
|
4
6
|
PENDING = "pending"
|
5
7
|
VERIFIED = "verified"
|
6
8
|
|
@@ -15,7 +17,7 @@ class Registration < ApplicationRecord
|
|
15
17
|
}
|
16
18
|
|
17
19
|
# Associations
|
18
|
-
|
20
|
+
belongs_to :user, optional: true
|
19
21
|
belongs_to :country
|
20
22
|
belongs_to :city, optional: true
|
21
23
|
has_many :devices
|
@@ -46,6 +48,15 @@ class Registration < ApplicationRecord
|
|
46
48
|
# Instance Methods
|
47
49
|
# ------------------
|
48
50
|
|
51
|
+
# Exclude some attributes info from json output.
|
52
|
+
def as_json(options={})
|
53
|
+
options[:except] ||= EXCLUDED_JSON_ATTRIBUTES
|
54
|
+
#options[:include] ||= []
|
55
|
+
#options[:methods] = []
|
56
|
+
#options[:methods] << :profile_image
|
57
|
+
super(options)
|
58
|
+
end
|
59
|
+
|
49
60
|
# Status Methods
|
50
61
|
# --------------
|
51
62
|
|
data/app/models/user.rb
CHANGED
@@ -4,6 +4,9 @@ class User < Usman::ApplicationRecord
|
|
4
4
|
has_secure_password
|
5
5
|
|
6
6
|
# Constants
|
7
|
+
|
8
|
+
EXCLUDED_JSON_ATTRIBUTES = [:confirmation_token, :password_digest, :reset_password_token, :unlock_token, :status, :reset_password_sent_at, :remember_created_at, :sign_in_count, :current_sign_in_at, :last_sign_in_at, :current_sign_in_ip, :last_sign_in_ip, :confirmed_at, :confirmation_sent_at, :unconfirmed_email, :failed_attempts, :locked_at, :created_at, :updated_at]
|
9
|
+
|
7
10
|
PENDING = "pending"
|
8
11
|
APPROVED = "approved"
|
9
12
|
SUSPENDED = "suspended"
|
@@ -48,6 +51,15 @@ class User < Usman::ApplicationRecord
|
|
48
51
|
# Class Methods
|
49
52
|
# ------------------
|
50
53
|
|
54
|
+
# Exclude some attributes info from json output.
|
55
|
+
def as_json(options={})
|
56
|
+
options[:except] ||= EXCLUDED_JSON_ATTRIBUTES
|
57
|
+
#options[:include] ||= []
|
58
|
+
#options[:methods] = []
|
59
|
+
#options[:methods] << :profile_image
|
60
|
+
super(options)
|
61
|
+
end
|
62
|
+
|
51
63
|
# Scopes Methods
|
52
64
|
|
53
65
|
# return an active record relation object with the search query in its where clause
|
@@ -13,6 +13,8 @@ module Usman
|
|
13
13
|
@dialing_prefix = params[:dialing_prefix]
|
14
14
|
@mobile_number = params[:mobile_number]
|
15
15
|
|
16
|
+
@country = nil
|
17
|
+
@city = nil
|
16
18
|
@country = Country.find_by_id(params[:country_id])
|
17
19
|
@city = City.find_by_id(params[:city_id])
|
18
20
|
|
@@ -50,8 +52,8 @@ module Usman
|
|
50
52
|
def check_if_device_is_already_registered
|
51
53
|
@registration = Registration.where("LOWER(mobile_number) = LOWER('#{@mobile_number}')").first
|
52
54
|
if @registration
|
53
|
-
@
|
54
|
-
@
|
55
|
+
@registration.country = @country
|
56
|
+
@registration.city = @city
|
55
57
|
end
|
56
58
|
@device = Device.where("LOWER(uuid) = LOWER('#{@uuid}')").first if @registration
|
57
59
|
end
|
@@ -11,4 +11,13 @@ en:
|
|
11
11
|
message: "Check your mobile for new message from us."
|
12
12
|
otp_not_sent:
|
13
13
|
heading: "OTP was not sent"
|
14
|
-
message: "There was some technical glitch and OTP was not sent. Try after some time."
|
14
|
+
message: "There was some technical glitch and OTP was not sent. Try after some time."
|
15
|
+
otp_not_matching:
|
16
|
+
heading: "OTP verification was failed"
|
17
|
+
message: "Make sure that you enter the OTP correctly."
|
18
|
+
verification_failed:
|
19
|
+
heading: "OTP verification was failed"
|
20
|
+
message: "Check if you have properly given the OTP along with dialing prefix, mobile number & UUID"
|
21
|
+
verification_success:
|
22
|
+
heading: "OTP was verified succesfully"
|
23
|
+
message: "Store and use the API token for further communication"
|
@@ -11,4 +11,13 @@ en:
|
|
11
11
|
message: "Check your mobile for new message from us."
|
12
12
|
otp_not_sent:
|
13
13
|
heading: "OTP was not sent"
|
14
|
-
message: "There was some technical glitch and OTP was not sent. Try after some time."
|
14
|
+
message: "There was some technical glitch and OTP was not sent. Try after some time."
|
15
|
+
otp_not_matching:
|
16
|
+
heading: "OTP verification was failed"
|
17
|
+
message: "Make sure that you enter the OTP correctly."
|
18
|
+
verification_failed:
|
19
|
+
heading: "OTP verification was failed"
|
20
|
+
message: "Check if you have properly given the OTP along with dialing prefix, mobile number & UUID"
|
21
|
+
verification_success:
|
22
|
+
heading: "OTP was verified succesfully"
|
23
|
+
message: "Store and use the API token for further communication"
|
data/config/routes.rb
CHANGED
@@ -38,8 +38,8 @@ Usman::Engine.routes.draw do
|
|
38
38
|
namespace :api do
|
39
39
|
namespace :v1 do
|
40
40
|
post :register, :controller => "/api/v1/registrations"
|
41
|
-
|
42
|
-
|
41
|
+
post :resend_otp, :controller => "/api/v1/registrations"
|
42
|
+
post :verify, :controller => "/api/v1/registrations"
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
data/lib/usman/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: usman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kpvarma
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -413,6 +413,8 @@ files:
|
|
413
413
|
- app/views/usman/users/index.html.erb
|
414
414
|
- config/locales/usman/authentication.ar.yml
|
415
415
|
- config/locales/usman/authentication.en.yml
|
416
|
+
- config/locales/usman/general.ar.yml
|
417
|
+
- config/locales/usman/general.en.yml
|
416
418
|
- config/locales/usman/mobile_registration.ar.yml
|
417
419
|
- config/locales/usman/mobile_registration.en.yml
|
418
420
|
- config/routes.rb
|
@@ -431,6 +433,7 @@ files:
|
|
431
433
|
- db/migrate/20170819113217_create_registrations.rb
|
432
434
|
- db/migrate/20170819113218_add_registration_id_to_users.rb
|
433
435
|
- db/migrate/20170819113219_create_devices.rb
|
436
|
+
- db/migrate/20170825020624_add_otp_verified_at_to_devices.rb
|
434
437
|
- lib/tasks/usman/data.rake
|
435
438
|
- lib/tasks/usman/master_data.rake
|
436
439
|
- lib/temp/features.rake
|