cloudrider 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -1
  3. data/cloudrider.gemspec +0 -3
  4. data/generica/app/assets/javascripts/adapters/admin/taxon.js.em +2 -0
  5. data/generica/app/assets/javascripts/components/hero-splash.js.em +1 -15
  6. data/generica/app/assets/javascripts/components/products-showcase.js.em +6 -0
  7. data/generica/app/assets/javascripts/components/select-locale.js.em +2 -2
  8. data/generica/app/assets/javascripts/components/tr-span.js.em +1 -0
  9. data/generica/app/assets/javascripts/components/tree/taxon-li.js.em +27 -2
  10. data/generica/app/assets/javascripts/components/tree/taxon-wrapper.js.em +5 -18
  11. data/generica/app/assets/javascripts/config/i18n-translations.js.ls +6 -2
  12. data/generica/app/assets/javascripts/config/router.js.ls +4 -1
  13. data/generica/app/assets/javascripts/controllers/admin/messages/index_controller.js.em +10 -0
  14. data/generica/app/assets/javascripts/controllers/admin/product/edit_controller.js.em +10 -1
  15. data/generica/app/assets/javascripts/controllers/admin/products/new_controller.js.em +6 -0
  16. data/generica/app/assets/javascripts/controllers/admin/taxon/edit_controller.js.em +17 -0
  17. data/generica/app/assets/javascripts/controllers/admin/taxons/new_controller.js.em +25 -0
  18. data/generica/app/assets/javascripts/controllers/messages/new_controller.js.em +16 -0
  19. data/generica/app/assets/javascripts/controllers/products/index_controller.js.em +5 -8
  20. data/generica/app/assets/javascripts/helpers/hash_ex.js.ls +6 -0
  21. data/generica/app/assets/javascripts/helpers/string_ex.js.ls +1 -1
  22. data/generica/app/assets/javascripts/models/admin/product.js.em +2 -0
  23. data/generica/app/assets/javascripts/models/admin/taxon.js.em +4 -1
  24. data/generica/app/assets/javascripts/models/message.js.em +7 -0
  25. data/generica/app/assets/javascripts/models/product.js.em +7 -2
  26. data/generica/app/assets/javascripts/models/taxon.js.em +3 -5
  27. data/generica/app/assets/javascripts/routes/admin/messages/index_route.js.em +1 -0
  28. data/generica/app/assets/javascripts/routes/admin/taxon_route.js.em +3 -0
  29. data/generica/app/assets/javascripts/routes/admin/taxons/index_route.js.em +1 -1
  30. data/generica/app/assets/javascripts/routes/admin/taxons/new_route.js.em +2 -0
  31. data/generica/app/assets/javascripts/routes/index_route.js.em +3 -2
  32. data/generica/app/assets/javascripts/routes/products/index_route.js.em +1 -1
  33. data/generica/app/assets/javascripts/templates/admin.emblem +17 -5
  34. data/generica/app/assets/javascripts/templates/admin/messages/index.emblem +19 -0
  35. data/generica/app/assets/javascripts/templates/admin/messages/slice.emblem +12 -0
  36. data/generica/app/assets/javascripts/templates/admin/product/edit.emblem +23 -6
  37. data/generica/app/assets/javascripts/templates/admin/products/new.emblem +17 -0
  38. data/generica/app/assets/javascripts/templates/admin/products/slice.emblem +6 -1
  39. data/generica/app/assets/javascripts/templates/admin/taxon/edit.emblem +36 -0
  40. data/generica/app/assets/javascripts/templates/admin/taxons/index.emblem +1 -1
  41. data/generica/app/assets/javascripts/templates/admin/taxons/new.emblem +40 -0
  42. data/generica/app/assets/javascripts/templates/admin/translations/index.emblem +1 -1
  43. data/generica/app/assets/javascripts/templates/components/product-display.emblem +4 -0
  44. data/generica/app/assets/javascripts/templates/components/product-listing.emblem +9 -0
  45. data/generica/app/assets/javascripts/templates/components/search-and-filter.emblem +1 -1
  46. data/generica/app/assets/javascripts/templates/components/site-nav/_top-nav.emblem +1 -1
  47. data/generica/app/assets/javascripts/templates/components/table-booths.emblem +3 -65
  48. data/generica/app/assets/javascripts/templates/components/tree-taxon-li.emblem +11 -3
  49. data/generica/app/assets/javascripts/templates/components/tree-taxon-ul.emblem +6 -7
  50. data/generica/app/assets/javascripts/templates/components/tree-taxon-wrapper.emblem +2 -2
  51. data/generica/app/assets/javascripts/templates/employees/index.emblem +32 -0
  52. data/generica/app/assets/javascripts/templates/index.emblem +2 -1
  53. data/generica/app/assets/javascripts/templates/messages/new.emblem +43 -0
  54. data/generica/app/assets/javascripts/templates/products/product/show.emblem +8 -0
  55. data/generica/app/assets/javascripts/transforms/form_data_transformer.js.ls +4 -0
  56. data/generica/app/assets/stylesheets/apiv1/_admin.css.scss +1 -0
  57. data/generica/app/assets/stylesheets/apiv1/admin/messages/_index.css.scss +34 -0
  58. data/generica/app/assets/stylesheets/apiv1/components/_product-display.css.scss +24 -0
  59. data/generica/app/assets/stylesheets/apiv1/components/_product-listing.css.scss +27 -2
  60. data/generica/app/assets/stylesheets/apiv1/components/_table-booths.css.scss +10 -0
  61. data/generica/app/assets/stylesheets/apiv1/components/_tree-taxon-wrapper.css.scss +37 -22
  62. data/generica/app/assets/stylesheets/apiv1/products/product/_show.css.scss +24 -0
  63. data/generica/app/assets/stylesheets/apiv1/shared/_constants.css.scss +2 -2
  64. data/generica/app/controllers/admin/taxons/create_controller.rb +26 -0
  65. data/generica/app/controllers/apiv1/i18n_translations/index_controller.rb +9 -5
  66. data/generica/app/controllers/apiv1/messages/create_controller.rb +17 -0
  67. data/generica/app/controllers/apiv1/messages/index_controller.rb +18 -0
  68. data/generica/app/controllers/apiv1/products/index_controller.rb +1 -1
  69. data/generica/app/controllers/apiv1/taxons/destroy_controller.rb +9 -0
  70. data/generica/app/controllers/apiv1/taxons/index_controller.rb +1 -0
  71. data/generica/app/controllers/apiv1/taxons/update_controller.rb +28 -0
  72. data/generica/app/controllers/apiv1/translations/create_controller.rb +5 -4
  73. data/generica/app/controllers/apiv1/translations/update_controller.rb +2 -2
  74. data/generica/app/models/admin/product_modifier.rb +16 -3
  75. data/generica/app/models/admin/taxon_factory.rb +23 -0
  76. data/generica/app/models/admin/taxon_relationships_factory.rb +32 -0
  77. data/generica/app/models/apiv1/employee.rb +1 -2
  78. data/generica/app/models/apiv1/message.rb +24 -0
  79. data/generica/app/models/apiv1/messages_machine.rb +31 -0
  80. data/generica/app/models/apiv1/product.rb +33 -13
  81. data/generica/app/models/apiv1/products_machine.rb +9 -1
  82. data/generica/app/models/apiv1/taxon.rb +8 -2
  83. data/generica/app/models/apiv1/translation.rb +73 -14
  84. data/generica/app/models/i18n/backend/active_record.rb +49 -0
  85. data/generica/app/varissets/javascripts/templates/components/introductory-lobby.emblem.erb +15 -1
  86. data/generica/app/varissets/javascripts/templates/components/table-booths.emblem.erb +39 -0
  87. data/generica/app/varissets/stylesheets/apiv1/components/_introductory-lobby.css.scss.erb +15 -1
  88. data/generica/app/varissets/stylesheets/apiv1/components/_table-booths.css.scss.erb +71 -0
  89. data/generica/config/initializers/i18n_backend.rb +7 -0
  90. data/generica/config/routes.rb +5 -2
  91. data/generica/db/migrate/20141010215459_create_apiv1_translations.rb +3 -1
  92. data/generica/db/migrate/20141105231548_add_showcase_priority_to_apiv1_products.rb +5 -0
  93. data/generica/db/migrate/20141107174821_create_apiv1_messages.rb +12 -0
  94. data/generica/db/schema.rb +11 -16
  95. data/generica/lib/tasks/production.rake +2 -1
  96. data/generica/spec/controllers/admin/taxons/create_controller_spec.rb +44 -0
  97. data/generica/spec/controllers/apiv1/messages/index_controller_spec.rb +5 -0
  98. data/generica/spec/controllers/apiv1/taxons/index_controller_spec.rb +59 -0
  99. data/generica/spec/controllers/apiv1/taxons/update_controller_spec.rb +54 -0
  100. data/generica/spec/controllers/apiv1/translations/create_controller_spec.rb +50 -0
  101. data/generica/spec/controllers/apiv1/translations/update_controller_spec.rb +54 -0
  102. data/generica/spec/factories/apiv1/product_factory.rb +12 -11
  103. data/generica/spec/models/admin/product_modifier_spec.rb +32 -0
  104. data/generica/spec/models/admin/taxon_relationships_factory_spec.rb +49 -0
  105. data/generica/spec/models/apiv1/message_spec.rb +16 -0
  106. data/generica/spec/models/apiv1/product_spec.rb +13 -12
  107. data/generica/spec/models/apiv1/translation_spec.rb +41 -0
  108. data/generica/spec/models/i18n/backend/active_record_spec.rb +27 -0
  109. data/lib/cloudrider/apiv1/base.rb +4 -4
  110. data/lib/cloudrider/apiv1/introductory_lobby_component.rb +1 -0
  111. data/lib/cloudrider/apiv1/introductory_lobby_sass.rb +9 -0
  112. data/lib/cloudrider/apiv1/table_booths_component.rb +6 -0
  113. data/lib/cloudrider/master_context.rb +105 -0
  114. data/lib/cloudrider/version.rb +1 -1
  115. metadata +43 -31
  116. data/generica/app/assets/javascripts/components/products-showcase.js.ls +0 -5
  117. data/generica/config/locales/ar.yml +0 -78
  118. data/generica/config/locales/ca.yml +0 -78
  119. data/generica/config/locales/cs.yml +0 -78
  120. data/generica/config/locales/da.yml +0 -78
  121. data/generica/config/locales/de.yml +0 -78
  122. data/generica/config/locales/el.yml +0 -78
  123. data/generica/config/locales/en.yml +0 -78
  124. data/generica/config/locales/es.yml +0 -78
  125. data/generica/config/locales/fi.yml +0 -78
  126. data/generica/config/locales/fr.yml +0 -78
  127. data/generica/config/locales/hu.yml +0 -78
  128. data/generica/config/locales/id.yml +0 -78
  129. data/generica/config/locales/is.yml +0 -78
  130. data/generica/config/locales/it.yml +0 -78
  131. data/generica/config/locales/ja.yml +0 -78
  132. data/generica/config/locales/ko.yml +0 -78
  133. data/generica/config/locales/ms.yml +0 -78
  134. data/generica/config/locales/nl.yml +0 -78
  135. data/generica/config/locales/no.yml +0 -78
  136. data/generica/config/locales/pl.yml +0 -78
  137. data/generica/config/locales/pt.yml +0 -78
  138. data/generica/config/locales/ru.yml +0 -78
  139. data/generica/config/locales/sv.yml +0 -78
  140. data/generica/config/locales/th.yml +0 -78
  141. data/generica/config/locales/tr.yml +0 -78
  142. data/generica/config/locales/zh-CN.yml +0 -78
  143. data/generica/config/locales/zh-TW.yml +0 -78
  144. data/lib/cloudrider/file_orders_maker.rb +0 -24
@@ -1,11 +1,15 @@
1
1
  class Apiv1::I18nTranslations::IndexController < ApplicationController
2
2
  def index
3
- _force_all_lazy_translations_to_load
4
- render json: { translations: I18n.backend.send(:translations), locale: I18n.locale }
3
+ render json: { translations: _translations, locale: _locale }
5
4
  end
6
5
  private
7
- def _force_all_lazy_translations_to_load
8
- I18n.t :dog
6
+ def _translations
7
+ { _locale.to_s => _key_value_hash }
8
+ end
9
+ def _locale
10
+ params[:locale].present? ? params[:locale] : I18n.locale
11
+ end
12
+ def _key_value_hash
13
+ Apiv1::Translation.locale(_locale).map(&:tl_hash).reduce(&:merge)
9
14
  end
10
-
11
15
  end
@@ -0,0 +1,17 @@
1
+ class Apiv1::Messages::CreateController < Apiv1::HomeController
2
+ def create
3
+ if _message.valid?
4
+ _message.save!
5
+ render json: { message: _message.to_ember_hash }
6
+ else
7
+ render json: _message.errors.to_h, status: :expectation_failed
8
+ end
9
+ end
10
+ private
11
+ def _message
12
+ @message ||= Apiv1::Message.new _message_params
13
+ end
14
+ def _message_params
15
+ params.require(:message).permit(:from_company, :sender_email, :subject_text, :message)
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ class Apiv1::Messages::IndexController < Admin::BaseController
2
+ def index
3
+ render json: { messages: _messages_hash, meta: _meta_hash }
4
+ end
5
+ private
6
+ def _messages_hash
7
+ _messages_machine.messages.map &:to_ember_hash
8
+ end
9
+ def _meta_hash
10
+ _messages_machine.meta
11
+ end
12
+ def _messages_machine
13
+ @messages_machine ||= Apiv1::MessagesMachine.new _query_params
14
+ end
15
+ def _query_params
16
+ params.permit(:page, :per, :order)
17
+ end
18
+ end
@@ -16,6 +16,6 @@ class Apiv1::Products::IndexController < Apiv1::HomeController
16
16
  @products_machine ||= Apiv1::ProductsMachine.new _query_params
17
17
  end
18
18
  def _query_params
19
- params.permit(:page, :per, :query).merge taxons: params[:taxons]
19
+ params.permit(:page, :per, :query, :order).merge taxons: params[:taxons]
20
20
  end
21
21
  end
@@ -0,0 +1,9 @@
1
+ class Apiv1::Taxons::DestroyController < Admin::BaseController
2
+ def destroy
3
+ render json: { taxon: _taxon.destroy }
4
+ end
5
+ private
6
+ def _taxon
7
+ @taxon ||= Apiv1::Taxon.find params[:id]
8
+ end
9
+ end
@@ -6,6 +6,7 @@ class Apiv1::Taxons::IndexController < Apiv1::HomeController
6
6
  def _taxons
7
7
  Apiv1::Taxon.pipeline -> (t) { t.by_root_genus(params[:root_genus]) if params[:root_genus].present? },
8
8
  -> (t) { t.children_of_parent(params[:parent_id]) if params[:parent_id].present? },
9
+ -> (t) { t.root_generation if params.has_key?(:parent_id) && params[:parent_id].blank? },
9
10
  -> (t) { t.all }
10
11
  end
11
12
  end
@@ -0,0 +1,28 @@
1
+ class Apiv1::Taxons::UpdateController < Admin::BaseController
2
+ def update
3
+ if _update_valid?
4
+ render json: { taxon: _update_taxon! }
5
+ else
6
+ render json: { taxon: _failure_hash }, status: :expectation_failed
7
+ end
8
+ end
9
+ private
10
+ def _failure_hash
11
+ _updated_taxon.errors.to_h
12
+ end
13
+ def _update_valid?
14
+ _updated_taxon.valid?
15
+ end
16
+ def _updated_taxon
17
+ @taxon ||= _taxon.tap { |t| t.assign_attributes _taxon_params }
18
+ end
19
+ def _update_taxon!
20
+ _updated_taxon.tap(&:save!)
21
+ end
22
+ def _taxon
23
+ Apiv1::Taxon.find params[:id]
24
+ end
25
+ def _taxon_params
26
+ params.require(:taxon).permit :taxon_name, :explanation
27
+ end
28
+ end
@@ -2,6 +2,7 @@ class Apiv1::Translations::CreateController < Admin::BaseController
2
2
 
3
3
  def create
4
4
  if _save_successful?
5
+ _translation.save!
5
6
  render json: { translation: _translation_hash }
6
7
  else
7
8
  render json: { translation: _failure_hash }, status: :expectation_failed
@@ -10,19 +11,19 @@ class Apiv1::Translations::CreateController < Admin::BaseController
10
11
 
11
12
  private
12
13
  def _save_successful?
13
- _translation.valid? && _translation.save!
14
+ _translation.valid?
14
15
  end
15
16
 
16
17
  def _translation
17
- @translation ||= Apiv1::Translation.find_or_create_by! _translation_params
18
+ @translation ||= Apiv1::Translation.new _translation_params
18
19
  end
19
20
 
20
21
  def _translation_params
21
- params.require(:translation).permit(:key, :locale, :translated_text)
22
+ params.require(:translation).permit(:key, :locale, :translated_text, :value)
22
23
  end
23
24
 
24
25
  def _translation_hash
25
- _translation.attributes
26
+ _translation.to_ember_hash
26
27
  end
27
28
 
28
29
  def _failure_hash
@@ -1,6 +1,6 @@
1
1
  class Apiv1::Translations::UpdateController < Admin::BaseController
2
2
 
3
- def create
3
+ def update
4
4
  if _update_successful?
5
5
  render json: { translation: _translation_hash }
6
6
  else
@@ -22,7 +22,7 @@ class Apiv1::Translations::UpdateController < Admin::BaseController
22
22
  end
23
23
 
24
24
  def _translation_params
25
- params.require(:translation).permit(:key, :locale, :translated_text)
25
+ params.require(:translation).permit(:key, :locale, :translated_text, :value)
26
26
  end
27
27
 
28
28
  def _translation_hash
@@ -13,11 +13,12 @@ class Admin::ProductModifier
13
13
  end
14
14
 
15
15
  def update!
16
- _product.tap &:save!
16
+ _bad_relationships.map(&:destroy)
17
+ _product.tap(&:save!)
17
18
  end
18
19
 
19
20
  def satisfy_specifications?
20
- _pictures.all?(&:valid?) && _product.valid?
21
+ _pictures.all?(&:valid?) && _good_relationships.all?(&:valid?) && _product.valid?
21
22
  end
22
23
 
23
24
  private
@@ -26,13 +27,25 @@ class Admin::ProductModifier
26
27
  end
27
28
 
28
29
  def _assignable_attributes
29
- @raw_params.permit *Apiv1::Product::Fields
30
+ @raw_params.permit(*Apiv1::Product::Fields)
30
31
  end
31
32
 
32
33
  def _pictures
33
34
  _pictures_factory.pictures
34
35
  end
35
36
 
37
+ def _bad_relationships
38
+ _relationships_factory.bad_relationships
39
+ end
40
+
41
+ def _good_relationships
42
+ _relationships_factory.good_relationships
43
+ end
44
+
45
+ def _relationships_factory
46
+ @relationships_factory ||= Admin::TaxonRelationshipsFactory.new _product, @raw_params[:taxons]
47
+ end
48
+
36
49
  def _pictures_factory
37
50
  @pictures_factory ||= Admin::PicturesFactory.new _product, @raw_params[:pictures]
38
51
  end
@@ -0,0 +1,23 @@
1
+ class Admin::TaxonFactory
2
+ delegate :save!,
3
+ to: :_taxon
4
+ def initialize(params)
5
+ @params = params
6
+ end
7
+ def satisfy_specifications?
8
+ _taxon.valid?
9
+ end
10
+ def taxon_hash
11
+ { taxon: _taxon.to_ember_hash }
12
+ end
13
+ def error_hash
14
+ _taxon.errors.to_h
15
+ end
16
+ private
17
+ def _taxon
18
+ @taxon ||= Apiv1::Taxon.new _taxon_params
19
+ end
20
+ def _taxon_params
21
+ @params.permit *Apiv1::Taxon::Fields
22
+ end
23
+ end
@@ -0,0 +1,32 @@
1
+ class Admin::TaxonRelationshipsFactory
2
+ def initialize(product, params)
3
+ @product = product
4
+ @taxons = Apiv1::Taxon.find _arrayify params
5
+ end
6
+ def good_relationships
7
+ @good_relationships ||= _good_taxon_ids.map { |id| _existing_relationship(id) || _new_relationship(id) }
8
+ end
9
+ def bad_relationships
10
+ @bad_relationships ||= @product.taxon_relationships.where taxon_id: _bad_taxon_ids
11
+ end
12
+ private
13
+ def _arrayify(array_like)
14
+ return array_like if array_like.is_a? Array
15
+ array_like.to_a.map(&:last)
16
+ end
17
+ def _existing_relationship(id)
18
+ @product.taxon_relationships.find_by_taxon_id id
19
+ end
20
+ def _new_relationship(id)
21
+ @product.taxon_relationships.new taxon_id: id
22
+ end
23
+ def _good_taxon_ids
24
+ @taxons.map(&:id)
25
+ end
26
+ def _bad_taxon_ids
27
+ _existing_taxon_ids - _good_taxon_ids
28
+ end
29
+ def _existing_taxon_ids
30
+ @product.taxons.map &:id
31
+ end
32
+ end
@@ -7,7 +7,6 @@
7
7
  # employee_title :string(255)
8
8
  # email :string(255)
9
9
  # phone_number :string(255)
10
- # picture_id :integer
11
10
  # created_at :datetime
12
11
  # updated_at :datetime
13
12
  #
@@ -26,4 +25,4 @@ class Apiv1::Employee < ActiveRecord::Base
26
25
  return attributes.merge mug_shot: pictures.first.pic(:thumb) if pictures.present?
27
26
  attributes
28
27
  end
29
- end
28
+ end
@@ -0,0 +1,24 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: apiv1_messages
4
+ #
5
+ # id :integer not null, primary key
6
+ # from_company :string(255)
7
+ # sender_email :string(255)
8
+ # subject_text :string(255)
9
+ # message :text
10
+ # created_at :datetime
11
+ # updated_at :datetime
12
+ #
13
+
14
+ class Apiv1::Message < ActiveRecord::Base
15
+ validates :from_company,
16
+ :sender_email,
17
+ :subject_text,
18
+ :message,
19
+ presence: true
20
+
21
+ def to_ember_hash
22
+ attributes
23
+ end
24
+ end
@@ -0,0 +1,31 @@
1
+ class Apiv1::MessagesMachine
2
+ def initialize(params)
3
+ @params = params
4
+ end
5
+ def messages
6
+ @messages ||= _filter_pipeline.call Apiv1::Message
7
+ end
8
+ def meta
9
+ {
10
+ total: Apiv1::Message.count,
11
+ per: _per_page,
12
+ page: _page
13
+ }
14
+ end
15
+ private
16
+ def _filter_pipeline
17
+ _order_by_created_at >> _paginate
18
+ end
19
+ def _order_by_created_at
20
+ -> (t) { t.order "created_at desc" }
21
+ end
22
+ def _paginate
23
+ -> (t) { t.page(_page).per(_per_page)}
24
+ end
25
+ def _per_page
26
+ @params[:per] || 15
27
+ end
28
+ def _page
29
+ @params[:page] || 1
30
+ end
31
+ end
@@ -2,23 +2,33 @@
2
2
  #
3
3
  # Table name: apiv1_products
4
4
  #
5
- # id :integer not null, primary key
6
- # permalink :string(255)
7
- # sku :string(255)
8
- # material :string(255)
9
- # quality :string(255)
10
- # price :string(255)
11
- # amount :string(255)
12
- # place :string(255)
13
- # others :text
14
- # created_at :datetime
15
- # updated_at :datetime
5
+ # id :integer not null, primary key
6
+ # permalink :string(255)
7
+ # sku :string(255)
8
+ # material :string(255)
9
+ # quality :string(255)
10
+ # price :string(255)
11
+ # amount :string(255)
12
+ # place :string(255)
13
+ # others :text
14
+ # created_at :datetime
15
+ # updated_at :datetime
16
+ # showcase_order :integer
16
17
  #
17
18
 
18
19
  class Apiv1::Product < ActiveRecord::Base
19
20
  include ::Elasticsearch::Model
20
21
  include ::Elasticsearch::Model::Callbacks
21
- Fields = [:sku, :material, :price, :amount, :place, :others, :quality]
22
+ Fields = [
23
+ :sku,
24
+ :material,
25
+ :price,
26
+ :amount,
27
+ :place,
28
+ :others,
29
+ :quality,
30
+ :showcase_order
31
+ ]
22
32
  has_many :taxon_relationships,
23
33
  class_name: 'Apiv1::Listings::TaxonRelationship',
24
34
  as: :listing
@@ -46,11 +56,18 @@ class Apiv1::Product < ActiveRecord::Base
46
56
  scope :order_by_created_at,
47
57
  -> { order "#{self.table_name}.created_at desc"}
48
58
 
59
+ scope :worthy_of_showcase,
60
+ -> { where "#{self.table_name}.showcase_order is not null" }
61
+
62
+ scope :order_by_showcase,
63
+ -> { order "#{self.table_name}.showcase_order asc"}
64
+
49
65
  validates :material,
50
66
  :pictures,
51
67
  presence: true
52
68
 
53
- before_create :_make_permalink
69
+ before_create :_make_permalink,
70
+ :_make_showcase_order
54
71
 
55
72
  class << self
56
73
  def find_by_permalink_or_id!(permalink_or_id)
@@ -68,4 +85,7 @@ class Apiv1::Product < ActiveRecord::Base
68
85
  def _make_permalink
69
86
  self.permalink ||= Apiv1::Permalinkifier.permalinkify material
70
87
  end
88
+ def _make_showcase_order
89
+ self.showcase_order ||= self.class.last.try(:id).to_i + 1
90
+ end
71
91
  end
@@ -36,7 +36,12 @@ class Apiv1::ProductsMachine
36
36
  -> (t) { t.page(_page).per(_per_page) }
37
37
  end
38
38
  def _process_ordering
39
- -> (product) { product.order_by_created_at }
39
+ case _order
40
+ when "showcase"
41
+ -> (product) { product.order_by_showcase }
42
+ else
43
+ -> (product) { product.order_by_created_at }
44
+ end
40
45
  end
41
46
  def _process_taxons
42
47
  lambda do |product|
@@ -62,4 +67,7 @@ class Apiv1::ProductsMachine
62
67
  def _per_page
63
68
  params[:per] || 15
64
69
  end
70
+ def _order
71
+ params[:order]
72
+ end
65
73
  end
@@ -6,14 +6,15 @@
6
6
  # parent_id :integer
7
7
  # root_genus :string(255) not null
8
8
  # taxon_name :string(255) not null
9
- # permalink :string(255) not null
10
9
  # explanation :string(255)
10
+ # permalink :string(255) not null
11
11
  # first_child_at :datetime
12
12
  # created_at :datetime
13
13
  # updated_at :datetime
14
14
  #
15
15
 
16
16
  class Apiv1::Taxon < ActiveRecord::Base
17
+ Fields = [:taxon_name, :explanation, :parent_id]
17
18
  class << self
18
19
  def find_by_permalink_genus(str, genus)
19
20
  permalink = Apiv1::Permalinkifier.permalinkify str
@@ -40,7 +41,8 @@ class Apiv1::Taxon < ActiveRecord::Base
40
41
  class_name: 'Apiv1::Taxon',
41
42
  foreign_key: 'parent_id'
42
43
 
43
- before_validation :_create_permalink
44
+ before_validation :_create_permalink,
45
+ :_create_root_genus
44
46
  before_create :_inform_parent
45
47
 
46
48
  validates :root_genus,
@@ -82,6 +84,10 @@ class Apiv1::Taxon < ActiveRecord::Base
82
84
  def _create_permalink
83
85
  self.permalink ||= Apiv1::Permalinkifier.permalinkify taxon_name
84
86
  end
87
+ def _create_root_genus
88
+ self.root_genus ||= parent.try :root_genus
89
+ self.root_genus ||= Apiv1::Permalinkifier.permalinkify taxon_name
90
+ end
85
91
  def _inform_parent
86
92
  parent.try :have_first_child!
87
93
  end