cloudrider 0.3.0 → 0.3.20

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 (227) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -1
  3. data/cloudrider.gemspec +1 -0
  4. data/generica/.gitignore +18 -0
  5. data/generica/Gemfile +8 -1
  6. data/generica/Gemfile.lock +3 -0
  7. data/generica/app/assets/javascripts/apiv1.js.ls +6 -1
  8. data/generica/app/assets/javascripts/components/offers-summary.js.em +2 -0
  9. data/generica/app/assets/javascripts/components/picture-chunk.js.em +17 -0
  10. data/generica/app/assets/javascripts/components/pictures-group.js.em +21 -0
  11. data/generica/app/assets/javascripts/components/search-and-filter.js.em +4 -0
  12. data/generica/app/assets/javascripts/components/site-nav.js.em +5 -1
  13. data/generica/app/assets/javascripts/components/taggable-field.js.em +28 -0
  14. data/generica/app/assets/javascripts/components/tree/taxon-li.js.em +6 -2
  15. data/generica/app/assets/javascripts/controllers/index_controller.js.em +19 -2
  16. data/generica/app/assets/javascripts/controllers/modals/login_controller.js.em +23 -9
  17. data/generica/app/assets/javascripts/controllers/modals/register_controller.js.em +24 -0
  18. data/generica/app/assets/javascripts/controllers/products/index_controller.js.em +23 -13
  19. data/generica/app/assets/javascripts/controllers/products/product/offers/new_controller.js.em +17 -0
  20. data/generica/app/assets/javascripts/controllers/users/offers/index_controller.js.em +10 -0
  21. data/generica/app/assets/javascripts/controllers/users/product/edit_controller.js.em +31 -0
  22. data/generica/app/assets/javascripts/controllers/users/products/index_controller.js.em +8 -0
  23. data/generica/app/assets/javascripts/controllers/users/products/new_controller.js.em +22 -0
  24. data/generica/app/assets/javascripts/controllers/users/products/slice_controller.js.em +4 -0
  25. data/generica/app/assets/javascripts/helpers/filte_previewer.js.ls +21 -0
  26. data/generica/app/assets/javascripts/helpers/listing_picture.js.em +17 -0
  27. data/generica/app/assets/javascripts/models/offer.js.em +9 -8
  28. data/generica/app/assets/javascripts/models/user.js.em +12 -0
  29. data/generica/app/assets/javascripts/models/users/product.js.em +12 -0
  30. data/generica/app/assets/javascripts/routes/application_route.js.em +10 -2
  31. data/generica/app/assets/javascripts/routes/products/index_route.js.em +23 -2
  32. data/generica/app/assets/javascripts/routes/products/product/offers/new_route.js.em +18 -0
  33. data/generica/app/assets/javascripts/routes/users/offers/index_route.js.em +1 -0
  34. data/generica/app/assets/javascripts/routes/users/product_route.js.em +3 -0
  35. data/generica/app/assets/javascripts/routes/users/products/index_route.js.em +3 -0
  36. data/generica/app/assets/javascripts/routes/users/products/new_route.js.em +3 -0
  37. data/generica/app/assets/javascripts/templates/admin/product/edit.emblem +2 -0
  38. data/generica/app/assets/javascripts/templates/admin/products/_form-core.emblem +44 -0
  39. data/generica/app/assets/javascripts/templates/admin/products/new.emblem +4 -42
  40. data/generica/app/assets/javascripts/templates/components/offers-summary.emblem +9 -0
  41. data/generica/app/assets/javascripts/templates/components/picture-chunk.emblem +9 -0
  42. data/generica/app/assets/javascripts/templates/components/pictures-group.emblem +6 -0
  43. data/generica/app/assets/javascripts/templates/components/search-and-filter.emblem +5 -1
  44. data/generica/app/assets/javascripts/templates/components/taggable-field.emblem +1 -0
  45. data/generica/app/assets/javascripts/templates/modals/register.emblem +57 -0
  46. data/generica/app/assets/javascripts/templates/products/product/offers/_anonymous-form.emblem +11 -0
  47. data/generica/app/assets/javascripts/templates/products/product/offers/_offer-form.emblem +55 -0
  48. data/generica/app/assets/javascripts/templates/products/product/offers/new.emblem +37 -0
  49. data/generica/app/assets/javascripts/templates/products/product/show.emblem +26 -1
  50. data/generica/app/assets/javascripts/templates/users.emblem +24 -0
  51. data/generica/app/assets/javascripts/templates/users/index.emblem +3 -0
  52. data/generica/app/assets/javascripts/templates/users/offers/index.emblem +25 -0
  53. data/generica/app/assets/javascripts/templates/users/offers/slice.emblem +31 -0
  54. data/generica/app/assets/javascripts/templates/users/product/edit.emblem +82 -0
  55. data/generica/app/assets/javascripts/templates/users/products/index.emblem +22 -0
  56. data/generica/app/assets/javascripts/templates/users/products/new.emblem +28 -0
  57. data/generica/app/assets/javascripts/templates/users/products/slice.emblem +27 -0
  58. data/generica/app/assets/stylesheets/apiv1/_application.css.scss +4 -0
  59. data/generica/app/assets/stylesheets/apiv1/components/_offers-summary.css.scss +20 -0
  60. data/generica/app/assets/stylesheets/apiv1/components/_pictures-group.css.scss +32 -0
  61. data/generica/app/assets/stylesheets/apiv1/components/_taggable-field.css.scss +32 -0
  62. data/generica/app/assets/stylesheets/apiv1/products/product/offers/_new.css.scss +8 -0
  63. data/generica/app/controllers/admin/base_controller.rb +1 -1
  64. data/generica/app/controllers/admin/sessions/destroy_controller.rb +16 -0
  65. data/generica/app/controllers/apiv1/offers/create_controller.rb +30 -0
  66. data/generica/app/controllers/apiv1/offers/index_controller.rb +22 -0
  67. data/generica/app/controllers/apiv1/offers/show_controller.rb +12 -0
  68. data/generica/app/controllers/apiv1/products/destroy_controller.rb +6 -0
  69. data/generica/app/controllers/apiv1/products/index_controller.rb +8 -2
  70. data/generica/app/controllers/apiv1/products/show_controller.rb +7 -3
  71. data/generica/app/controllers/apiv1/taxons/index_controller.rb +5 -1
  72. data/generica/app/controllers/apiv1/users/create_controller.rb +17 -0
  73. data/generica/app/controllers/apiv1/users/show_controller.rb +12 -0
  74. data/generica/app/controllers/apiv1/users_controller.rb +9 -0
  75. data/generica/app/controllers/application_controller.rb +3 -0
  76. data/generica/app/controllers/users/offers/create_controller.rb +26 -0
  77. data/generica/app/controllers/users/products/create_controller.rb +26 -0
  78. data/generica/app/controllers/users/products/update_controller.rb +35 -0
  79. data/generica/app/mailers/apiv1/aggregate_mailer.rb +13 -0
  80. data/generica/app/mailers/apiv1/aggregate_mailer/summary_context.rb +121 -0
  81. data/generica/app/mailers/apiv1/notifications_mailer.rb +19 -0
  82. data/generica/app/mailers/apiv1/notifications_mailer/new_offer_context.rb +53 -0
  83. data/generica/app/models/admin/user.rb +43 -2
  84. data/generica/app/models/apiv1/attachment.rb +2 -0
  85. data/generica/app/models/apiv1/email_object.rb +35 -0
  86. data/generica/app/models/apiv1/email_request.rb +107 -0
  87. data/generica/app/models/apiv1/offer_message.rb +53 -0
  88. data/generica/app/models/apiv1/offer_postboy.rb +33 -0
  89. data/generica/app/models/apiv1/picture.rb +2 -0
  90. data/generica/app/models/apiv1/product.rb +28 -6
  91. data/generica/app/models/apiv1/products/offer_message_factory.rb +13 -0
  92. data/generica/app/models/apiv1/products_machine.rb +8 -2
  93. data/generica/app/models/apiv1/taxon.rb +1 -1
  94. data/generica/app/models/apiv1/users/product_factory.rb +22 -0
  95. data/generica/app/models/apiv1/users/product_relationship.rb +19 -0
  96. data/generica/app/models/users/products/offer_factory.rb +40 -0
  97. data/generica/app/varissets/javascripts/templates/application.emblem.erb +2 -2
  98. data/generica/app/varissets/javascripts/templates/components/offers-overview.emblem.erb +1 -0
  99. data/generica/app/varissets/javascripts/templates/components/search-and-filter.emblem.erb +33 -0
  100. data/generica/app/varissets/javascripts/templates/components/site-nav.emblem.erb +8 -0
  101. data/generica/app/varissets/javascripts/templates/components/taggable-field.emblem.erb +11 -0
  102. data/generica/app/varissets/javascripts/templates/modals/login.emblem.erb +36 -0
  103. data/generica/app/varissets/javascripts/templates/products.emblem.erb +4 -0
  104. data/generica/app/varissets/javascripts/templates/products/index.emblem.erb +17 -0
  105. data/generica/app/varissets/javascripts/templates/products/product/offers/_anonymous-form.emblem.erb +11 -0
  106. data/generica/app/varissets/javascripts/templates/products/product/offers/_offer-form.emblem.erb +55 -0
  107. data/generica/app/varissets/javascripts/templates/products/product/offers/new.emblem.erb +37 -0
  108. data/generica/app/varissets/javascripts/templates/products/product/show.emblem.erb +108 -0
  109. data/generica/app/varissets/stylesheets/apiv1/components/_offers-overview.css.scss.erb +3 -0
  110. data/generica/app/varissets/stylesheets/apiv1/components/_offers_overview.css.scss.erb +3 -0
  111. data/generica/app/varissets/stylesheets/apiv1/components/_search-and-filter.css.scss.erb +15 -0
  112. data/generica/app/varissets/stylesheets/apiv1/components/_site-footer.css.scss.erb +23 -0
  113. data/generica/app/varissets/stylesheets/apiv1/components/_taggable-field.css.scss.erb +32 -0
  114. data/generica/app/views/apiv1/home/index.html.haml +3 -1
  115. data/generica/app/views/apiv1/layouts/application.html.haml +37 -2
  116. data/generica/config/{database.yml.erb → database.yml.str} +3 -3
  117. data/generica/config/email.yml +11 -0
  118. data/generica/config/email_slave.god +9 -0
  119. data/generica/config/initializers/premailer.rb +1 -0
  120. data/generica/config/initializers/squash.rb.erb +3 -0
  121. data/generica/config/nginx.conf.erb +4 -4
  122. data/generica/config/routes.rb +14 -0
  123. data/generica/db/migrate/20141114213427_add_user_rank_to_admin_users.rb +9 -0
  124. data/generica/db/migrate/20141114225019_create_apiv1_users_products.rb +9 -0
  125. data/generica/db/migrate/20141116053522_create_apiv1_offer_messages.rb +16 -0
  126. data/generica/db/migrate/20141116235011_add_deleted_at_to_apiv1_products.rb +5 -0
  127. data/generica/db/migrate/20141116235209_add_deleted_at_to_apiv1_offer_messages.rb +5 -0
  128. data/generica/db/migrate/20141116235651_add_deleted_at_to_apiv1_pictures.rb +5 -0
  129. data/generica/db/migrate/20141116235808_add_deleted_at_to_apiv1_attachments.rb +5 -0
  130. data/generica/db/migrate/20141127230304_create_apiv1_email_requests.rb +16 -0
  131. data/generica/db/migrate/20141127230455_create_apiv1_email_objects.rb +11 -0
  132. data/generica/lib/generica/assets_unretardifier.rb +32 -0
  133. data/generica/lib/generica/email_slave.rb +92 -0
  134. data/generica/lib/tasks/email_slave.rake +11 -0
  135. data/generica/lib/tasks/production.rake +1 -1
  136. data/generica/public/tests/bermese.jpg +0 -0
  137. data/generica/public/tests/chow.jpg +0 -0
  138. data/generica/public/tests/malamute.jpg +0 -0
  139. data/generica/public/tests/malamute2.JPG +0 -0
  140. data/generica/spec/controllers/apiv1/users/create_controller_spec.rb +17 -0
  141. data/generica/spec/controllers/users/products/create_controller_spec.rb +31 -0
  142. data/generica/spec/mailers/apiv1/aggregate_mailer_spec.rb +29 -0
  143. data/generica/spec/models/apiv1/email_request_spec.rb +4 -0
  144. data/generica/spec/models/apiv1/offer_postboy_spec.rb +22 -0
  145. data/generica/spec/models/apiv1/product_spec.rb +1 -0
  146. data/generica/spec/models/apiv1/products/offer_message_factory_spec.rb +37 -0
  147. data/generica/spec/models/apiv1/products_machine_spec.rb +77 -0
  148. data/generica/spec/models/apiv1/users/product_factory_spec.rb +47 -0
  149. data/generica/spec/models/users/products/offer_factory_spec.rb +38 -0
  150. data/generica/test/mailers/.keep +0 -0
  151. data/generica/test/mailers/previews/apiv1/aggregate_preview.rb +6 -0
  152. data/generica/test/mailers/previews/apiv1/notifications_preview.rb +5 -0
  153. data/lib/cloudrider.rb +1 -1
  154. data/lib/cloudrider/apiv1/base.rb +2 -2
  155. data/lib/cloudrider/apiv1/login_modal_emblem.rb +25 -0
  156. data/lib/cloudrider/apiv1/offers_anonymous_form_partial_emblem.rb +12 -0
  157. data/lib/cloudrider/apiv1/offers_new_emblem.rb +15 -0
  158. data/lib/cloudrider/apiv1/offers_overview_component.rb +8 -0
  159. data/lib/cloudrider/apiv1/offers_overview_sass.rb +8 -0
  160. data/lib/cloudrider/apiv1/product_show_emblem.rb +31 -0
  161. data/lib/cloudrider/apiv1/products_emblem.rb +11 -0
  162. data/lib/cloudrider/apiv1/products_index_emblem.rb +14 -0
  163. data/lib/cloudrider/apiv1/search_and_filter_component.rb +11 -0
  164. data/lib/cloudrider/apiv1/search_and_filter_sass.rb +11 -0
  165. data/lib/cloudrider/apiv1/site_footer_component.rb +7 -7
  166. data/lib/cloudrider/apiv1/site_footer_sass.rb +9 -0
  167. data/lib/cloudrider/application_commander.rb +46 -34
  168. data/lib/cloudrider/backend_commander.rb +15 -9
  169. data/lib/cloudrider/protofile.rb +18 -2
  170. data/lib/cloudrider/protosite.example.json +26 -0
  171. data/lib/cloudrider/protosite.rb +66 -0
  172. data/lib/cloudrider/serverside/base.rb +2 -2
  173. data/lib/cloudrider/serverside/database_yaml.rb +9 -4
  174. data/lib/cloudrider/serverside/nginx_conf.rb +7 -2
  175. data/lib/cloudrider/serverside/squash_ruby.rb +14 -0
  176. data/lib/cloudrider/serverside/unicorn_conf_ruby.rb +2 -1
  177. data/lib/cloudrider/version.rb +1 -1
  178. data/lib/cloudrider/web_firm.rb +16 -0
  179. data/lib/cloudrider/web_firm/component_architect.rb +23 -0
  180. data/lib/cloudrider/web_firm/page_designer.rb +13 -0
  181. data/lib/cloudrider/web_firm/project_lead.rb +30 -0
  182. data/lib/cloudrider/web_firm/scumbag_engineer.rb +40 -0
  183. data/lib/cloudrider/web_firm/support_intern.rb +113 -0
  184. data/lib/generators/cloudrider/server/server_generator.rb +4 -8
  185. data/lib/generators/cloudrider/website/website_generator.rb +25 -0
  186. data/spec/cloudrider/protosite_spec.rb +63 -0
  187. data/vanilla/.bowerrc +4 -0
  188. data/vanilla/.editorconfig +33 -0
  189. data/vanilla/.ember-cli +9 -0
  190. data/vanilla/.gitignore +17 -0
  191. data/vanilla/.jshintrc +32 -0
  192. data/vanilla/.travis.yml +16 -0
  193. data/vanilla/Brocfile.js +20 -0
  194. data/vanilla/README.md +51 -0
  195. data/vanilla/app/app.js +16 -0
  196. data/vanilla/app/components/.gitkeep +0 -0
  197. data/vanilla/app/controllers/.gitkeep +0 -0
  198. data/vanilla/app/controllers/admin.coffee +5 -0
  199. data/vanilla/app/helpers/.gitkeep +0 -0
  200. data/vanilla/app/index.html +21 -0
  201. data/vanilla/app/models/.gitkeep +0 -0
  202. data/vanilla/app/router.js +11 -0
  203. data/vanilla/app/routes/.gitkeep +0 -0
  204. data/vanilla/app/styles/.gitkeep +0 -0
  205. data/vanilla/app/styles/app.css +3 -0
  206. data/vanilla/app/templates/.gitkeep +0 -0
  207. data/vanilla/app/templates/application.hbs +3 -0
  208. data/vanilla/app/templates/components/.gitkeep +0 -0
  209. data/vanilla/app/views/.gitkeep +0 -0
  210. data/vanilla/bower.json +17 -0
  211. data/vanilla/config/environment.js +47 -0
  212. data/vanilla/package.json +39 -0
  213. data/vanilla/public/.gitkeep +0 -0
  214. data/vanilla/public/crossdomain.xml +15 -0
  215. data/vanilla/public/robots.txt +3 -0
  216. data/vanilla/testem.json +11 -0
  217. data/vanilla/tests/.jshintrc +74 -0
  218. data/vanilla/tests/helpers/resolver.js +11 -0
  219. data/vanilla/tests/helpers/start-app.js +25 -0
  220. data/vanilla/tests/index.html +45 -0
  221. data/vanilla/tests/test-helper.js +12 -0
  222. data/vanilla/tests/unit/.gitkeep +0 -0
  223. data/vanilla/tests/unit/controllers/admin-test.coffee +12 -0
  224. data/vanilla/vendor/.gitkeep +0 -0
  225. metadata +189 -5
  226. data/generica/app/views/layouts/application.html.erb +0 -14
  227. data/lib/cloudrider/master_context.rb +0 -105
@@ -0,0 +1,15 @@
1
+ .search-and-filter {
2
+ width: 100%;
3
+ @include display-flex;
4
+ @include flex-direction(row);
5
+ @include justify-content(center);
6
+ .standard-container {
7
+ width: 1250px;
8
+ }
9
+ .search-button {
10
+ height: 40px;
11
+ }
12
+ textarea.taggable-textarea {
13
+ min-height: 40px;
14
+ }
15
+ }
@@ -0,0 +1,23 @@
1
+ .site-footer {
2
+ padding-bottom: 5rem;
3
+ background-color: #444;
4
+ width: 100%;
5
+ padding-top: 5rem;
6
+ color: #999;
7
+ .lang-btn {
8
+ width: 100%;
9
+ }
10
+ .footer-title {
11
+ color: #999;
12
+ border-bottom: 1px solid #888;
13
+ }
14
+ .select-control {
15
+ cursor: pointer;
16
+ height: 50px;
17
+ text-transform: uppercase;
18
+ font-weight: bold;
19
+ }
20
+ .admin-btn {
21
+ font-weight: bold;
22
+ }
23
+ }
@@ -0,0 +1,32 @@
1
+ .taggable-field {
2
+ @include display-flex;
3
+ @include flex-direction(row);
4
+ @include flex-wrap(nowrap);
5
+ @include justify-content(flex-start);
6
+ overflow-x: hidden;
7
+ .taggable-textfield {
8
+ margin-bottom: 0px;
9
+ width: 100%;
10
+ height: 40px;
11
+ }
12
+ .taggable-field-tag {
13
+ @include display-flex;
14
+ @include flex-direction(row);
15
+ @include justify-content(center);
16
+ @include align-items(center);
17
+ border: 1px solid #ddd;
18
+ padding-left: 10px;
19
+ padding-right: 15px;
20
+ min-width: 50px;
21
+ height: 40px;
22
+ background: {
23
+ color: #f2f2f2;
24
+ }
25
+ color: #358753;
26
+ }
27
+ .centered-fully {
28
+ @include display-flex;
29
+ @include flex-wrap(nowrap);
30
+ @include flex-direction(row);
31
+ }
32
+ }
@@ -1,2 +1,4 @@
1
1
  #now-loading
2
- %h1 Loading page...
2
+ %h1
3
+ .now-loading-text Loading page...
4
+ .now-loading-spinner +
@@ -13,9 +13,44 @@
13
13
  %head
14
14
  %meta{ :charset => "utf-8" }
15
15
  %meta{ :name => "viewport", :content => "width=device-width, initial-scale=1.0"}
16
- = stylesheet_link_tag 'application', media: 'all', "data-turbolinks-track" => false
17
- = javascript_include_tag "application", "data-turbolinks-track" => false
16
+ %title Plastic Scrap Market
17
+ = stylesheet_link_tag 'application', media: 'all', async: true
18
+ = javascript_include_tag "application"
18
19
  = csrf_meta_tags
19
20
 
21
+ - if logged_in?
22
+ :javascript
23
+ window.RawCurrentUserSession = #{current_user.to_ember_hash.to_json};
24
+
25
+ :css
26
+ #now-loading {
27
+ position: fixed;
28
+ top: 45%;
29
+ z-index: 99999;
30
+ width: 100%;
31
+ }
32
+ .now-loading-text {
33
+ text-align: center;
34
+ }
35
+ .now-loading-spinner {
36
+ text-align: center;
37
+ font-weight: bold;
38
+ -webkit-animation: spin 1s ease-in-out infinite alternate;
39
+ -moz-animation: spin 1s ease-in-out infinite alternate;
40
+ animation: spin 1s ease-in-out infinite alternate;
41
+ }
42
+ @-moz-keyframes spin {
43
+ from { -moz-transform: rotate(0deg); }
44
+ to { -moz-transform: rotate(360deg); }
45
+ }
46
+ @-webkit-keyframes spin {
47
+ from { -webkit-transform: rotate(0deg); }
48
+ to { -webkit-transform: rotate(360deg); }
49
+ }
50
+ @keyframes spin {
51
+ from {transform:rotate(0deg);}
52
+ to {transform:rotate(360deg);}
53
+ }
54
+
20
55
  %body#apiv1
21
56
  = yield
@@ -19,14 +19,14 @@ default: &default
19
19
 
20
20
  development:
21
21
  <<: *default
22
- database: <%= project_name %>_development
22
+ database: #{project_name}_development
23
23
 
24
24
  # Warning: The database defined as "test" will be erased and
25
25
  # re-generated from your development database when you run "rake".
26
26
  # Do not set this db to the same as development or production.
27
27
  test:
28
28
  <<: *default
29
- database: <%= project_name %>_test
29
+ database: #{project_name}_test
30
30
 
31
31
  # As with config/secrets.yml, you never want to store sensitive information,
32
32
  # like your database password, in your source code. If your source code is
@@ -49,5 +49,5 @@ test:
49
49
  #
50
50
  production:
51
51
  <<: *default
52
- database: pisource_production
52
+ database: #{project_name}_production
53
53
  password: <%= ENV['APIV1_DATABASE_PASSWORD'] %>
@@ -0,0 +1,11 @@
1
+ development:
2
+ username: defaultemailhelper@gmail.com
3
+ password: <%= ENV['APIV1_EMAIL_PASSWORD'] %>
4
+
5
+ test:
6
+ username: defaultemailhelper@gmail.com
7
+ password: <%= ENV['APIV1_EMAIL_PASSWORD'] %>
8
+
9
+ production:
10
+ username: defaultemailhelper@gmail.com
11
+ password: <%= ENV['APIV1_EMAIL_PASSWORD'] %>
@@ -0,0 +1,9 @@
1
+ God.pid_file_directory = File.expand_path "../../tmp/pids", __FILE__
2
+ God.watch do |w|
3
+ w.name = "email_slave"
4
+ w.start = "rake email_slave:work_the_queue"
5
+ w.env = { "RAILS_ENV" => "production" }
6
+ w.log = File.expand_path "../../log/email_slave.god.log", __FILE__
7
+ w.dir = File.expand_path "../../", __FILE__
8
+ w.keepalive memory_max: 5.megabytes, cpu_max: 7.percent
9
+ end
@@ -0,0 +1 @@
1
+ Premailer::Rails.config.merge!(preserve_styles: false, remove_ids: true)
@@ -0,0 +1,3 @@
1
+ Squash::Ruby.configure api_host: 'https://lit-oasis-1400.herokuapp.com',
2
+ api_key: <%= api_key.inspect %>,
3
+ disabled: (Rails.env.development? || Rails.env.test?)
@@ -1,4 +1,4 @@
1
- upstream app {
1
+ upstream <%= project_name %> {
2
2
  server unix:/home/ia/workspace/<%= project_name %>/tmp/sockets/unicorn.<%= project_name %>.sock fail_timeout=0;
3
3
  }
4
4
  server {
@@ -17,15 +17,15 @@ server {
17
17
  }
18
18
 
19
19
  location / {
20
- try_files $uri/index.html $uri.html $uri @app;
20
+ try_files $uri/index.html $uri.html $uri @<%= project_name %>;
21
21
  error_page 404 /404.html;
22
22
  error_page 422 /422.html;
23
23
  error_page 500 502 503 504 /500.html;
24
24
  error_page 403 /403.html;
25
25
  }
26
26
 
27
- location @app {
28
- proxy_pass http://app;
27
+ location @<%= project_name %> {
28
+ proxy_pass http://<%= project_name %>;
29
29
  }
30
30
 
31
31
  location = /favicon.ico {
@@ -22,6 +22,19 @@ Rails.application.routes.draw do
22
22
  resources :i18n_translations, only: [:index], controller: 'i18n_translations/index'
23
23
  resources :messages, only: [:create], controller: 'messages/create'
24
24
  resources :messages, only: [:index], controller: 'messages/index'
25
+ resources :users, only: [:create], controller: 'users/create'
26
+ resources :users, only: [:show], controller: 'users/show'
27
+ resources :offers, only: [:create], controller: 'offers/create'
28
+ resources :offers, only: [:show], controller: 'offers/show'
29
+ resources :offers, only: [:destroy], controller: 'offers/destroy'
30
+ resources :offers, only: [:index], controller: 'offers/index'
31
+ end
32
+
33
+ namespace :users do
34
+ resources :users_offers, only: [:create], controller: 'offers/create'
35
+
36
+ resources :users_products, only: [:create], controller: 'products/create'
37
+ resources :users_products, only: [:update], controller: 'products/update'
25
38
  end
26
39
 
27
40
  namespace :admin do
@@ -34,5 +47,6 @@ Rails.application.routes.draw do
34
47
  resources :taxons, only: [:update], controller: 'taxons/update'
35
48
 
36
49
  resources :admin_sessions, only: [:create], controller: 'sessions/create'
50
+ resources :admin_sessions, only: [:destroy], controller: 'sessions/destroy'
37
51
  end
38
52
  end
@@ -0,0 +1,9 @@
1
+ class AddUserRankToAdminUsers < ActiveRecord::Migration
2
+ def change
3
+ add_column :admin_users, :user_rank, :string
4
+ add_column :admin_users, :company_name, :string
5
+ add_column :admin_users, :phone_number, :string
6
+ add_column :admin_users, :about_me, :text
7
+ add_column :admin_users, :address, :string
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class CreateApiv1UsersProducts < ActiveRecord::Migration
2
+ def change
3
+ create_table :apiv1_users_product_relationships do |t|
4
+ t.references :user, index: true
5
+ t.references :product, index: true
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ class CreateApiv1OfferMessages < ActiveRecord::Migration
2
+ def change
3
+ create_table :apiv1_offer_messages do |t|
4
+ t.references :product, index: true
5
+ t.string :from_company
6
+ t.string :sender_email
7
+ t.string :subject_text
8
+ t.string :phone_number
9
+ t.string :contact_person
10
+ t.string :company_address
11
+ t.string :status
12
+ t.text :message
13
+ t.timestamps
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ class AddDeletedAtToApiv1Products < ActiveRecord::Migration
2
+ def change
3
+ add_column :apiv1_products, :deleted_at, :datetime
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddDeletedAtToApiv1OfferMessages < ActiveRecord::Migration
2
+ def change
3
+ add_column :apiv1_offer_messages, :deleted_at, :datetime
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddDeletedAtToApiv1Pictures < ActiveRecord::Migration
2
+ def change
3
+ add_column :apiv1_pictures, :deleted_at, :datetime
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddDeletedAtToApiv1Attachments < ActiveRecord::Migration
2
+ def change
3
+ add_column :apiv1_attachments, :deleted_at, :datetime
4
+ end
5
+ end
@@ -0,0 +1,16 @@
1
+ class CreateApiv1EmailRequests < ActiveRecord::Migration
2
+ def change
3
+ create_table :apiv1_email_requests do |t|
4
+ t.string :to, null: false
5
+ t.string :cc
6
+ t.string :bcc
7
+ t.string :subject
8
+ t.string :status
9
+ t.string :from
10
+ t.string :mailer_class, null: false
11
+ t.datetime :deleted_at
12
+ t.timestamps
13
+ end
14
+ add_index :apiv1_email_requests, [:to, :mailer_class]
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ class CreateApiv1EmailObjects < ActiveRecord::Migration
2
+ def change
3
+ create_table :apiv1_email_objects do |t|
4
+ t.references :email, index: true
5
+ t.string :class_name
6
+ t.string :permalink_id
7
+ t.datetime :deleted_at
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,32 @@
1
+ module Generica; end
2
+ class Generica::AssetsUnretardifier
3
+ include Thor::Base
4
+ include Thor::Actions
5
+ source_root Rails.root.join("public", "assets")
6
+ def unretardify!
7
+ _retarded_files.each do |file|
8
+ copy_file file[:original], _full_name(file[:destination])
9
+ end
10
+ end
11
+ private
12
+ def _full_name(short_name)
13
+ Rails.root.join "public", "assets", short_name
14
+ end
15
+ def _files
16
+ _manifest["files"].map do |original, file_hash|
17
+ { original: original, destination: file_hash["logical_path"] }
18
+ end
19
+ end
20
+ def _retarded_files
21
+ _files.reject do |file_hash|
22
+ /(js|css)$/i =~ file_hash[:original]
23
+ end
24
+ end
25
+ def _manifest
26
+ return [] if _manifest_name.blank?
27
+ JSON.parse File.read _manifest_name
28
+ end
29
+ def _manifest_name
30
+ Dir[Rails.root.join("public", "assets", "manifest-*.json")].first
31
+ end
32
+ end
@@ -0,0 +1,92 @@
1
+ module Generica; end
2
+ class Generica::EmailSlave
3
+ def dispatch_emails!
4
+ return puts "no emails" if _emails.blank?
5
+ _requests.update_all(status: :attempt_dispatch)
6
+ _postal_pipeline.call _emails
7
+ _requests.update_all(status: :delivered)
8
+ end
9
+ private
10
+ def _postal_pipeline
11
+ _group_by_user_emails >> _crunch_into_digest >> _send_off!
12
+ end
13
+ def _group_by_user_emails
14
+ -> (emails) { Sorter.group_by_user_emails emails }
15
+ end
16
+ def _crunch_into_digest
17
+ -> (email_hash) { _hash_map_crunch email_hash }
18
+ end
19
+ def _send_off!
20
+ -> (email_hash) { _hash_map_dispatch email_hash }
21
+ end
22
+ def _requests
23
+ @requests ||= _request_process.call Apiv1::EmailRequest
24
+ end
25
+ def _request_process
26
+ _consider_workload >> _consider_email_address
27
+ end
28
+ def _consider_email_address
29
+ -> (scope) { @user.present? ? scope.meant_for_email(@email) : scope }
30
+ end
31
+ def _consider_workload
32
+ -> (klass) { klass.belonging_to_the_user_with_oldest_undelivered }
33
+ end
34
+ def _emails
35
+ @emails ||= _requests.map(&:mailify)
36
+ end
37
+ def _hash_map_dispatch(hash)
38
+ _right_map(hash) { |email| Dispatcher.dispatch email }
39
+ end
40
+ def _hash_map_crunch(hash)
41
+ _right_map(hash) { |emails| Cruncher.crunch emails }
42
+ end
43
+ def _right_map(hash, &block)
44
+ thing = hash.map { |key_and_value| [key_and_value.first, yield(key_and_value.last)] }
45
+ Hash[thing]
46
+ end
47
+ end
48
+
49
+ class Generica::EmailSlave::Sorter
50
+ class << self
51
+ def group_by_user_emails(emails)
52
+ emails.reduce({}) do |hash, email|
53
+ hash[email.to.first] ||= []
54
+ hash[email.to.first].push email
55
+ hash
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ class Generica::EmailSlave::Cruncher
62
+ class << self
63
+ def crunch(emails)
64
+ return emails.first if emails.count < 2
65
+ Apiv1::AggregateMailer.summary emails
66
+ end
67
+ end
68
+ end
69
+
70
+ class Generica::EmailSlave::Dispatcher
71
+ class << self
72
+ def dispatch(email)
73
+ gmail.compose(email).deliver!
74
+ end
75
+ def gmail(&block)
76
+ Gmail.connect(username, password)
77
+ end
78
+ def username
79
+ _account_hash["username"]
80
+ end
81
+ def password
82
+ _account_hash["password"]
83
+ end
84
+ private
85
+ def _account_hash
86
+ @account_hash ||= YAML.load(_template.render)[Rails.env]
87
+ end
88
+ def _template
89
+ Tilt::ERBTemplate.new Rails.root.join("config", "email.yml").to_s
90
+ end
91
+ end
92
+ end