elasticord 1.0.0

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 (208) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +5 -0
  3. data/Gemfile.lock +160 -0
  4. data/README.md +35 -0
  5. data/Rakefile +30 -0
  6. data/bin/setup_config_files.sh +19 -0
  7. data/config/boot.rb +39 -0
  8. data/dash_overlord.gemspec +39 -0
  9. data/db/migrate/20160321174733_devise_create_users.rb +43 -0
  10. data/db/migrate/20161014155300_create_bee_videos.rb +21 -0
  11. data/db/migrate/20161014160600_create_subtitle_lines.rb +11 -0
  12. data/db/migrate/20161017103500_add_width_and_height_to_bee_videos.rb +21 -0
  13. data/db/migrate/20161017161300_add_start_and_end_time_to_subtitle_lines.rb +17 -0
  14. data/db/migrate/20161017185300_add_fulltext_search_to_subtitle_lines.rb +13 -0
  15. data/db/migrate/20161018150400_add_subtitle_url_to_bee_videos.rb +5 -0
  16. data/db/migrate/20161026162500_add_country_category_and_extra_to_bee_videos.rb +7 -0
  17. data/db/migrate/20161124152600_add_segment_uid_to_bee_videos.rb +5 -0
  18. data/db/migrate/20161223113800_add_user_data_to_bee_videos.rb +17 -0
  19. data/db/migrate/20170105102428_add_segment_uid_to_subtitle_lines.rb +5 -0
  20. data/db/migrate/20170209171700_add_client_id_to_users.rb +5 -0
  21. data/db/migrate/20170209173800_create_admins.rb +8 -0
  22. data/db/migrate/20170209190400_create_clients.rb +8 -0
  23. data/db/migrate/20170210110800_create_chart_configs.rb +35 -0
  24. data/elasticord.gemspec +26 -0
  25. data/lib/dash_overlord.rb +16 -0
  26. data/lib/dash_overlord/config.rb +39 -0
  27. data/lib/dash_overlord/entities/base.rb +13 -0
  28. data/lib/dash_overlord/entities/v1/base.rb +10 -0
  29. data/lib/dash_overlord/entities/v1/chart_source.rb +10 -0
  30. data/lib/dash_overlord/entities/v1/meta_data.rb +10 -0
  31. data/lib/dash_overlord/locales/v1/en/admins.yml +7 -0
  32. data/lib/dash_overlord/locales/v1/en/chart_configs.yml +7 -0
  33. data/lib/dash_overlord/locales/v1/en/clients.yml +7 -0
  34. data/lib/dash_overlord/locales/v1/en/en.yml +213 -0
  35. data/lib/dash_overlord/locales/v1/en/users.yml +9 -0
  36. data/lib/dash_overlord/models/base.rb +12 -0
  37. data/lib/dash_overlord/models/v1/admin.rb +10 -0
  38. data/lib/dash_overlord/models/v1/answer.rb +10 -0
  39. data/lib/dash_overlord/models/v1/base.rb +11 -0
  40. data/lib/dash_overlord/models/v1/basic_user.rb +34 -0
  41. data/lib/dash_overlord/models/v1/bee_video.rb +30 -0
  42. data/lib/dash_overlord/models/v1/chart_config.rb +48 -0
  43. data/lib/dash_overlord/models/v1/client.rb +10 -0
  44. data/lib/dash_overlord/models/v1/dynamo_db/base.rb +98 -0
  45. data/lib/dash_overlord/models/v1/dynamo_db/migration.rb +52 -0
  46. data/lib/dash_overlord/models/v1/dynamo_db/video.rb +11 -0
  47. data/lib/dash_overlord/models/v1/elastic_search.rb +12 -0
  48. data/lib/dash_overlord/models/v1/subtitle_line.rb +21 -0
  49. data/lib/dash_overlord/models/v1/user.rb +10 -0
  50. data/lib/dash_overlord/requirable.rb +110 -0
  51. data/lib/dash_overlord/serializers/base.rb +127 -0
  52. data/lib/dash_overlord/serializers/v1/admins/base.rb +15 -0
  53. data/lib/dash_overlord/serializers/v1/admins/log_in.rb +13 -0
  54. data/lib/dash_overlord/serializers/v1/admins/show.rb +13 -0
  55. data/lib/dash_overlord/serializers/v1/base.rb +17 -0
  56. data/lib/dash_overlord/serializers/v1/chart_configs/base.rb +15 -0
  57. data/lib/dash_overlord/serializers/v1/chart_configs/create.rb +13 -0
  58. data/lib/dash_overlord/serializers/v1/chart_configs/delete.rb +12 -0
  59. data/lib/dash_overlord/serializers/v1/chart_configs/index.rb +15 -0
  60. data/lib/dash_overlord/serializers/v1/chart_configs/show.rb +59 -0
  61. data/lib/dash_overlord/serializers/v1/chart_configs/update.rb +12 -0
  62. data/lib/dash_overlord/serializers/v1/clients/base.rb +15 -0
  63. data/lib/dash_overlord/serializers/v1/clients/create.rb +13 -0
  64. data/lib/dash_overlord/serializers/v1/clients/delete.rb +12 -0
  65. data/lib/dash_overlord/serializers/v1/clients/index.rb +15 -0
  66. data/lib/dash_overlord/serializers/v1/clients/show.rb +15 -0
  67. data/lib/dash_overlord/serializers/v1/clients/update.rb +12 -0
  68. data/lib/dash_overlord/serializers/v1/meta_data/pagination.rb +19 -0
  69. data/lib/dash_overlord/serializers/v1/meta_data/pagination_with_filters.rb +13 -0
  70. data/lib/dash_overlord/serializers/v1/subtitle_lines/base.rb +15 -0
  71. data/lib/dash_overlord/serializers/v1/subtitle_lines/show.rb +35 -0
  72. data/lib/dash_overlord/serializers/v1/users/base.rb +15 -0
  73. data/lib/dash_overlord/serializers/v1/users/create.rb +13 -0
  74. data/lib/dash_overlord/serializers/v1/users/delete.rb +12 -0
  75. data/lib/dash_overlord/serializers/v1/users/index.rb +15 -0
  76. data/lib/dash_overlord/serializers/v1/users/log_in.rb +13 -0
  77. data/lib/dash_overlord/serializers/v1/users/show.rb +13 -0
  78. data/lib/dash_overlord/serializers/v1/users/update.rb +12 -0
  79. data/lib/dash_overlord/serializers/v1/videos/base.rb +15 -0
  80. data/lib/dash_overlord/serializers/v1/videos/index.rb +15 -0
  81. data/lib/dash_overlord/serializers/v1/videos/show.rb +43 -0
  82. data/lib/dash_overlord/use_cases/base.rb +87 -0
  83. data/lib/dash_overlord/use_cases/context.rb +72 -0
  84. data/lib/dash_overlord/use_cases/v1/admins/find_current_admin.rb +15 -0
  85. data/lib/dash_overlord/use_cases/v1/admins/log_in/base.rb +26 -0
  86. data/lib/dash_overlord/use_cases/v1/admins/show_current_admin/base.rb +22 -0
  87. data/lib/dash_overlord/use_cases/v1/admins/show_current_admin/find_current_admin.rb +21 -0
  88. data/lib/dash_overlord/use_cases/v1/admins/show_current_admin/get_current_admin.rb +20 -0
  89. data/lib/dash_overlord/use_cases/v1/base.rb +8 -0
  90. data/lib/dash_overlord/use_cases/v1/chart_configs/cache_answer_values/base.rb +19 -0
  91. data/lib/dash_overlord/use_cases/v1/chart_configs/cache_answer_values/build_cache.rb +85 -0
  92. data/lib/dash_overlord/use_cases/v1/chart_configs/create/assign_attributes_to_chart_config.rb +48 -0
  93. data/lib/dash_overlord/use_cases/v1/chart_configs/create/base.rb +34 -0
  94. data/lib/dash_overlord/use_cases/v1/chart_configs/create/build_chart_config.rb +17 -0
  95. data/lib/dash_overlord/use_cases/v1/chart_configs/create/validate_chart_config.rb +76 -0
  96. data/lib/dash_overlord/use_cases/v1/chart_configs/delete/base.rb +26 -0
  97. data/lib/dash_overlord/use_cases/v1/chart_configs/delete/delete_chart_config.rb +24 -0
  98. data/lib/dash_overlord/use_cases/v1/chart_configs/get_chart_config.rb +16 -0
  99. data/lib/dash_overlord/use_cases/v1/chart_configs/index/base.rb +24 -0
  100. data/lib/dash_overlord/use_cases/v1/chart_configs/index/find_chart_configs.rb +17 -0
  101. data/lib/dash_overlord/use_cases/v1/chart_configs/index/search_and_paginate_chart_configs.rb +17 -0
  102. data/lib/dash_overlord/use_cases/v1/chart_configs/save_chart_config.rb +19 -0
  103. data/lib/dash_overlord/use_cases/v1/chart_configs/show/base.rb +23 -0
  104. data/lib/dash_overlord/use_cases/v1/chart_configs/show/find_chart_config.rb +21 -0
  105. data/lib/dash_overlord/use_cases/v1/chart_configs/update/base.rb +32 -0
  106. data/lib/dash_overlord/use_cases/v1/clients/create/assign_attributes_to_client.rb +27 -0
  107. data/lib/dash_overlord/use_cases/v1/clients/create/base.rb +29 -0
  108. data/lib/dash_overlord/use_cases/v1/clients/create/build_client.rb +17 -0
  109. data/lib/dash_overlord/use_cases/v1/clients/create/validate_client.rb +25 -0
  110. data/lib/dash_overlord/use_cases/v1/clients/delete/base.rb +26 -0
  111. data/lib/dash_overlord/use_cases/v1/clients/delete/delete_client.rb +22 -0
  112. data/lib/dash_overlord/use_cases/v1/clients/index/base.rb +24 -0
  113. data/lib/dash_overlord/use_cases/v1/clients/index/find_clients.rb +17 -0
  114. data/lib/dash_overlord/use_cases/v1/clients/index/search_and_paginate_clients.rb +17 -0
  115. data/lib/dash_overlord/use_cases/v1/clients/save_client.rb +19 -0
  116. data/lib/dash_overlord/use_cases/v1/clients/show/base.rb +23 -0
  117. data/lib/dash_overlord/use_cases/v1/clients/show/find_client.rb +21 -0
  118. data/lib/dash_overlord/use_cases/v1/clients/show/get_client.rb +17 -0
  119. data/lib/dash_overlord/use_cases/v1/clients/update/base.rb +27 -0
  120. data/lib/dash_overlord/use_cases/v1/dummy_data/create/charts/base.rb +38 -0
  121. data/lib/dash_overlord/use_cases/v1/dummy_data/create/charts/build.rb +64 -0
  122. data/lib/dash_overlord/use_cases/v1/repositories/dynamo_db/client.rb +39 -0
  123. data/lib/dash_overlord/use_cases/v1/repositories/dynamo_db/create/batch.rb +46 -0
  124. data/lib/dash_overlord/use_cases/v1/repositories/dynamo_db/query/table.rb +25 -0
  125. data/lib/dash_overlord/use_cases/v1/shared/log_in/assign_attributes_to_user_model.rb +28 -0
  126. data/lib/dash_overlord/use_cases/v1/shared/log_in/base.rb +21 -0
  127. data/lib/dash_overlord/use_cases/v1/shared/log_in/build_user_model.rb +19 -0
  128. data/lib/dash_overlord/use_cases/v1/shared/log_in/get_existing_user_model.rb +20 -0
  129. data/lib/dash_overlord/use_cases/v1/shared/log_in/switch_user_model_by_existing_user_model.rb +17 -0
  130. data/lib/dash_overlord/use_cases/v1/shared/log_in/validate_user_model.rb +52 -0
  131. data/lib/dash_overlord/use_cases/v1/shared/search_and_paginate/apply_filters.rb +25 -0
  132. data/lib/dash_overlord/use_cases/v1/shared/search_and_paginate/apply_full_text_search.rb +22 -0
  133. data/lib/dash_overlord/use_cases/v1/shared/search_and_paginate/apply_pagination.rb +72 -0
  134. data/lib/dash_overlord/use_cases/v1/shared/search_and_paginate/base.rb +36 -0
  135. data/lib/dash_overlord/use_cases/v1/users/create/assign_attributes_to_user.rb +26 -0
  136. data/lib/dash_overlord/use_cases/v1/users/create/base.rb +29 -0
  137. data/lib/dash_overlord/use_cases/v1/users/create/build_user.rb +17 -0
  138. data/lib/dash_overlord/use_cases/v1/users/create/validate_user.rb +27 -0
  139. data/lib/dash_overlord/use_cases/v1/users/delete/base.rb +26 -0
  140. data/lib/dash_overlord/use_cases/v1/users/delete/delete_user.rb +22 -0
  141. data/lib/dash_overlord/use_cases/v1/users/find_current_user.rb +15 -0
  142. data/lib/dash_overlord/use_cases/v1/users/index/base.rb +23 -0
  143. data/lib/dash_overlord/use_cases/v1/users/index/search_and_paginate_users.rb +17 -0
  144. data/lib/dash_overlord/use_cases/v1/users/log_in/base.rb +26 -0
  145. data/lib/dash_overlord/use_cases/v1/users/save_user.rb +23 -0
  146. data/lib/dash_overlord/use_cases/v1/users/show/base.rb +23 -0
  147. data/lib/dash_overlord/use_cases/v1/users/show/find_user.rb +21 -0
  148. data/lib/dash_overlord/use_cases/v1/users/show/get_user.rb +17 -0
  149. data/lib/dash_overlord/use_cases/v1/users/show_current_user/base.rb +22 -0
  150. data/lib/dash_overlord/use_cases/v1/users/show_current_user/find_current_user.rb +21 -0
  151. data/lib/dash_overlord/use_cases/v1/users/show_current_user/get_current_user.rb +20 -0
  152. data/lib/dash_overlord/use_cases/v1/users/update/base.rb +27 -0
  153. data/lib/dash_overlord/use_cases/v1/videos/index/base.rb +31 -0
  154. data/lib/dash_overlord/use_cases/v1/videos/index/dynamodb/base.rb +19 -0
  155. data/lib/dash_overlord/use_cases/v1/videos/index/dynamodb/search_and_paginate_videos.rb +20 -0
  156. data/lib/dash_overlord/use_cases/v1/videos/index/elastic_search/base.rb +19 -0
  157. data/lib/dash_overlord/use_cases/v1/videos/index/elastic_search/search_and_paginate_videos.rb +97 -0
  158. data/lib/dash_overlord/use_cases/v1/videos/index/postgres/base.rb +22 -0
  159. data/lib/dash_overlord/use_cases/v1/videos/index/postgres/build_video_searched_subtitles.rb +42 -0
  160. data/lib/dash_overlord/use_cases/v1/videos/index/postgres/get_filters.rb +91 -0
  161. data/lib/dash_overlord/use_cases/v1/videos/index/postgres/hhc.json +206 -0
  162. data/lib/dash_overlord/use_cases/v1/videos/index/postgres/search_and_paginate_videos.rb +35 -0
  163. data/lib/dash_overlord/use_cases/v1/videos/index/postgres/search_on_subtitle_lines.rb +26 -0
  164. data/lib/dash_overlord/version.rb +3 -0
  165. data/lib/elasticord.rb +24 -0
  166. data/lib/elasticord/base.rb +80 -0
  167. data/lib/elasticord/config.rb +23 -0
  168. data/lib/elasticord/orm/create.rb +32 -0
  169. data/lib/elasticord/orm/delete.rb +23 -0
  170. data/lib/elasticord/orm/get.rb +34 -0
  171. data/lib/elasticord/orm/index.rb +15 -0
  172. data/lib/elasticord/version.rb +3 -0
  173. data/lib/tasks/create_dummy_data.rake +11 -0
  174. data/spec/dash_overlord/use_cases/v1/admins/log_in_spec.rb +105 -0
  175. data/spec/dash_overlord/use_cases/v1/admins/show_current_admin_spec.rb +51 -0
  176. data/spec/dash_overlord/use_cases/v1/chart_configs/create_spec.rb +77 -0
  177. data/spec/dash_overlord/use_cases/v1/chart_configs/delete_spec.rb +70 -0
  178. data/spec/dash_overlord/use_cases/v1/chart_configs/index_spec.rb +126 -0
  179. data/spec/dash_overlord/use_cases/v1/chart_configs/show_spec.rb +73 -0
  180. data/spec/dash_overlord/use_cases/v1/chart_configs/update_spec.rb +104 -0
  181. data/spec/dash_overlord/use_cases/v1/clients/create_spec.rb +85 -0
  182. data/spec/dash_overlord/use_cases/v1/clients/delete_spec.rb +70 -0
  183. data/spec/dash_overlord/use_cases/v1/clients/index_spec.rb +121 -0
  184. data/spec/dash_overlord/use_cases/v1/clients/show_spec.rb +70 -0
  185. data/spec/dash_overlord/use_cases/v1/clients/update_spec.rb +112 -0
  186. data/spec/dash_overlord/use_cases/v1/users/create_spec.rb +89 -0
  187. data/spec/dash_overlord/use_cases/v1/users/delete_spec.rb +70 -0
  188. data/spec/dash_overlord/use_cases/v1/users/index_spec.rb +121 -0
  189. data/spec/dash_overlord/use_cases/v1/users/log_in_spec.rb +105 -0
  190. data/spec/dash_overlord/use_cases/v1/users/show_current_admin_spec.rb +51 -0
  191. data/spec/dash_overlord/use_cases/v1/users/show_spec.rb +69 -0
  192. data/spec/dash_overlord/use_cases/v1/users/update_spec.rb +119 -0
  193. data/spec/dash_overlord/use_cases/v1/videos/index/base_spec.rb +39 -0
  194. data/spec/dash_overlord/use_cases/v1/videos/index/dynamo_db_spec.rb +84 -0
  195. data/spec/dash_overlord/use_cases/v1/videos/index/elastic_search_spec.rb +121 -0
  196. data/spec/dash_overlord/use_cases/v1/videos/index/postgres_spec.rb +116 -0
  197. data/spec/elasticord/base_spec.rb +242 -0
  198. data/spec/factories/v1/admins.rb +8 -0
  199. data/spec/factories/v1/bee_videos.rb +18 -0
  200. data/spec/factories/v1/chart_configs.rb +23 -0
  201. data/spec/factories/v1/clients.rb +13 -0
  202. data/spec/factories/v1/users.rb +15 -0
  203. data/spec/spec_helper.rb +49 -0
  204. data/spec/support/helpers.rb +65 -0
  205. data/spec/support/shared_missing_admin.rb +39 -0
  206. data/spec/support/shared_missing_user.rb +39 -0
  207. data/tasks/console.rake +10 -0
  208. metadata +325 -0
@@ -0,0 +1,38 @@
1
+ module DashOverlord
2
+ module UseCases
3
+ module V1
4
+ module DummyData
5
+ module Create
6
+ module Charts
7
+
8
+ class Base < V1::Base
9
+ context_reader :num_of_records, :repo
10
+
11
+ def perform
12
+ return unless num_of_records && repo
13
+
14
+ invoke! Charts::Build
15
+
16
+ repository_create.perform \
17
+ items: context.items
18
+ end
19
+
20
+ protected
21
+ def repository_create
22
+ [
23
+ "DashOverlord",
24
+ "UseCases",
25
+ "V1",
26
+ "Repositories",
27
+ repo.classify,
28
+ "Create",
29
+ "Batch"
30
+ ].join('::').constantize
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,64 @@
1
+ module DashOverlord
2
+ module UseCases
3
+ module V1
4
+ module DummyData
5
+ module Create
6
+ module Charts
7
+ class Build < V1::Base
8
+ context_reader :num_of_records, :repo
9
+
10
+ RECORD_STRUCTURE = {
11
+ "gender" => ["Male", "Female"],
12
+ "age" => ["0-8", "9-17", "18-30", "30-50", ">50"],
13
+ "column_1" => :numeric,
14
+ "column_2" => ["Sony", "Nintendo", "Sega", "Ubisoft", "Naughty Dog", "Electronic Arts"],
15
+ "column_3" => :numeric,
16
+ "column_4" => :numeric,
17
+ "column_5" => :numeric,
18
+ "column_6" => :numeric,
19
+ "column_7" => :numeric,
20
+ "column_8" => :numeric,
21
+ "column_9" => :numeric,
22
+ "column_10" => :numeric,
23
+ "column_11" => :numeric,
24
+ "column_12" => :numeric,
25
+ "column_13" => :numeric
26
+ }
27
+
28
+ def perform
29
+ context.items = build_dummy_data
30
+ end
31
+
32
+ protected ########## PROTECTED #################################
33
+
34
+ def build_dummy_data
35
+ num_of_records.times.map do |index|
36
+ build_record(RECORD_STRUCTURE) \
37
+ .merge \
38
+ "submission_id" => "#{index + 1}",
39
+ "dashboard_id" => 1
40
+ end
41
+ end
42
+
43
+ def build_value(type)
44
+ if type.is_a?(Array)
45
+ type.sample
46
+ elsif type == :numeric
47
+ rand(100)
48
+ end
49
+ end
50
+
51
+ def build_record(structure)
52
+ structure.each_with_object({}) do |(key, type), object|
53
+ object.merge! \
54
+ "#{key}" => build_value(type)
55
+ end
56
+ end
57
+
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,39 @@
1
+ require 'aws-sdk'
2
+
3
+ module DashOverlord
4
+ module UseCases
5
+ module V1
6
+ module Repositories
7
+ module DynamoDb
8
+ class Client < V1::Base
9
+
10
+ def perform
11
+ context.client = build_dynamo_client
12
+ end
13
+
14
+ protected ################## PROTECTED #################
15
+
16
+ def build_dynamo_client
17
+ Aws::DynamoDB::Client.new(
18
+ region: aws_region,
19
+ credentials: aws_credentials,
20
+ endpoint: "http://localhost:8000"
21
+ )
22
+ end
23
+
24
+ def aws_region
25
+ DashOverlord::V1::Config.get(:dynamodb_region)
26
+ end
27
+
28
+ def aws_credentials
29
+ Aws::Credentials.new(
30
+ DashOverlord::V1::Config.get(:dynamodb_access_key),
31
+ DashOverlord::V1::Config.get(:dynamodb_secret_key)
32
+ )
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,46 @@
1
+ module DashOverlord
2
+ module UseCases
3
+ module V1
4
+ module Repositories
5
+ module DynamoDb
6
+ module Create
7
+
8
+ class Batch < V1::Base
9
+ context_reader :items,
10
+ :client
11
+
12
+ def perform
13
+ return unless items
14
+
15
+ invoke! DynamoDb::Client
16
+
17
+ create_batch
18
+ end
19
+
20
+ protected ################## PROTECTED #################
21
+
22
+ def create_batch
23
+ records.each_slice(25) do |batch|
24
+ client.batch_write_item \
25
+ request_items: {
26
+ "sample_data" => batch
27
+ }
28
+ end
29
+ end
30
+
31
+ def records
32
+ items.map do |item|
33
+ {
34
+ put_request: {
35
+ item: item
36
+ }
37
+ }
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,25 @@
1
+ module DashOverlord
2
+ module UseCases
3
+ module V1
4
+ module Repositories
5
+ module DynamoDb
6
+ module Query
7
+ class Table < V1::Base
8
+ context_reader :table_name
9
+
10
+ def perform
11
+ return unless :table_name
12
+
13
+ invoke! DynamoDb::Client
14
+
15
+ query_table
16
+ end
17
+
18
+ protected ############### PROTECTED #############################
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ module DashOverlord
2
+ module UseCases
3
+ module V1
4
+ module Shared
5
+ module LogIn
6
+
7
+ class AssignAttributesToUserModel < V1::Base
8
+ context_reader :user_model
9
+
10
+ def perform
11
+ user_model.assign_attributes user_model_attributes
12
+ end
13
+
14
+ protected #################### PROTECTED ###########################
15
+
16
+ def user_model_attributes
17
+ (context.user_model_attributes || {})
18
+ .with_indifferent_access
19
+ .slice :email,
20
+ :password
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,21 @@
1
+ module DashOverlord
2
+ module UseCases
3
+ module V1
4
+ module Shared
5
+ module LogIn
6
+
7
+ class Base < V1::Base
8
+ def perform
9
+ invoke! BuildUserModel
10
+ invoke! AssignAttributesToUserModel
11
+ invoke! GetExistingUserModel
12
+ invoke! ValidateUserModel
13
+ invoke! SwitchUserModelByExistingUserModel
14
+ end
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module DashOverlord
2
+ module UseCases
3
+ module V1
4
+ module Shared
5
+ module LogIn
6
+
7
+ class BuildUserModel < V1::Base
8
+ context_reader :user_model_class
9
+
10
+ def perform
11
+ context.user_model = user_model_class.new
12
+ end
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ module DashOverlord
2
+ module UseCases
3
+ module V1
4
+ module Shared
5
+ module LogIn
6
+
7
+ class GetExistingUserModel < V1::Base
8
+ context_reader :user_model, :user_model_class
9
+
10
+ def perform
11
+ context.existing_user_model =
12
+ user_model_class.find_by_email(user_model.email)
13
+ end
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ module DashOverlord
2
+ module UseCases
3
+ module V1
4
+ module Shared
5
+ module LogIn
6
+
7
+ class SwitchUserModelByExistingUserModel < V1::Base
8
+ def perform
9
+ context.user_model = context.existing_user_model
10
+ end
11
+ end
12
+
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,52 @@
1
+ module DashOverlord
2
+ module UseCases
3
+ module V1
4
+ module Shared
5
+ module LogIn
6
+
7
+ class ValidateUserModel < V1::Base
8
+ target :user_model
9
+
10
+ context_reader :existing_user_model, :user_model_class
11
+
12
+ validates_presence_of :email, :password
13
+
14
+ validate :validate_email
15
+
16
+ validate :validate_password
17
+
18
+ def validate_email(user_model)
19
+ return if user_model.email.blank?
20
+ return if existing_user_model.present?
21
+
22
+ user_model.errors.add(:email, message('bad_credentials'))
23
+ user_model.errors.add(:password, message('bad_credentials'))
24
+ end
25
+
26
+ def validate_password(user_model)
27
+ return if existing_user_model.blank?
28
+ return if user_model.password.blank?
29
+ return if existing_user_model.secured_password == user_model.password
30
+
31
+ user_model.errors.add(:email, message('bad_credentials'))
32
+ user_model.errors.add(:password, message('bad_credentials'))
33
+ end
34
+
35
+ def perform
36
+ return if target_valid?
37
+
38
+ failure! :unprocessable_entity, message('contains_errors')
39
+ end
40
+
41
+ protected
42
+
43
+ def message(key)
44
+ I18n.t("v1.#{user_model_class.model_name.element}s.#{key}")
45
+ end
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,25 @@
1
+ require 'ransack'
2
+
3
+ module DashOverlord
4
+ module UseCases
5
+ module V1
6
+ module Shared
7
+ module SearchAndPaginate
8
+
9
+ class ApplyFilters < V1::Base
10
+ context_reader :filter_query, :resources
11
+
12
+ def perform
13
+ return unless resources.respond_to?(:search)
14
+
15
+ context.search_builder = resources.search(filter_query.presence)
16
+
17
+ context.resources = context.search_builder.result(distinct: true)
18
+ end
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ module DashOverlord
2
+ module UseCases
3
+ module V1
4
+ module Shared
5
+ module SearchAndPaginate
6
+
7
+ class ApplyFullTextSearch < V1::Base
8
+ context_reader :full_text_term, :resources
9
+
10
+ def perform
11
+ return if full_text_term.blank?
12
+ return unless resources.respond_to?(:ft)
13
+
14
+ context.resources = resources.ft(full_text_term)
15
+ end
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,72 @@
1
+ require 'kaminari'
2
+ require 'kaminari/models/array_extension'
3
+
4
+ module DashOverlord
5
+ module UseCases
6
+ module V1
7
+ module Shared
8
+ module SearchAndPaginate
9
+
10
+ class ApplyPagination < V1::Base
11
+ PAGE_DEFAULT = 1
12
+ PER_PAGE_DEFAULT = 10
13
+
14
+ context_reader :page, :per_page, :resources
15
+
16
+ def perform
17
+ context.page = fix_page(page)
18
+
19
+ if page == 0
20
+ no_pagination
21
+ else
22
+ apply_pagination
23
+ end
24
+ end
25
+
26
+ protected ###################### PROTECTED ###########################
27
+
28
+ def no_pagination
29
+ context.per_page = 0
30
+ context.total_pages = 0
31
+ context.total_results = resources.count
32
+ end
33
+
34
+ def apply_pagination
35
+ context.per_page = fix_per_page(per_page)
36
+
37
+ context.resources = paginated_resources.page(page).per(per_page)
38
+
39
+ context.page = resources.current_page
40
+ context.total_pages = resources.total_pages
41
+ context.total_results = resources.total_count
42
+ end
43
+
44
+ def fix_page(page)
45
+ page_or_nil = page.class == String ? page.presence : page
46
+
47
+ (page_or_nil || PAGE_DEFAULT).to_i
48
+ end
49
+
50
+ def fix_per_page(per_page)
51
+ per_page_or_nil = \
52
+ per_page.class == String ? per_page.presence : per_page
53
+
54
+ (per_page_or_nil || PER_PAGE_DEFAULT).to_i
55
+ end
56
+
57
+ private ######################## PRIVATE #############################
58
+
59
+ def paginated_resources
60
+ if resources.respond_to?(:page)
61
+ resources
62
+ else
63
+ Kaminari.paginate_array(resources)
64
+ end
65
+ end
66
+ end
67
+
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end