thredded 0.2.2 → 0.3.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 (220) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.mkdn +63 -0
  3. data/Procfile +1 -0
  4. data/README.mkdn +42 -20
  5. data/app/assets/images/thredded/private-messages.svg +4 -0
  6. data/app/assets/images/thredded/settings.svg +4 -0
  7. data/app/assets/javascripts/thredded.es6 +2 -10
  8. data/app/assets/javascripts/thredded/{currently_online.es6 → components/currently_online.es6} +0 -0
  9. data/app/assets/javascripts/thredded/{post_form.es6 → components/post_form.es6} +0 -0
  10. data/app/assets/javascripts/thredded/{time_stamps.es6 → components/time_stamps.es6} +0 -0
  11. data/app/assets/javascripts/thredded/{topic_form.es6 → components/topic_form.es6} +1 -1
  12. data/app/assets/javascripts/thredded/components/topics.es6 +37 -0
  13. data/app/assets/javascripts/thredded/components/user_preferences_form.es6 +45 -0
  14. data/app/assets/javascripts/thredded/components/users_select.es6 +56 -0
  15. data/app/assets/javascripts/thredded/dependencies.js +9 -0
  16. data/app/assets/javascripts/thredded/thredded.es6 +1 -0
  17. data/app/assets/stylesheets/thredded/_base.scss +3 -2
  18. data/app/assets/stylesheets/thredded/_thredded.scss +4 -1
  19. data/app/assets/stylesheets/thredded/base/_buttons.scss +2 -1
  20. data/app/assets/stylesheets/thredded/base/_forms.scss +23 -18
  21. data/app/assets/stylesheets/thredded/base/_grid.scss +1 -1
  22. data/app/assets/stylesheets/thredded/base/_nav.scss +21 -0
  23. data/app/assets/stylesheets/thredded/base/_tables.scss +5 -14
  24. data/app/assets/stylesheets/thredded/base/_typography.scss +9 -4
  25. data/app/assets/stylesheets/thredded/base/_variables.scss +28 -9
  26. data/app/assets/stylesheets/thredded/components/_alerts.scss +19 -0
  27. data/app/assets/stylesheets/thredded/components/_currently-online.scss +1 -1
  28. data/app/assets/stylesheets/thredded/components/_form-list.scss +2 -4
  29. data/app/assets/stylesheets/thredded/components/_icons.scss +3 -0
  30. data/app/assets/stylesheets/thredded/components/_messageboard.scss +4 -4
  31. data/app/assets/stylesheets/thredded/components/_pagination.scss +2 -2
  32. data/app/assets/stylesheets/thredded/components/_post-form.scss +3 -0
  33. data/app/assets/stylesheets/thredded/components/_post.scss +14 -4
  34. data/app/assets/stylesheets/thredded/components/_select2.scss +79 -9
  35. data/app/assets/stylesheets/thredded/components/_topic-header.scss +11 -1
  36. data/app/assets/stylesheets/thredded/components/_topics.scss +13 -11
  37. data/app/assets/stylesheets/thredded/layout/_main-container.scss +3 -3
  38. data/app/assets/stylesheets/thredded/layout/_main-navigation.scss +11 -17
  39. data/app/assets/stylesheets/thredded/layout/_navigation.scss +72 -0
  40. data/app/assets/stylesheets/thredded/layout/_search-navigation.scss +66 -0
  41. data/app/assets/stylesheets/thredded/layout/_user-navigation.scss +35 -61
  42. data/app/commands/thredded/at_notification_extractor.rb +1 -0
  43. data/app/commands/thredded/members_marked_notified.rb +1 -0
  44. data/app/commands/thredded/messageboard_destroyer.rb +7 -2
  45. data/app/commands/thredded/notify_mentioned_users.rb +8 -21
  46. data/app/commands/thredded/notify_private_topic_users.rb +3 -5
  47. data/app/controllers/thredded/application_controller.rb +76 -41
  48. data/app/controllers/thredded/autocomplete_users_controller.rb +46 -0
  49. data/app/controllers/thredded/messageboards_controller.rb +8 -5
  50. data/app/controllers/thredded/posts_controller.rb +20 -22
  51. data/app/controllers/thredded/preferences_controller.rb +19 -14
  52. data/app/controllers/thredded/private_topics_controller.rb +58 -23
  53. data/app/controllers/thredded/setups_controller.rb +1 -0
  54. data/app/controllers/thredded/theme_previews_controller.rb +24 -53
  55. data/app/controllers/thredded/topics_controller.rb +48 -77
  56. data/app/forms/thredded/private_topic_form.rb +1 -21
  57. data/app/forms/thredded/topic_form.rb +3 -7
  58. data/app/forms/thredded/user_preferences_form.rb +62 -0
  59. data/app/helpers/thredded/application_helper.rb +11 -12
  60. data/app/helpers/thredded/urls_helper.rb +103 -0
  61. data/app/jobs/thredded/activity_updater_job.rb +4 -3
  62. data/app/jobs/thredded/at_notifier_job.rb +1 -0
  63. data/app/jobs/thredded/notify_private_topic_users_job.rb +1 -0
  64. data/app/mailer_previews/thredded/base_mailer_preview.rb +101 -0
  65. data/app/mailer_previews/thredded/post_mailer_preview.rb +11 -0
  66. data/app/mailer_previews/thredded/private_post_mailer_preview.rb +11 -0
  67. data/app/mailer_previews/thredded/private_topic_mailer_preview.rb +15 -0
  68. data/app/mailers/thredded/base_mailer.rb +13 -0
  69. data/app/mailers/thredded/post_mailer.rb +4 -2
  70. data/app/mailers/thredded/private_post_mailer.rb +4 -2
  71. data/app/mailers/thredded/private_topic_mailer.rb +4 -2
  72. data/app/models/concerns/thredded/friendly_id_reserved_words_and_pagination.rb +16 -0
  73. data/app/models/concerns/thredded/post_common.rb +68 -63
  74. data/app/models/concerns/thredded/topic_common.rb +31 -8
  75. data/app/models/concerns/thredded/user_topic_read_state_common.rb +31 -0
  76. data/app/models/thredded/category.rb +1 -0
  77. data/app/models/thredded/messageboard.rb +24 -25
  78. data/app/models/thredded/messageboard_user.rb +1 -0
  79. data/app/models/thredded/null_preference.rb +1 -0
  80. data/app/models/thredded/null_user.rb +1 -6
  81. data/app/models/thredded/null_user_topic_read_state.rb +12 -0
  82. data/app/models/thredded/post.rb +6 -9
  83. data/app/models/thredded/post_notification.rb +1 -0
  84. data/app/models/thredded/private_post.rb +6 -2
  85. data/app/models/thredded/private_topic.rb +46 -32
  86. data/app/models/thredded/private_user.rb +3 -2
  87. data/app/models/thredded/stats.rb +1 -0
  88. data/app/models/thredded/topic.rb +40 -64
  89. data/app/models/thredded/topic_category.rb +1 -0
  90. data/app/models/thredded/user_detail.rb +2 -15
  91. data/app/models/thredded/user_extender.rb +29 -14
  92. data/app/models/thredded/user_messageboard_preference.rb +20 -0
  93. data/app/models/thredded/user_permissions/admin/if_admin_column_true.rb +1 -0
  94. data/app/models/thredded/user_permissions/admin/none.rb +1 -0
  95. data/app/models/thredded/user_permissions/message/readers_of_writeable_boards.rb +1 -0
  96. data/app/models/thredded/user_permissions/moderate/if_moderator_column_true.rb +1 -0
  97. data/app/models/thredded/user_permissions/moderate/none.rb +1 -0
  98. data/app/models/thredded/user_permissions/read/all.rb +1 -0
  99. data/app/models/thredded/user_permissions/write/all.rb +1 -0
  100. data/app/models/thredded/user_permissions/write/none.rb +1 -0
  101. data/app/models/thredded/user_preference.rb +7 -1
  102. data/app/models/thredded/user_private_topic_read_state.rb +12 -0
  103. data/app/models/thredded/user_topic_read_state.rb +12 -0
  104. data/app/policies/thredded/messageboard_policy.rb +27 -0
  105. data/app/policies/thredded/post_policy.rb +33 -0
  106. data/app/policies/thredded/private_post_policy.rb +29 -0
  107. data/app/policies/thredded/private_topic_policy.rb +23 -0
  108. data/app/policies/thredded/topic_policy.rb +32 -0
  109. data/app/view_models/thredded/base_topic_view.rb +56 -0
  110. data/app/view_models/thredded/post_view.rb +44 -0
  111. data/app/view_models/thredded/posts_page_view.rb +27 -0
  112. data/app/view_models/thredded/private_topic_view.rb +9 -0
  113. data/app/{decorators/thredded/topic_email_decorator.rb → view_models/thredded/topic_email_view.rb} +2 -1
  114. data/app/view_models/thredded/topic_view.rb +23 -0
  115. data/app/view_models/thredded/topics_page_view.rb +26 -0
  116. data/app/views/thredded/error_pages/forbidden.html.erb +6 -0
  117. data/app/views/thredded/error_pages/not_found.html.erb +6 -0
  118. data/app/views/thredded/messageboards/_messageboard.html.erb +13 -6
  119. data/app/views/thredded/messageboards/index.html.erb +2 -8
  120. data/app/views/thredded/messageboards/new.html.erb +8 -2
  121. data/app/views/thredded/post_mailer/at_notification.html.erb +3 -3
  122. data/app/views/thredded/post_mailer/at_notification.text.erb +1 -1
  123. data/app/views/thredded/posts/_content_field.html.erb +1 -1
  124. data/app/views/thredded/posts/_form.html.erb +5 -1
  125. data/app/views/thredded/posts/_post.html.erb +3 -1
  126. data/app/views/thredded/posts/edit.html.erb +7 -3
  127. data/app/views/thredded/posts_common/_form.html.erb +1 -1
  128. data/app/views/thredded/posts_common/_post.html.erb +14 -8
  129. data/app/views/thredded/preferences/_form.html.erb +37 -15
  130. data/app/views/thredded/preferences/_header.html.erb +1 -1
  131. data/app/views/thredded/preferences/edit.html.erb +4 -6
  132. data/app/views/thredded/private_post_mailer/at_notification.html.erb +6 -4
  133. data/app/views/thredded/private_posts/_form.html.erb +5 -1
  134. data/app/views/thredded/private_posts/_private_post.html.erb +3 -1
  135. data/app/views/thredded/private_topic_mailer/message_notification.html.erb +3 -7
  136. data/app/views/thredded/private_topic_mailer/message_notification.text.erb +1 -3
  137. data/app/views/thredded/private_topics/_breadcrumbs.html.erb +2 -2
  138. data/app/views/thredded/private_topics/_form.html.erb +15 -10
  139. data/app/views/thredded/private_topics/_header.html.erb +12 -0
  140. data/app/views/thredded/private_topics/_no_private_topics.html.erb +2 -2
  141. data/app/views/thredded/private_topics/_private_topic.html.erb +4 -6
  142. data/app/views/thredded/private_topics/edit.html.erb +32 -0
  143. data/app/views/thredded/private_topics/index.html.erb +5 -5
  144. data/app/views/thredded/private_topics/new.html.erb +1 -2
  145. data/app/views/thredded/private_topics/show.html.erb +12 -7
  146. data/app/views/thredded/search/_form.html.erb +9 -6
  147. data/app/views/thredded/shared/{_messageboard_topics_breadcrumbs.html.erb → _breadcrumbs.html.erb} +2 -2
  148. data/app/views/thredded/shared/_header.html.erb +2 -3
  149. data/app/views/thredded/shared/_nav.html.erb +20 -0
  150. data/app/views/thredded/shared/nav/_notification_preferences.html.erb +6 -0
  151. data/app/views/thredded/shared/nav/_private_topics.html.erb +11 -0
  152. data/app/views/thredded/shared/nav/_standalone.html.erb +12 -0
  153. data/app/views/thredded/theme_previews/_section_title.html.erb +2 -2
  154. data/app/views/thredded/theme_previews/show.html.erb +13 -17
  155. data/app/views/thredded/topics/_form.html.erb +8 -6
  156. data/app/views/thredded/topics/_header.html.erb +12 -0
  157. data/app/views/thredded/topics/_topic.html.erb +4 -8
  158. data/app/views/thredded/topics/_topic_form_admin_options.html.erb +1 -1
  159. data/app/views/thredded/topics/edit.html.erb +22 -18
  160. data/app/views/thredded/topics/index.html.erb +3 -3
  161. data/app/views/thredded/topics/new.html.erb +1 -1
  162. data/app/views/thredded/topics/search.html.erb +17 -5
  163. data/app/views/thredded/topics/show.html.erb +14 -11
  164. data/bin/rails +5 -0
  165. data/config.ru +3 -0
  166. data/config/i18n-tasks.yml +16 -0
  167. data/config/locales/en.yml +90 -0
  168. data/config/routes.rb +29 -15
  169. data/db/migrate/20160329231848_create_thredded.rb +29 -33
  170. data/db/seeds.rb +115 -0
  171. data/db/upgrade_migrations/20160410111522_upgrade_v0_2_to_v0_3.rb +59 -0
  172. data/heroku.gemfile +26 -0
  173. data/heroku.gemfile.lock +282 -0
  174. data/lib/generators/thredded/install/install_generator.rb +1 -0
  175. data/lib/generators/thredded/install/templates/initializer.rb +17 -0
  176. data/lib/html/pipeline/at_mention_filter.rb +2 -1
  177. data/lib/html/pipeline/bbcode_filter.rb +13 -4
  178. data/lib/tasks/thredded_tasks.rake +1 -0
  179. data/lib/thredded.rb +19 -17
  180. data/lib/thredded/at_users.rb +1 -0
  181. data/lib/thredded/engine.rb +14 -5
  182. data/lib/thredded/errors.rb +11 -11
  183. data/lib/thredded/main_app_route_delegator.rb +1 -0
  184. data/lib/thredded/search_parser.rb +2 -1
  185. data/lib/thredded/topics_search.rb +67 -0
  186. data/lib/thredded/version.rb +2 -1
  187. data/thredded.gemspec +12 -8
  188. metadata +146 -82
  189. data/app/assets/javascripts/thredded/users_select.es6 +0 -5
  190. data/app/assets/stylesheets/thredded/layout/_topic-navigation.scss +0 -53
  191. data/app/commands/thredded/user_reads_private_topic.rb +0 -22
  192. data/app/commands/thredded/user_resets_private_topic_to_unread.rb +0 -23
  193. data/app/decorators/thredded/base_topic_decorator.rb +0 -14
  194. data/app/decorators/thredded/base_user_topic_decorator.rb +0 -63
  195. data/app/decorators/thredded/messageboard_decorator.rb +0 -41
  196. data/app/decorators/thredded/post_decorator.rb +0 -40
  197. data/app/decorators/thredded/private_topic_decorator.rb +0 -23
  198. data/app/decorators/thredded/topic_decorator.rb +0 -25
  199. data/app/decorators/thredded/user_private_topic_decorator.rb +0 -13
  200. data/app/decorators/thredded/user_topic_decorator.rb +0 -37
  201. data/app/models/thredded/ability.rb +0 -60
  202. data/app/models/thredded/notification_preference.rb +0 -17
  203. data/app/models/thredded/null_topic.rb +0 -15
  204. data/app/models/thredded/null_topic_read.rb +0 -19
  205. data/app/models/thredded/user_topic_read.rb +0 -10
  206. data/app/views/thredded/shared/_notification_preferences.html.erb +0 -7
  207. data/app/views/thredded/shared/_top_nav.html.erb +0 -36
  208. data/app/views/thredded/shared/_topic_nav.html.erb +0 -22
  209. data/app/views/thredded/topics/_recent_topics_by_user.html.erb +0 -8
  210. data/app/views/thredded/topics/by_category.html.erb +0 -56
  211. data/app/views/thredded/topics_common/_header.html.erb +0 -6
  212. data/lib/thredded/messageboard_user_permissions.rb +0 -22
  213. data/lib/thredded/post_sql_builder.rb +0 -12
  214. data/lib/thredded/post_user_permissions.rb +0 -32
  215. data/lib/thredded/private_topic_user_permissions.rb +0 -26
  216. data/lib/thredded/search_sql_builder.rb +0 -21
  217. data/lib/thredded/seed_database.rb +0 -76
  218. data/lib/thredded/table_sql_builder.rb +0 -41
  219. data/lib/thredded/topic_sql_builder.rb +0 -11
  220. data/lib/thredded/topic_user_permissions.rb +0 -32
@@ -1,15 +0,0 @@
1
- module Thredded
2
- class NullTopic
3
- def updated_at
4
- nil
5
- end
6
-
7
- def user
8
- Thredded::NullUser.new
9
- end
10
-
11
- def last_user
12
- Thredded::NullUser.new
13
- end
14
- end
15
- end
@@ -1,19 +0,0 @@
1
- module Thredded
2
- class NullTopicRead
3
- def page
4
- 1
5
- end
6
-
7
- def post_id
8
- 0
9
- end
10
-
11
- def posts_count
12
- 0
13
- end
14
-
15
- def farthest_post
16
- Post.new
17
- end
18
- end
19
- end
@@ -1,10 +0,0 @@
1
- module Thredded
2
- class UserTopicRead < ActiveRecord::Base
3
- belongs_to :topic
4
- belongs_to :user, class_name: Thredded.user_class
5
- belongs_to :farthest_post,
6
- class_name: 'Thredded::Post', foreign_key: 'post_id'
7
- validates :user_id, uniqueness: { scope: :topic }
8
- belongs_to :post
9
- end
10
- end
@@ -1,7 +0,0 @@
1
- <% if messageboard.try(:persisted?) %>
2
- <li>
3
- <%= link_to edit_messageboard_preferences_path(messageboard) do %>
4
- <span>Notification Settings</span>
5
- <% end %>
6
- </li>
7
- <% end %>
@@ -1,36 +0,0 @@
1
- <% unless !messageboard.try(:persisted?) && !Thredded.standalone_layout? %>
2
- <nav class="thredded--user-navigation" role="navigation">
3
- <div class="thredded--user-navigation--search">
4
- <%= render 'thredded/search/form' %>
5
- </div>
6
-
7
- <ul class="thredded--user-navigation--actions">
8
- <% if signed_in? %>
9
- <% if Thredded.standalone_layout? %>
10
- <li>
11
- <%= link_to user_path(thredded_current_user) do %>
12
- <span><%= thredded_current_user %></span>
13
- <% end %>
14
- </li>
15
- <% end %>
16
-
17
- <%= render 'thredded/shared/notification_preferences',
18
- messageboard: messageboard %>
19
-
20
- <% if Thredded.standalone_layout? %>
21
- <li>
22
- <%= link_to main_app.session_path, method: :delete do %>
23
- <span>Sign Out</span>
24
- <% end %>
25
- </li>
26
- <% end %>
27
- <% elsif Thredded.standalone_layout? %>
28
- <li>
29
- <%= link_to main_app.sessions_new_path do %>
30
- <span>Sign In / Register</span>
31
- <% end %>
32
- </li>
33
- <% end %>
34
- </ul>
35
- </nav>
36
- <% end %>
@@ -1,22 +0,0 @@
1
- <div class="thredded--main-navigation">
2
- <%= yield :thredded_breadcrumbs %>
3
-
4
- <ul class="thredded--topic-navigation">
5
- <% if messageboard.try(:persisted?) -%>
6
- <li class="thredded--topic-navigation--public">
7
- <%= link_to 'Topics', messageboard_topics_path(messageboard) %>
8
- </li>
9
- <% end -%>
10
-
11
- <li class="thredded--topic-navigation--private">
12
- <%= link_to private_topics_path do %>
13
- Private Topics
14
- <% if unread_private_topics_count > 0 -%>
15
- <span class="thredded--topic-navigation--unread">
16
- <%= unread_private_topics_count %>
17
- </span>
18
- <% end -%>
19
- <% end -%>
20
- </li>
21
- </ul>
22
- </div>
@@ -1,8 +0,0 @@
1
- <% if current_ability.can? :read, topic %>
2
- <tr>
3
- <td class="title table-first-column"> <%= topic.title %> </td>
4
- <td class="replies"> <%= topic.posts_count %> </td>
5
- <td class="created"> <%= formatted_user_profile_date(topic.created_at) %> </td>
6
- <td class="updated"> <%= formatted_user_profile_date(topic.updated_at) %> </td>
7
- </tr>
8
- <% end %>
@@ -1,56 +0,0 @@
1
- <% content_for :thredded_page_title, 'Topic Categories' %>
2
- <% content_for :thredded_page_id, 'thredded--topic-categories' %>
3
-
4
- <% content_for :breadcrumbs do %>
5
- <ul class="breadcrumbs">
6
- <li><%= link_to 'Forums', root_path %></li>
7
- <li><%= link_to messageboard.title, messageboard_topics_path(messageboard) %></li>
8
- <li><span>Category</span></li>
9
- </ul>
10
- <% end %>
11
-
12
- <% content_for :actions do %>
13
- <ul class="actions">
14
- <%= render 'thredded/search/form' %>
15
-
16
- <% if current_ability.can? :create, Thredded::Topic %>
17
- <li class='new_topic'>
18
- <%= link_to 'new topic', new_messageboard_topic_path(messageboard) %>
19
- </li>
20
- <li class='new_private_topic'>
21
- <%= link_to 'private topic', new_messageboard_topic_path(messageboard) %>
22
- </li>
23
- <% end %>
24
- </ul>
25
- <% end %>
26
-
27
- <%= thredded_page do %>
28
- <header>
29
- <nav>
30
- <%= yield :breadcrumbs %>
31
- <%= yield :actions %>
32
- </nav>
33
-
34
- <%= render 'thredded/shared/currently_online' %>
35
- </header>
36
-
37
- <section class="topics">
38
- <% if @sticky.any? %>
39
- <div class="stuck">
40
- <%= render partial: 'thredded/topics/topic_condensed', collection: @sticky, as: :t %>
41
- </div>
42
- <% end %>
43
-
44
- <div class="currently">
45
- <%= render partial: 'thredded/topics/topic_condensed', collection: @topics, as: :t %>
46
- </div>
47
- </section>
48
-
49
- <footer>
50
- <%= paginate @topics %>
51
- <nav>
52
- <%= yield :actions %>
53
- <%= yield :breadcrumbs %>
54
- </nav>
55
- </footer>
56
- <% end %>
@@ -1,6 +0,0 @@
1
- <header class="thredded--topic-header">
2
- <h1 class="thredded--topic-header--title"><%= topic.title %></h1>
3
- <cite class="thredded--topic-header--started-by">
4
- Started <%= time_ago topic.created_at %> by <%= user_link topic.user %>
5
- </cite>
6
- </header>
@@ -1,22 +0,0 @@
1
- module Thredded
2
- class MessageboardUserPermissions
3
- attr_reader :messageboard, :user
4
-
5
- def initialize(messageboard, user)
6
- @messageboard = messageboard
7
- @user = user
8
- end
9
-
10
- def readable?
11
- user.thredded_can_read_messageboards.include?(messageboard)
12
- end
13
-
14
- def postable?
15
- user.thredded_can_write_messageboards.include?(messageboard)
16
- end
17
-
18
- def moderatable?
19
- user.thredded_can_moderate_messageboards.include?(messageboard)
20
- end
21
- end
22
- end
@@ -1,12 +0,0 @@
1
- module Thredded
2
- class PostSqlBuilder < TableSqlBuilder
3
- def apply_filters
4
- @scope = @scope.joins(:topic_categories).where(category_id: categories) if categories.present?
5
- return unless users.present? || text.present?
6
- posts_scope = Thredded::Post
7
- posts_scope = posts_scope.where(user_id: users) if users.present?
8
- posts_scope = DbTextSearch::FullTextSearch.new(posts_scope, :content).find(text) if text.present?
9
- @scope = @scope.joins(:posts).merge(posts_scope)
10
- end
11
- end
12
- end
@@ -1,32 +0,0 @@
1
- module Thredded
2
- class PostUserPermissions
3
- def initialize(post, user, _user_details)
4
- @post = post
5
- @topic = post.postable
6
- @messageboard_user_permission = MessageboardUserPermissions.new(post.messageboard, user)
7
- @user = user
8
- end
9
-
10
- def editable?
11
- created_post? || @messageboard_user_permission.moderatable?
12
- end
13
-
14
- def manageable?
15
- created_post? || @messageboard_user_permission.moderatable?
16
- end
17
-
18
- def creatable?
19
- thread_is_not_locked? && @messageboard_user_permission.postable?
20
- end
21
-
22
- private
23
-
24
- def created_post?
25
- @user.id == @post.user_id
26
- end
27
-
28
- def thread_is_not_locked?
29
- @topic.private? || !@topic.locked?
30
- end
31
- end
32
- end
@@ -1,26 +0,0 @@
1
- module Thredded
2
- class PrivateTopicUserPermissions
3
- def initialize(private_topic, user, _user_details)
4
- @private_topic = private_topic
5
- @user = user
6
- end
7
-
8
- def readable?
9
- @private_topic.users.include?(@user)
10
- end
11
-
12
- def manageable?
13
- user_started_topic?
14
- end
15
-
16
- def creatable?
17
- !@user.thredded_anonymous?
18
- end
19
-
20
- private
21
-
22
- def user_started_topic?
23
- @user.id == @private_topic.user_id
24
- end
25
- end
26
- end
@@ -1,21 +0,0 @@
1
- require 'thredded/topic_sql_builder'
2
- require 'thredded/post_sql_builder'
3
-
4
- module Thredded
5
- class SearchSqlBuilder
6
- def initialize(query, messageboard)
7
- @topic_builder = TopicSqlBuilder.new(query, messageboard)
8
- @post_builder = PostSqlBuilder.new(query, messageboard)
9
- @order_by = 'ORDER BY updated_at DESC'
10
- end
11
-
12
- def build
13
- [
14
- 'SELECT * FROM thredded_topics WHERE id IN (', @post_builder.sql,
15
- 'UNION', @topic_builder.sql,
16
- ')', @order_by,
17
- 'LIMIT 50'
18
- ].join(' ')
19
- end
20
- end
21
- end
@@ -1,76 +0,0 @@
1
- require 'factory_girl_rails'
2
-
3
- # rubocop:disable HandleExceptions
4
- begin
5
- if FactoryGirl.factories.instance_variable_get(:@items).none?
6
- require_relative '../../../spec/factories'
7
- end
8
- rescue NameError
9
- end
10
- # rubocop:enable HandleExceptions
11
-
12
- module Thredded
13
- class SeedDatabase
14
- attr_reader :user, :users, :messageboard, :topics, :private_topics, :posts
15
-
16
- def self.run(users: 5, topics: 26, posts: (0..20))
17
- s = new
18
- s.create_messageboard
19
- s.create_first_user
20
- s.create_users(count: users)
21
- s.create_topics(count: topics)
22
- s.create_posts(count: posts)
23
- s.create_private_posts(count: posts)
24
- end
25
-
26
- def create_first_user
27
- @user ||= begin
28
- ::User.first ||
29
- ::User.create(name: 'joe', email: 'joe@example.com')
30
- end
31
- end
32
-
33
- def create_users(count: 5)
34
- @users = [user] + FactoryGirl.create_list(:user, count)
35
- end
36
-
37
- def create_messageboard
38
- @messageboard = FactoryGirl.create(
39
- :messageboard,
40
- name: 'Main Board',
41
- slug: 'main-board',
42
- description: 'A board is not a board without some posts'
43
- )
44
- end
45
-
46
- def create_topics(count: 26)
47
- @topics = FactoryGirl.create_list(
48
- :topic, count,
49
- messageboard: messageboard,
50
- user: users.sample,
51
- last_user: users.sample)
52
-
53
- @private_topics = FactoryGirl.create_list(
54
- :private_topic, count,
55
- user: users.sample,
56
- last_user: users.sample,
57
- users: [user])
58
- end
59
-
60
- def create_posts(count: (0..30))
61
- @posts = topics.flat_map do |topic|
62
- (count.min + rand(count.max + 1)).times do
63
- FactoryGirl.create(:post, postable: topic, messageboard: messageboard, user: users.sample)
64
- end
65
- end
66
- end
67
-
68
- def create_private_posts(count: (0..30))
69
- @private_posts = private_topics.flat_map do |topic|
70
- (count.min + rand(count.max + 1)).times do
71
- FactoryGirl.create(:private_post, postable: topic, user: users.sample)
72
- end
73
- end
74
- end
75
- end
76
- end
@@ -1,41 +0,0 @@
1
- require 'thredded/search_parser'
2
- module Thredded
3
- class TableSqlBuilder
4
- def initialize(query, messageboard)
5
- @terms = SearchParser.new(query).parse
6
- @scope = Thredded::Topic.select(:id).where(messageboard_id: messageboard.id)
7
- @search_categories = @search_users = @search_text = nil
8
- end
9
-
10
- def sql
11
- apply_filters
12
- @scope.to_sql
13
- end
14
-
15
- protected
16
-
17
- def categories
18
- @search_categories ||=
19
- if @terms['in']
20
- DbTextSearch::CaseInsensitiveEq.new(Category, :name)
21
- .find(@terms['in']).pluck(:id)
22
- else
23
- []
24
- end
25
- end
26
-
27
- def users
28
- @search_users ||=
29
- if @terms['by']
30
- DbTextSearch::CaseInsensitiveEq.new(Thredded.user_class, Thredded.user_name_column)
31
- .find(@terms['by']).pluck(:id)
32
- else
33
- []
34
- end
35
- end
36
-
37
- def text
38
- @terms['text']
39
- end
40
- end
41
- end
@@ -1,11 +0,0 @@
1
- require 'thredded/table_sql_builder'
2
-
3
- module Thredded
4
- class TopicSqlBuilder < TableSqlBuilder
5
- def apply_filters
6
- @scope = @scope.joins(:topic_categories).where(category_id: categories) if categories.present?
7
- @scope = @scope.where(user_id: users) if users.present?
8
- @scope = DbTextSearch::FullTextSearch.new(@scope, :title).find(text) if text.present?
9
- end
10
- end
11
- end