cloudrider 0.3.21 → 0.3.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/generica/Gemfile +1 -1
  3. data/generica/Gemfile.lock +91 -51
  4. data/generica/app/assets/javascripts/components/product-display.js.em +4 -1
  5. data/generica/app/assets/javascripts/components/product-listing.js.em +4 -1
  6. data/generica/app/assets/javascripts/components/site-footer.js.em +12 -0
  7. data/generica/app/assets/javascripts/components/site-nav.js.em +15 -0
  8. data/generica/app/assets/javascripts/config/router.js.ls +18 -2
  9. data/generica/app/assets/javascripts/controllers/modals/fork_controller.js.em +4 -0
  10. data/generica/app/assets/javascripts/controllers/modals/login_controller.js.em +1 -4
  11. data/generica/app/assets/javascripts/controllers/modals/register_controller.js.em +1 -1
  12. data/generica/app/assets/javascripts/controllers/users/contact/edit_controller.js.em +16 -0
  13. data/generica/app/assets/javascripts/controllers/users/contacts/index_controller.js.em +21 -0
  14. data/generica/app/assets/javascripts/controllers/users/contacts/new_controller.js.em +16 -0
  15. data/generica/app/assets/javascripts/controllers/users/index_controller.js.em +19 -0
  16. data/generica/app/assets/javascripts/models/contact.js.em +11 -0
  17. data/generica/app/assets/javascripts/routes/users/contact_route.js.em +3 -0
  18. data/generica/app/assets/javascripts/routes/users/contacts/index_route.js.em +7 -0
  19. data/generica/app/assets/javascripts/routes/users/contacts/new_route.js.em +3 -0
  20. data/generica/app/assets/javascripts/routes/users/index_route.js.em +3 -0
  21. data/generica/app/assets/javascripts/templates/components/site-footer.emblem +18 -9
  22. data/generica/app/assets/javascripts/templates/users.emblem +11 -3
  23. data/generica/app/assets/javascripts/templates/users/contact/edit.emblem +16 -0
  24. data/generica/app/assets/javascripts/templates/users/contacts/_form-core.emblem +19 -0
  25. data/generica/app/assets/javascripts/templates/users/contacts/index.emblem +62 -0
  26. data/generica/app/assets/javascripts/templates/users/contacts/new.emblem +16 -0
  27. data/generica/app/assets/javascripts/templates/users/index.emblem +36 -2
  28. data/generica/app/assets/stylesheets/apiv1/components/_product-display.css.scss +7 -2
  29. data/generica/app/assets/stylesheets/apiv1/shared/_constants.css.scss +3 -0
  30. data/generica/app/controllers/apiv1/contacts/create_controller.rb +26 -0
  31. data/generica/app/controllers/apiv1/contacts/destroy_controller.rb +9 -0
  32. data/generica/app/controllers/apiv1/contacts/index_controller.rb +27 -0
  33. data/generica/app/controllers/apiv1/contacts/show_controller.rb +9 -0
  34. data/generica/app/controllers/apiv1/contacts/update_controller.rb +51 -0
  35. data/generica/app/controllers/apiv1/products/destroy_controller.rb +1 -1
  36. data/generica/app/models/admin/user.rb +20 -1
  37. data/generica/app/models/apiv1/user_contact.rb +51 -0
  38. data/generica/app/varissets/javascripts/templates/components/product-display.emblem.erb +34 -40
  39. data/generica/app/varissets/javascripts/templates/components/product-listing.emblem.erb +24 -16
  40. data/generica/app/varissets/javascripts/templates/components/site-nav.emblem.erb +12 -2
  41. data/generica/app/varissets/stylesheets/apiv1/components/_product-display.css.scss.erb +68 -31
  42. data/generica/app/varissets/stylesheets/apiv1/components/_product-listing.css.scss.erb +52 -14
  43. data/generica/config/routes.rb +5 -0
  44. data/generica/db/migrate/20141209185352_create_apiv1_user_contacts.rb +14 -0
  45. data/generica/spec/controllers/apiv1/contacts/update_controller_spec.rb +59 -0
  46. data/generica/spec/factories/admin/user_factory.rb +22 -4
  47. data/generica/spec/models/apiv1/user_contact_spec.rb +70 -0
  48. data/lib/cloudrider/version.rb +1 -1
  49. metadata +25 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 088ae68a4eca11260a60843b241dce38eb9074a6
4
- data.tar.gz: 86a4b4eee6817a359c1f83c3ce4e6a7cadd34dfe
3
+ metadata.gz: 9fcfb4633e2558a041466937f836ba50ce063168
4
+ data.tar.gz: 390f69c4c086a0d04ec6c4e3dfbaacd3060ba014
5
5
  SHA512:
6
- metadata.gz: 5a045aedd738cbb8eccbb4c80d592f87fa581930dc2b208a95cca1fb934551922394fc36c62fab957144b581d18fde6a7435435bca72f0843ea43291ce3df499
7
- data.tar.gz: 155c134d30344e4be430e912cee358c0e8dcac421818216c1d4413e9126894a136fb834396ae5763c08f058009ef84585c8e2bf78302e4474a4323d279a8d1bd
6
+ metadata.gz: 3bdc1d45f1b8cdfa9f0aa304fc9933e85a59c82019fbec8969e319ba10f172f909c959c974cb2312ede046af2440d08254260a3dbbe52dbffff9a30bbedc97cd
7
+ data.tar.gz: fea6c1ef0c6d3ceb482a4530fcd8b2a7411f614e0e516ecd547fc2475e0bd3da28a6e4fe96ef30ef1d83ec020b51a2964ac9190c12297763eede22794a49a448
@@ -18,7 +18,7 @@ gem 'paranoia', '~> 2.0.2'
18
18
  gem 'premailer-rails', '~> 1.8.0'
19
19
  gem 'gmail', '~> 0.4.2'
20
20
  gem 'god', '~> 0.13.4'
21
- gem 'arrows', '>= 0.0.2'
21
+ gem 'arrows', '>= 0.0.6'
22
22
 
23
23
  # Support
24
24
  gem "haml", "~> 4.0.0"
@@ -1,38 +1,41 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- actionmailer (4.1.6)
5
- actionpack (= 4.1.6)
6
- actionview (= 4.1.6)
4
+ actionmailer (4.1.8)
5
+ actionpack (= 4.1.8)
6
+ actionview (= 4.1.8)
7
7
  mail (~> 2.5, >= 2.5.4)
8
- actionpack (4.1.6)
9
- actionview (= 4.1.6)
10
- activesupport (= 4.1.6)
8
+ actionpack (4.1.8)
9
+ actionview (= 4.1.8)
10
+ activesupport (= 4.1.8)
11
11
  rack (~> 1.5.2)
12
12
  rack-test (~> 0.6.2)
13
- actionview (4.1.6)
14
- activesupport (= 4.1.6)
13
+ actionview (4.1.8)
14
+ activesupport (= 4.1.8)
15
15
  builder (~> 3.1)
16
16
  erubis (~> 2.7.0)
17
- active_model_serializers (0.9.0)
17
+ active_model_serializers (0.9.1)
18
18
  activemodel (>= 3.2)
19
- activemodel (4.1.6)
20
- activesupport (= 4.1.6)
19
+ activemodel (4.1.8)
20
+ activesupport (= 4.1.8)
21
21
  builder (~> 3.1)
22
- activerecord (4.1.6)
23
- activemodel (= 4.1.6)
24
- activesupport (= 4.1.6)
22
+ activerecord (4.1.8)
23
+ activemodel (= 4.1.8)
24
+ activesupport (= 4.1.8)
25
25
  arel (~> 5.0.0)
26
- activesupport (4.1.6)
26
+ activesupport (4.1.8)
27
27
  i18n (~> 0.6, >= 0.6.9)
28
28
  json (~> 1.7, >= 1.7.7)
29
29
  minitest (~> 5.1)
30
30
  thread_safe (~> 0.1)
31
31
  tzinfo (~> 1.1)
32
+ addressable (2.3.6)
32
33
  annotate (2.6.5)
33
34
  activerecord (>= 2.3.0)
34
35
  rake (>= 0.8.7)
35
36
  arel (5.0.1.20140414130214)
37
+ arrows (0.0.2)
38
+ activesupport (>= 2.3)
36
39
  barber (0.5.0)
37
40
  ember-source
38
41
  execjs
@@ -53,7 +56,7 @@ GEM
53
56
  chunky_png (1.3.3)
54
57
  climate_control (0.0.3)
55
58
  activesupport (>= 3.0)
56
- cocaine (0.5.4)
59
+ cocaine (0.5.5)
57
60
  climate_control (>= 0.0.3, < 1.0)
58
61
  coffee-rails (4.0.1)
59
62
  coffee-script (>= 2.2.0)
@@ -77,8 +80,10 @@ GEM
77
80
  compass-rails (1.1.7)
78
81
  compass (>= 0.12.2)
79
82
  sprockets (<= 2.11.0)
83
+ css_parser (1.3.5)
84
+ addressable
80
85
  decent_exposure (2.3.2)
81
- did_you_mean (0.8.0)
86
+ did_you_mean (0.9.4)
82
87
  interception
83
88
  diff-lcs (1.2.5)
84
89
  easy_translate (0.5.0)
@@ -98,7 +103,7 @@ GEM
98
103
  elasticsearch-transport (1.0.6)
99
104
  faraday
100
105
  multi_json
101
- ember-data-source (1.0.0.beta.11)
106
+ ember-data-source (1.0.0.beta.12)
102
107
  ember-source
103
108
  ember-rails (0.15.0)
104
109
  active_model_serializers
@@ -109,7 +114,7 @@ GEM
109
114
  handlebars-source (> 1.0.0)
110
115
  jquery-rails (>= 1.0.17)
111
116
  railties (>= 3.1)
112
- ember-source (1.7.1)
117
+ ember-source (1.7.0)
113
118
  handlebars-source (~> 1.0)
114
119
  ember_script (0.0.5)
115
120
  ember_script-source (>= 0.0.2)
@@ -140,16 +145,31 @@ GEM
140
145
  functional_support (0.0.12)
141
146
  activesupport (>= 2.3)
142
147
  gctools (0.2.3)
143
- haml (4.0.5)
148
+ gmail (0.4.2)
149
+ gmail_xoauth (>= 0.3.0)
150
+ mail (>= 2.2.1)
151
+ mime (>= 0.1)
152
+ gmail_xoauth (0.4.1)
153
+ oauth (>= 0.3.6)
154
+ god (0.13.4)
155
+ haml (4.0.6)
144
156
  tilt
145
- haml-rails (0.5.3)
157
+ haml-rails (0.6.0)
146
158
  actionpack (>= 4.0.1)
147
159
  activesupport (>= 4.0.1)
148
160
  haml (>= 3.1, < 5.0)
161
+ html2haml (>= 1.0.1)
149
162
  railties (>= 4.0.1)
150
163
  handlebars-source (1.3.0)
151
- hashie (3.3.1)
164
+ hashie (3.3.2)
152
165
  hike (1.2.3)
166
+ hpricot (0.8.6)
167
+ html2haml (1.0.1)
168
+ erubis (~> 2.7.0)
169
+ haml (>= 4.0.0.rc.1)
170
+ hpricot (~> 0.8.6)
171
+ ruby_parser (~> 3.1.1)
172
+ htmlentities (4.3.2)
153
173
  i18n (0.6.11)
154
174
  i18n-js (2.1.2)
155
175
  i18n
@@ -160,10 +180,10 @@ GEM
160
180
  jquery-rails (3.1.2)
161
181
  railties (>= 3.0, < 5.0)
162
182
  thor (>= 0.14, < 2.0)
163
- jquery-ui-rails (5.0.2)
183
+ jquery-ui-rails (5.0.3)
164
184
  railties (>= 3.2.16)
165
185
  json (1.8.1)
166
- jwt (1.0.0)
186
+ jwt (1.2.0)
167
187
  kaminari (0.16.1)
168
188
  actionpack (>= 3.0.0)
169
189
  activesupport (>= 3.0.0)
@@ -177,18 +197,19 @@ GEM
177
197
  railties
178
198
  tilt
179
199
  livescript-source (1.2.0)
180
- mail (2.6.1)
200
+ mail (2.6.3)
181
201
  mime-types (>= 1.16, < 3)
202
+ mime (0.4.2)
182
203
  mime-types (2.4.3)
183
- mini_portile (0.6.0)
184
- minitest (5.4.2)
204
+ mini_portile (0.6.1)
205
+ minitest (5.4.3)
185
206
  modernizr-rails (2.7.1)
186
207
  multi_json (1.10.1)
187
208
  multi_xml (0.5.5)
188
209
  multipart-post (2.0.0)
189
- mysql2 (0.3.16)
190
- nokogiri (1.6.3.1)
191
- mini_portile (= 0.6.0)
210
+ mysql2 (0.3.17)
211
+ nokogiri (1.6.5)
212
+ mini_portile (~> 0.6.0)
192
213
  numbers_and_words (0.10.0)
193
214
  activesupport
194
215
  i18n
@@ -203,39 +224,45 @@ GEM
203
224
  activesupport (>= 3)
204
225
  capybara (~> 2.4)
205
226
  selenium-webdriver (~> 2.41.0)
206
- paperclip (4.2.0)
227
+ paperclip (4.2.1)
207
228
  activemodel (>= 3.0.0)
208
229
  activesupport (>= 3.0.0)
209
230
  cocaine (~> 0.5.3)
210
231
  mime-types
211
- paranoia (2.0.2)
232
+ paranoia (2.0.4)
212
233
  activerecord (~> 4.0)
234
+ premailer (1.8.2)
235
+ css_parser (>= 1.3.5)
236
+ htmlentities (>= 4.0.0)
237
+ premailer-rails (1.8.0)
238
+ actionmailer (>= 3, < 5)
239
+ premailer (~> 1.7, >= 1.7.9)
213
240
  probability (1.0.0)
214
241
  rack (1.5.2)
215
242
  rack-test (0.6.2)
216
243
  rack (>= 1.0)
217
- rails (4.1.6)
218
- actionmailer (= 4.1.6)
219
- actionpack (= 4.1.6)
220
- actionview (= 4.1.6)
221
- activemodel (= 4.1.6)
222
- activerecord (= 4.1.6)
223
- activesupport (= 4.1.6)
244
+ rails (4.1.8)
245
+ actionmailer (= 4.1.8)
246
+ actionpack (= 4.1.8)
247
+ actionview (= 4.1.8)
248
+ activemodel (= 4.1.8)
249
+ activerecord (= 4.1.8)
250
+ activesupport (= 4.1.8)
224
251
  bundler (>= 1.3.0, < 2.0)
225
- railties (= 4.1.6)
252
+ railties (= 4.1.8)
226
253
  sprockets-rails (~> 2.0)
227
254
  rails_12factor (0.0.3)
228
255
  rails_serve_static_assets
229
256
  rails_stdout_logging
230
257
  rails_serve_static_assets (0.0.2)
231
258
  rails_stdout_logging (0.0.3)
232
- railties (4.1.6)
233
- actionpack (= 4.1.6)
234
- activesupport (= 4.1.6)
259
+ railties (4.1.8)
260
+ actionpack (= 4.1.8)
261
+ activesupport (= 4.1.8)
235
262
  rake (>= 0.8.7)
236
263
  thor (>= 0.18.1, < 2.0)
237
264
  raindrops (0.13.0)
238
- rake (10.3.2)
265
+ rake (10.4.2)
239
266
  rspec (3.1.0)
240
267
  rspec-core (~> 3.1.0)
241
268
  rspec-expectations (~> 3.1.0)
@@ -256,18 +283,21 @@ GEM
256
283
  rspec-mocks (~> 3.1.0)
257
284
  rspec-support (~> 3.1.0)
258
285
  rspec-support (3.1.2)
286
+ ruby_parser (3.1.3)
287
+ sexp_processor (~> 4.1)
259
288
  rubyzip (1.1.6)
260
289
  sass (3.2.19)
261
- sass-rails (4.0.3)
290
+ sass-rails (4.0.4)
262
291
  railties (>= 4.0.0, < 5.0)
263
- sass (~> 3.2.0)
264
- sprockets (~> 2.8, <= 2.11.0)
292
+ sass (~> 3.2.2)
293
+ sprockets (~> 2.8, < 2.12)
265
294
  sprockets-rails (~> 2.0)
266
295
  selenium-webdriver (2.41.0)
267
296
  childprocess (>= 0.5.0)
268
297
  multi_json (~> 1.0)
269
298
  rubyzip (~> 1.0)
270
299
  websocket (~> 1.0.4)
300
+ sexp_processor (4.4.4)
271
301
  simplecov (0.7.1)
272
302
  multi_json (~> 1.0)
273
303
  simplecov-html (~> 0.7.1)
@@ -276,16 +306,20 @@ GEM
276
306
  bcrypt (~> 3.1)
277
307
  oauth (~> 0.4, >= 0.4.4)
278
308
  oauth2 (>= 0.8.0, < 1.0.0)
279
- spring (1.1.3)
309
+ spring (1.2.0)
280
310
  sprockets (2.11.0)
281
311
  hike (~> 1.2)
282
312
  multi_json (~> 1.0)
283
313
  rack (~> 1.0)
284
314
  tilt (~> 1.1, != 1.3.0)
285
- sprockets-rails (2.2.0)
315
+ sprockets-rails (2.2.2)
286
316
  actionpack (>= 3.0)
287
317
  activesupport (>= 3.0)
288
318
  sprockets (>= 2.8, < 4.0)
319
+ squash_rails (1.3.3)
320
+ squash_ruby
321
+ squash_ruby (2.0.0)
322
+ json
289
323
  stringex (2.1.2)
290
324
  thor (0.19.1)
291
325
  thread (0.1.4)
@@ -293,7 +327,7 @@ GEM
293
327
  tilt (1.4.1)
294
328
  tzinfo (1.2.2)
295
329
  thread_safe (~> 0.1)
296
- uglifier (2.5.3)
330
+ uglifier (2.6.0)
297
331
  execjs (>= 0.3.0)
298
332
  json (>= 1.8.0)
299
333
  underscore-rails (1.7.0)
@@ -310,6 +344,7 @@ PLATFORMS
310
344
 
311
345
  DEPENDENCIES
312
346
  annotate (>= 2.5.0.pre1)
347
+ arrows (>= 0.0.2)
313
348
  capybara (~> 2.4.4)
314
349
  coffee-rails (~> 4.0.1)
315
350
  commerce_units (>= 0.0.5)
@@ -331,6 +366,8 @@ DEPENDENCIES
331
366
  foundation-rails (~> 5.3.1.0)
332
367
  functional_support (>= 0.0.12)
333
368
  gctools (~> 0.2.3)
369
+ gmail (~> 0.4.2)
370
+ god (~> 0.13.4)
334
371
  haml (~> 4.0.0)
335
372
  haml-rails (~> 0.4)
336
373
  i18n-js
@@ -345,8 +382,9 @@ DEPENDENCIES
345
382
  painful_translate (>= 0.0.4)
346
383
  paperclip (~> 4.2.0)
347
384
  paranoia (~> 2.0.2)
385
+ premailer-rails (~> 1.8.0)
348
386
  probability (= 1)
349
- rails (= 4.1.6)
387
+ rails (~> 4.1.8)
350
388
  rails_12factor
351
389
  rspec (~> 3.1)
352
390
  rspec-rails (~> 3.1)
@@ -355,6 +393,8 @@ DEPENDENCIES
355
393
  simplecov (~> 0.7.1)
356
394
  sorcery (~> 0.8.6)
357
395
  spring
396
+ squash_rails (~> 1.3.3)
397
+ squash_ruby (~> 2.0.0)
358
398
  stringex (~> 2.1.2)
359
399
  uglifier (>= 1.3.0)
360
400
  underscore-rails
@@ -1,3 +1,6 @@
1
1
  class Apiv1.ProductDisplayComponent extends Ember.Component
2
2
  attributeBindings: ["class"]
3
- classNames: ['product-display']
3
+ classNames: ['product-display']
4
+
5
+ +computed product.pictures.firstObject.picUrl
6
+ productImageStyle: -> "background-image: url(#{@get 'product.pictures.firstObject.picUrl' });"
@@ -1,3 +1,6 @@
1
1
  class Apiv1.ProductListingComponent extends Ember.Component
2
2
  attributeBindings: ["class"]
3
- classNames: ['product-listing']
3
+ classNames: ['product-listing']
4
+
5
+ +computed product.pictures.firstObject.picUrl
6
+ productImageStyle: -> "background-image: url(#{@get 'product.pictures.firstObject.picUrl' });"
@@ -1,7 +1,19 @@
1
1
  class Apiv1.SiteFooterComponent extends Ember.Component
2
2
  tagName: 'footer'
3
3
  classNames: ["site-footer"]
4
+ +computed Apiv1.CurrentUserSession.data
5
+ user: -> Apiv1.HashEx.camelize get$(Apiv1, "CurrentUserSession.data")
4
6
 
7
+ +computed user.userRank, userLoggedIn
8
+ adminLoggedIn: ->
9
+ @userLoggedIn and @get("user.userRank") is "admin"
10
+
11
+ +computed Apiv1.CurrentUserSession.id
12
+ userLoggedIn: ->
13
+ get$(Apiv1, "CurrentUserSession.id")
14
+ +computed userLoggedIn
15
+ notLoggedIn: ->
16
+ not @userLoggedIn
5
17
  actions:
6
18
  displayModal: (modal) ->
7
19
  @sendAction 'action', modal
@@ -24,6 +24,21 @@ class Apiv1.SiteNavComponent extends Ember.Component
24
24
  $("#page-wrapper").unbind "touchmove"
25
25
  $("#page-wrapper").unbind "scroll"
26
26
 
27
+ +computed Apiv1.CurrentUserSession.id
28
+ userLoggedIn: ->
29
+ get$ Apiv1, "CurrentUserSession.id"
30
+
31
+ +computed userLoggedIn
32
+ notLoggedIn: ->
33
+ not @userLoggedIn
34
+
35
+ +computed Apiv1.CurrentUserSession.data
36
+ user: -> Apiv1.HashEx.camelize get$(Apiv1, "CurrentUserSession.data")
37
+
38
+ +computed user.userRank, userLoggedIn
39
+ adminLoggedIn: ->
40
+ @userLoggedIn and @get("user.userRank") is "admin"
41
+
27
42
  actions:
28
43
  displayModal: (modal) ->
29
44
  @sendAction 'action', modal
@@ -1,9 +1,25 @@
1
1
  Apiv1.Router.map ->
2
- @route "about"
3
- @route "contacts"
2
+
4
3
  @resource "products", path: "/products", ->
5
4
  @resource "products.product", path: "/product/:product_id", ->
6
5
  @route "show"
6
+ @resource "products.product.offers", path: "/offers", ->
7
+ @route "new"
8
+
9
+ @resource "users", path: "/users", ->
10
+ @resource "users.products", path: "/products", ->
11
+ @route "index"
12
+ @route "new"
13
+ @resource "users.product", path: "/product/:product_id", ->
14
+ @route "edit"
15
+ @resource "users.contacts", path: "/contacts", ->
16
+ @route "index"
17
+ @route "new"
18
+ @resource "users.contact", path: "/contact/:contact_id", ->
19
+ @route "edit"
20
+
21
+ @resource "users.offers", path: "/offers", ->
22
+ @route "index"
7
23
 
8
24
  @resource "admin", path: "/admin", ->
9
25
  @resource "admin.translations", path: "/translations", ->
@@ -0,0 +1,4 @@
1
+ class Apiv1.ModalsForkController extends Ember.ObjectController
2
+ actions:
3
+ gotoMyAccount: ->
4
+ @transitionToRoute "users.index"
@@ -20,10 +20,7 @@ class Apiv1.ModalsLoginController extends Ember.ObjectController
20
20
  @redirectOut()
21
21
 
22
22
  redirectOut: ->
23
- if @get("model.isAdmin")
24
- @transitionToRoute "admin.index"
25
- else
26
- @transitionToRoute "users.index"
23
+ @send "displayModal", "fork"
27
24
 
28
25
  failedLogin: (reason) ->
29
26
  Apiv1.Flash.register "warning", "login failed", 5000
@@ -7,7 +7,7 @@ class Apiv1.ModalsRegisterController extends Ember.ObjectController
7
7
  user: -> @model
8
8
 
9
9
  redirectToIndex: ->
10
- @transitionToRoute 'users.index'
10
+ @send "displayModel", "fork"
11
11
  notifySuccess: ->
12
12
  Apiv1.Flash.register "success", "account created!", 4000
13
13
  successfulSave: (user) ->