usman 0.2.11 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/usman/api/v1/docs_controller.rb +84 -0
- data/app/controllers/usman/api/v1/profile_controller.rb +27 -2
- data/app/controllers/usman/api/v1/profile_picture_controller.rb +178 -0
- data/app/serializers/profile_picture_serializer.rb +19 -0
- data/app/serializers/profile_serializer.rb +6 -0
- data/app/uploaders/feature_image_uploader.rb +1 -0
- data/app/uploaders/profile_picture_uploader.rb +4 -0
- data/app/views/kuppayam/api/docs/_navigation.html.erb +24 -0
- data/app/views/usman/api/v1/docs/base64_profile_picture/_neg_case_1.html.erb +27 -0
- data/app/views/usman/api/v1/docs/base64_profile_picture/_neg_case_2.html.erb +28 -0
- data/app/views/usman/api/v1/docs/base64_profile_picture/_pos_case_1.html.erb +36 -0
- data/app/views/usman/api/v1/docs/create_profile/_pos_case_1.html.erb +15 -14
- data/app/views/usman/api/v1/docs/destroy_profile_picture/_neg_case_1.html.erb +27 -0
- data/app/views/usman/api/v1/docs/destroy_profile_picture/_neg_case_2.html.erb +27 -0
- data/app/views/usman/api/v1/docs/destroy_profile_picture/_pos_case_1.html.erb +27 -0
- data/app/views/usman/api/v1/docs/profile/_neg_case_1.html.erb +34 -0
- data/app/views/usman/api/v1/docs/profile/_neg_case_2.html.erb +27 -0
- data/app/views/usman/api/v1/docs/profile/_pos_case_1.html.erb +39 -0
- data/app/views/usman/api/v1/docs/profile_picture/_neg_case_1.html.erb +27 -0
- data/app/views/usman/api/v1/docs/profile_picture/_neg_case_2.html.erb +28 -0
- data/app/views/usman/api/v1/docs/profile_picture/_neg_case_3.html.erb +27 -0
- data/app/views/usman/api/v1/docs/profile_picture/_pos_case_1.html.erb +36 -0
- data/app/views/usman/api/v1/docs/update_profile/_neg_case_2.html.erb +3 -10
- data/app/views/usman/api/v1/docs/update_profile/_neg_case_3.html.erb +1 -1
- data/app/views/usman/api/v1/docs/update_profile/_pos_case_1.html.erb +7 -13
- data/app/views/usman/api/v1/docs/verify_otp/_pos_case_2.html.erb +2 -1
- data/config/locales/usman/api.en.yml +20 -1
- data/config/routes.rb +12 -0
- data/lib/usman/version.rb +1 -1
- metadata +65 -24
- data/app/uploaders/image_uploader.rb +0 -90
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da4ef048a641f75ac91c9ebcb697cd43c6f7fd9b
|
4
|
+
data.tar.gz: 53085820d81ef576b6b40b3a753d0d18fb40e039
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1df87664bbe20cc17acf9814461719b98b4d74a2748faa9f3a0b9f0cc7cc20af53970c84043642310a87f797a1fb17c678d7738f2c018476c76212b3796a6aec
|
7
|
+
data.tar.gz: 1bb119d7386e8429368050aef3cf5c2463bc79a4b593546fc451ed110da28ee32f8d4ced1fb59dd990973d5c718198377cb4f08ac24c1dfae516061026be7a9e
|
@@ -161,6 +161,90 @@ module Usman
|
|
161
161
|
render 'kuppayam/api/docs/show'
|
162
162
|
end
|
163
163
|
|
164
|
+
def profile
|
165
|
+
set_title("Profile API")
|
166
|
+
@request_type = "GET"
|
167
|
+
@end_point = "/api/v1/profile/base64_profile_picture"
|
168
|
+
@description = "This API will return the details of the profile requested including image urls."
|
169
|
+
|
170
|
+
@input_headers = {
|
171
|
+
"Content-Type" => { value: "application/json", description: "The MIME media type for JSON text is application/json. This is to make sure that a valid json is returned. The default encoding is UTF-8. " },
|
172
|
+
"Authorization" => { value: "Token token=\"87b01adbba90824b57add8cc06ad8738\"", description: "Put the API Token here. You shall get the API token after registering your device" }
|
173
|
+
}
|
174
|
+
|
175
|
+
@input_params = {}
|
176
|
+
|
177
|
+
@example_path = "usman/api/v1/docs/"
|
178
|
+
@examples = ["pos_case_1", "neg_case_1", "neg_case_2"]
|
179
|
+
|
180
|
+
set_nav("docs/profile")
|
181
|
+
|
182
|
+
render 'kuppayam/api/docs/show'
|
183
|
+
end
|
184
|
+
|
185
|
+
def base64_profile_picture
|
186
|
+
set_title("Upload Profile Picture API (base64)")
|
187
|
+
@request_type = "POST"
|
188
|
+
@end_point = "/api/v1/profile/base64_profile_picture"
|
189
|
+
@description = "This API will return the details of the profile requested including image urls."
|
190
|
+
|
191
|
+
@input_headers = {
|
192
|
+
"Content-Type" => { value: "application/json", description: "The MIME media type for JSON text is application/json. This is to make sure that a valid json is returned. The default encoding is UTF-8. " },
|
193
|
+
"Authorization" => { value: "Token token=\"87b01adbba90824b57add8cc06ad8738\"", description: "Put the API Token here. You shall get the API token after registering your device" }
|
194
|
+
}
|
195
|
+
|
196
|
+
@input_params = {}
|
197
|
+
|
198
|
+
@example_path = "usman/api/v1/docs/"
|
199
|
+
@examples = ["pos_case_1", "neg_case_1", "neg_case_2"]
|
200
|
+
|
201
|
+
set_nav("docs/base64_profile_picture")
|
202
|
+
|
203
|
+
render 'kuppayam/api/docs/show'
|
204
|
+
end
|
205
|
+
|
206
|
+
def profile_picture
|
207
|
+
set_title("Upload Profile Picture API")
|
208
|
+
@request_type = "POST"
|
209
|
+
@end_point = "/api/v1/profile/profile_picture"
|
210
|
+
@description = "This API will return the details of the profile requested including image urls."
|
211
|
+
|
212
|
+
@input_headers = {
|
213
|
+
"Content-Type" => { value: "application/json", description: "The MIME media type for JSON text is application/json. This is to make sure that a valid json is returned. The default encoding is UTF-8. " },
|
214
|
+
"Authorization" => { value: "Token token=\"87b01adbba90824b57add8cc06ad8738\"", description: "Put the API Token here. You shall get the API token after registering your device" }
|
215
|
+
}
|
216
|
+
|
217
|
+
@input_params = {}
|
218
|
+
|
219
|
+
@example_path = "usman/api/v1/docs/"
|
220
|
+
@examples = ["pos_case_1", "neg_case_1", "neg_case_2", "neg_case_3"]
|
221
|
+
|
222
|
+
set_nav("docs/profile_picture")
|
223
|
+
|
224
|
+
render 'kuppayam/api/docs/show'
|
225
|
+
end
|
226
|
+
|
227
|
+
def destroy_profile_picture
|
228
|
+
set_title("Delete Profile Picture API")
|
229
|
+
@request_type = "DELETE"
|
230
|
+
@end_point = "/api/v1/profile"
|
231
|
+
@description = "This API will return the details of the profile requested including image urls."
|
232
|
+
|
233
|
+
@input_headers = {
|
234
|
+
"Content-Type" => { value: "application/json", description: "The MIME media type for JSON text is application/json. This is to make sure that a valid json is returned. The default encoding is UTF-8. " },
|
235
|
+
"Authorization" => { value: "Token token=\"87b01adbba90824b57add8cc06ad8738\"", description: "Put the API Token here. You shall get the API token after registering your device" }
|
236
|
+
}
|
237
|
+
|
238
|
+
@input_params = {}
|
239
|
+
|
240
|
+
@example_path = "usman/api/v1/docs/"
|
241
|
+
@examples = ["pos_case_1", "neg_case_1", "neg_case_2", "neg_case_3"]
|
242
|
+
|
243
|
+
set_nav("docs/destroy_profile_picture")
|
244
|
+
|
245
|
+
render 'kuppayam/api/docs/show'
|
246
|
+
end
|
247
|
+
|
164
248
|
end
|
165
249
|
end
|
166
250
|
end
|
@@ -38,7 +38,7 @@ module Usman
|
|
38
38
|
heading: I18n.translate("api.profile.profile_created.heading"),
|
39
39
|
message: I18n.translate("api.profile.profile_created.message")
|
40
40
|
}
|
41
|
-
@data =
|
41
|
+
@data = ActiveModelSerializers::SerializableResource.new(@user, serializer: ProfileSerializer)
|
42
42
|
else
|
43
43
|
@success = false
|
44
44
|
@errors = {
|
@@ -91,7 +91,7 @@ module Usman
|
|
91
91
|
heading: I18n.translate("api.profile.profile_created.heading"),
|
92
92
|
message: I18n.translate("api.profile.profile_created.message")
|
93
93
|
}
|
94
|
-
@data =
|
94
|
+
@data = ActiveModelSerializers::SerializableResource.new(@user, serializer: ProfileSerializer)
|
95
95
|
else
|
96
96
|
@success = false
|
97
97
|
@errors = {
|
@@ -112,6 +112,31 @@ module Usman
|
|
112
112
|
render_json_response(proc_code)
|
113
113
|
end
|
114
114
|
|
115
|
+
def profile
|
116
|
+
proc_code = Proc.new do
|
117
|
+
if @current_registration
|
118
|
+
unless @current_user
|
119
|
+
@success = false
|
120
|
+
@errors = {
|
121
|
+
heading: I18n.translate("api.profile.user_does_not_exists.heading"),
|
122
|
+
message: I18n.translate("api.profile.user_does_not_exists.message")
|
123
|
+
}
|
124
|
+
else
|
125
|
+
@current_user
|
126
|
+
@success = true
|
127
|
+
@data = ActiveModelSerializers::SerializableResource.new(@current_user, serializer: ProfileSerializer)
|
128
|
+
end
|
129
|
+
else
|
130
|
+
@success = false
|
131
|
+
@errors = {
|
132
|
+
heading: I18n.translate("api.profile.registration_details_missing.heading"),
|
133
|
+
message: I18n.translate("api.profile.registration_details_missing.message")
|
134
|
+
}
|
135
|
+
end
|
136
|
+
end
|
137
|
+
render_json_response(proc_code)
|
138
|
+
end
|
139
|
+
|
115
140
|
private
|
116
141
|
|
117
142
|
def permitted_params
|
@@ -0,0 +1,178 @@
|
|
1
|
+
module Usman
|
2
|
+
module Api
|
3
|
+
module V1
|
4
|
+
class ProfilePictureController < BaseController
|
5
|
+
|
6
|
+
include ImageUploaderHelper
|
7
|
+
|
8
|
+
def base64_profile_picture
|
9
|
+
proc_code = Proc.new do
|
10
|
+
if @current_registration
|
11
|
+
unless @current_user
|
12
|
+
@success = false
|
13
|
+
@errors = {
|
14
|
+
heading: I18n.translate("api.profile.user_does_not_exists.heading"),
|
15
|
+
message: I18n.translate("api.profile.user_does_not_exists.message")
|
16
|
+
}
|
17
|
+
else
|
18
|
+
user_image = @current_user.profile_picture || Image::ProfilePicture.new(imageable: @current_user)
|
19
|
+
begin
|
20
|
+
if params[:image] && !params[:image].blank?
|
21
|
+
user_image.image = image_params[:image_path]
|
22
|
+
user_image.valid?
|
23
|
+
if user_image.errors.any?
|
24
|
+
@success = false
|
25
|
+
@errors = {
|
26
|
+
heading: I18n.translate("api.profile_picture.image_save_failed.heading"),
|
27
|
+
message: I18n.translate("api.profile_picture.image_save_failed.message"),
|
28
|
+
details: user_image.errors.full_messages
|
29
|
+
}
|
30
|
+
else
|
31
|
+
@success = true
|
32
|
+
@alert = {
|
33
|
+
heading: I18n.translate("api.profile_picture.image_saved.heading"),
|
34
|
+
message: I18n.translate("api.profile_picture.image_saved.message")
|
35
|
+
}
|
36
|
+
@data = ActiveModelSerializers::SerializableResource.new(user_image, serializer: ProfilePictureSerializer)
|
37
|
+
user_image.save
|
38
|
+
end
|
39
|
+
else
|
40
|
+
@success = false
|
41
|
+
@errors = {
|
42
|
+
heading: I18n.translate("api.profile_picture.image_save_failed.heading"),
|
43
|
+
message: I18n.translate("api.profile_picture.image_save_failed.message"),
|
44
|
+
details: "Image can't be blank"
|
45
|
+
}
|
46
|
+
end
|
47
|
+
rescue Exception => e
|
48
|
+
@success = false
|
49
|
+
@errors = {
|
50
|
+
heading: I18n.translate("api.profile_picture.image_save_failed.heading"),
|
51
|
+
message: I18n.translate("api.profile_picture.image_save_failed.message"),
|
52
|
+
details: "Unable to parse the base64 image data"
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
else
|
57
|
+
@success = false
|
58
|
+
@errors = {
|
59
|
+
heading: I18n.translate("api.profile.registration_details_missing.heading"),
|
60
|
+
message: I18n.translate("api.profile.registration_details_missing.message")
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
render_json_response(proc_code)
|
65
|
+
end
|
66
|
+
|
67
|
+
def profile_picture
|
68
|
+
proc_code = Proc.new do
|
69
|
+
if @current_registration
|
70
|
+
unless @current_user
|
71
|
+
@success = false
|
72
|
+
@errors = {
|
73
|
+
heading: I18n.translate("api.profile.user_does_not_exists.heading"),
|
74
|
+
message: I18n.translate("api.profile.user_does_not_exists.message")
|
75
|
+
}
|
76
|
+
else
|
77
|
+
user_image = @current_user.profile_picture || Image::ProfilePicture.new(imageable: @current_user)
|
78
|
+
begin
|
79
|
+
if params[:image] && !params[:image].blank?
|
80
|
+
user_image.image = params[:image]
|
81
|
+
user_image.valid?
|
82
|
+
if user_image.errors.any?
|
83
|
+
@success = false
|
84
|
+
@errors = {
|
85
|
+
heading: I18n.translate("api.profile_picture.image_save_failed.heading"),
|
86
|
+
message: I18n.translate("api.profile_picture.image_save_failed.message"),
|
87
|
+
details: user_image.errors.full_messages
|
88
|
+
}
|
89
|
+
else
|
90
|
+
@success = true
|
91
|
+
@alert = {
|
92
|
+
heading: I18n.translate("api.profile_picture.image_saved.heading"),
|
93
|
+
message: I18n.translate("api.profile_picture.image_saved.message")
|
94
|
+
}
|
95
|
+
@data = ActiveModelSerializers::SerializableResource.new(user_image, serializer: ProfilePictureSerializer)
|
96
|
+
user_image.save
|
97
|
+
end
|
98
|
+
else
|
99
|
+
@success = false
|
100
|
+
@errors = {
|
101
|
+
heading: I18n.translate("api.profile_picture.image_save_failed.heading"),
|
102
|
+
message: I18n.translate("api.profile_picture.image_save_failed.message"),
|
103
|
+
details: "Image can't be blank"
|
104
|
+
}
|
105
|
+
end
|
106
|
+
rescue Exception => e
|
107
|
+
@success = false
|
108
|
+
@errors = {
|
109
|
+
heading: I18n.translate("api.profile_picture.image_save_failed.heading"),
|
110
|
+
message: I18n.translate("api.profile_picture.image_save_failed.message"),
|
111
|
+
details: "Unable to parse the base64 image data"
|
112
|
+
}
|
113
|
+
end
|
114
|
+
end
|
115
|
+
else
|
116
|
+
@success = false
|
117
|
+
@errors = {
|
118
|
+
heading: I18n.translate("api.profile.registration_details_missing.heading"),
|
119
|
+
message: I18n.translate("api.profile.registration_details_missing.message")
|
120
|
+
}
|
121
|
+
end
|
122
|
+
end
|
123
|
+
render_json_response(proc_code)
|
124
|
+
end
|
125
|
+
|
126
|
+
def destroy_profile_picture
|
127
|
+
proc_code = Proc.new do
|
128
|
+
if @current_registration
|
129
|
+
unless @current_user
|
130
|
+
@success = false
|
131
|
+
@errors = {
|
132
|
+
heading: I18n.translate("api.profile.user_does_not_exists.heading"),
|
133
|
+
message: I18n.translate("api.profile.user_does_not_exists.message")
|
134
|
+
}
|
135
|
+
else
|
136
|
+
user_image = @current_user.profile_picture
|
137
|
+
unless user_image
|
138
|
+
@success = false
|
139
|
+
@errors = {
|
140
|
+
heading: I18n.translate("api.profile_picture.profile_picture_does_not_exists.heading"),
|
141
|
+
message: I18n.translate("api.profile_picture.profile_picture_does_not_exists.message")
|
142
|
+
}
|
143
|
+
else
|
144
|
+
begin
|
145
|
+
@success = true
|
146
|
+
@alert = {
|
147
|
+
heading: I18n.translate("api.profile_picture.image_deleted.heading"),
|
148
|
+
message: I18n.translate("api.profile_picture.image_deleted.message")
|
149
|
+
}
|
150
|
+
user_image.destroy
|
151
|
+
rescue Exception => e
|
152
|
+
@success = false
|
153
|
+
@errors = {
|
154
|
+
heading: I18n.translate("api.profile_picture.image_delete_failed.heading"),
|
155
|
+
message: I18n.translate("api.profile_picture.image_delete_failed.message"),
|
156
|
+
details: "Unable to parse the base64 image data"
|
157
|
+
}
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
else
|
162
|
+
@success = false
|
163
|
+
@errors = {
|
164
|
+
heading: I18n.translate("api.profile.registration_details_missing.heading"),
|
165
|
+
message: I18n.translate("api.profile.registration_details_missing.message")
|
166
|
+
}
|
167
|
+
end
|
168
|
+
end
|
169
|
+
render_json_response(proc_code)
|
170
|
+
end
|
171
|
+
|
172
|
+
private
|
173
|
+
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class ProfilePictureSerializer < ActiveModel::Serializer
|
2
|
+
include NullAttributeReplacer
|
3
|
+
|
4
|
+
attributes :id, :created_at, :profile_id
|
5
|
+
attributes :image_large_path, :image_small_path
|
6
|
+
|
7
|
+
def profile_id
|
8
|
+
object.imageable_id
|
9
|
+
end
|
10
|
+
|
11
|
+
def image_large_path
|
12
|
+
object.image_url :large
|
13
|
+
end
|
14
|
+
|
15
|
+
def image_small_path
|
16
|
+
object.image_url :small
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -35,6 +35,30 @@
|
|
35
35
|
<span class="hidden-xs">Update Profile</span>
|
36
36
|
</a>
|
37
37
|
</li>
|
38
|
+
<li class="<%= nav_active?('docs/profile') ? 'active' : '' %>">
|
39
|
+
<a href="/docs/api/v1/profile">
|
40
|
+
<i class="fa-globe visible-xs"></i>
|
41
|
+
<span class="hidden-xs">Profile</span>
|
42
|
+
</a>
|
43
|
+
</li>
|
44
|
+
<li class="<%= nav_active?('docs/base64_profile_picture') ? 'active' : '' %>">
|
45
|
+
<a href="/docs/api/v1/base64_profile_picture">
|
46
|
+
<i class="fa-globe visible-xs"></i>
|
47
|
+
<span class="hidden-xs">Upload Profile Picture (Base64)</span>
|
48
|
+
</a>
|
49
|
+
</li>
|
50
|
+
<li class="<%= nav_active?('docs/profile_picture') ? 'active' : '' %>">
|
51
|
+
<a href="/docs/api/v1/profile_picture">
|
52
|
+
<i class="fa-globe visible-xs"></i>
|
53
|
+
<span class="hidden-xs">Upload Profile Picture</span>
|
54
|
+
</a>
|
55
|
+
</li>
|
56
|
+
<li class="<%= nav_active?('docs/destroy_profile_picture') ? 'active' : '' %>">
|
57
|
+
<a href="/docs/api/v1/destroy_profile_picture">
|
58
|
+
<i class="fa-globe visible-xs"></i>
|
59
|
+
<span class="hidden-xs">Delete Profile Picture</span>
|
60
|
+
</a>
|
61
|
+
</li>
|
38
62
|
</ul>
|
39
63
|
|
40
64
|
<style type="text/css">
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<%
|
2
|
+
|
3
|
+
api_title = "Negative Case - 1 - should set proper errors if no api token"
|
4
|
+
|
5
|
+
api_input = <<-eos
|
6
|
+
{}
|
7
|
+
eos
|
8
|
+
|
9
|
+
api_output = <<-eos
|
10
|
+
{
|
11
|
+
"success": false,
|
12
|
+
"errors": {
|
13
|
+
"heading": "Invalid API Token",
|
14
|
+
"message": "Use the API Token you have received after accepting the terms and agreement"
|
15
|
+
}
|
16
|
+
}
|
17
|
+
eos
|
18
|
+
|
19
|
+
%>
|
20
|
+
|
21
|
+
<%= render partial: "kuppayam/api/docs/example", locals: {
|
22
|
+
negative_case: true,
|
23
|
+
example_id: "neg_case_1",
|
24
|
+
api_title: api_title,
|
25
|
+
api_input: api_input,
|
26
|
+
api_output: api_output
|
27
|
+
} %>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<%
|
2
|
+
|
3
|
+
api_title = "Negative Case - 1 - should respond with proper errors for invalid arguments"
|
4
|
+
|
5
|
+
api_input = <<-eos
|
6
|
+
{}
|
7
|
+
eos
|
8
|
+
|
9
|
+
api_output = <<-eos
|
10
|
+
{
|
11
|
+
"success": false,
|
12
|
+
"errors": {
|
13
|
+
"heading": "Saving user/profile image was failed",
|
14
|
+
"message": "Make sure that the arguments are passed according to the API documentation. Please check the API Documentation for more details.",
|
15
|
+
"details": "Image can't be blank"
|
16
|
+
}
|
17
|
+
}
|
18
|
+
eos
|
19
|
+
|
20
|
+
%>
|
21
|
+
|
22
|
+
<%= render partial: "kuppayam/api/docs/example", locals: {
|
23
|
+
negative_case: true,
|
24
|
+
example_id: "neg_case_2",
|
25
|
+
api_title: api_title,
|
26
|
+
api_input: api_input,
|
27
|
+
api_output: api_output
|
28
|
+
} %>
|