-
Notifications
You must be signed in to change notification settings - Fork 0
Automated Test: topic-email-management #309
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| import ObjectController from "discourse/controllers/object"; | ||
|
|
||
| export default ObjectController.extend({ | ||
|
|
||
| stopNotificiationsText: function() { | ||
| return I18n.t("topic.unsubscribe.stop_notifications", { title: this.get("model.fancyTitle") }); | ||
| }.property("model.fancyTitle"), | ||
|
|
||
| }) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| import PostStream from "discourse/models/post-stream"; | ||
|
|
||
| export default Discourse.Route.extend({ | ||
| model(params) { | ||
| const topic = this.store.createRecord("topic", { id: params.id }); | ||
| return PostStream.loadTopicView(params.id).then(json => { | ||
| topic.updateFromJson(json); | ||
| return topic; | ||
| }); | ||
| }, | ||
|
|
||
| afterModel(topic) { | ||
| // hide the notification reason text | ||
| topic.set("details.notificationReasonText", null); | ||
| }, | ||
|
|
||
| actions: { | ||
| didTransition() { | ||
| this.controllerFor("application").set("showFooter", true); | ||
| return true; | ||
| } | ||
| } | ||
| }); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| <div class="container"> | ||
| <p> | ||
| {{{stopNotificiationsText}}} | ||
| </p> | ||
| <p> | ||
| {{i18n "topic.unsubscribe.change_notification_state"}} {{topic-notifications-button topic=model}} | ||
| </p> | ||
| </div> | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| export default Discourse.View.extend({ | ||
| classNames: ["topic-unsubscribe"] | ||
| }); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -24,11 +24,12 @@ class TopicsController < ApplicationController | |
| :bulk, | ||
| :reset_new, | ||
| :change_post_owners, | ||
| :bookmark] | ||
| :bookmark, | ||
| :unsubscribe] | ||
|
|
||
| before_filter :consider_user_for_promotion, only: :show | ||
|
|
||
| skip_before_filter :check_xhr, only: [:show, :feed] | ||
| skip_before_filter :check_xhr, only: [:show, :unsubscribe, :feed] | ||
|
|
||
| def id_for_slug | ||
| topic = Topic.find_by(slug: params[:slug].downcase) | ||
|
|
@@ -94,6 +95,26 @@ def show | |
| raise ex | ||
| end | ||
|
|
||
| def unsubscribe | ||
| @topic_view = TopicView.new(params[:topic_id], current_user) | ||
|
|
||
| if slugs_do_not_match || (!request.format.json? && params[:slug].blank?) | ||
| return redirect_to @topic_view.topic.unsubscribe_url, status: 301 | ||
| end | ||
|
|
||
| tu = TopicUser.find_by(user_id: current_user.id, topic_id: params[:topic_id]) | ||
|
|
||
| if tu.notification_level > TopicUser.notification_levels[:regular] | ||
| tu.notification_level = TopicUser.notification_levels[:regular] | ||
| else | ||
| tu.notification_level = TopicUser.notification_levels[:muted] | ||
| end | ||
|
|
||
| tu.save! | ||
|
Comment on lines
+105
to
+113
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
If the user has never interacted with this topic, no 🐛 Proposed fix: handle missing TopicUser- tu = TopicUser.find_by(user_id: current_user.id, topic_id: params[:topic_id])
-
- if tu.notification_level > TopicUser.notification_levels[:regular]
- tu.notification_level = TopicUser.notification_levels[:regular]
- else
- tu.notification_level = TopicUser.notification_levels[:muted]
- end
-
- tu.save!
+ tu = TopicUser.find_by(user_id: current_user.id, topic_id: params[:topic_id])
+
+ if tu.nil?
+ TopicUser.change(current_user.id, params[:topic_id],
+ notification_level: TopicUser.notification_levels[:muted])
+ else
+ new_level = if tu.notification_level > TopicUser.notification_levels[:regular]
+ TopicUser.notification_levels[:regular]
+ else
+ TopicUser.notification_levels[:muted]
+ end
+ tu.update!(notification_level: new_level)
+ end🤖 Prompt for AI Agents |
||
|
|
||
| perform_show_response | ||
| end | ||
|
Comment on lines
+98
to
+116
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. State mutation via GET request violates HTTP semantics. The Consider changing the route to 🧰 Tools🪛 RuboCop (1.84.0)[convention] 98-116: Assignment Branch Condition size for (Metrics/AbcSize) 🤖 Prompt for AI Agents |
||
|
|
||
| def wordpress | ||
| params.require(:best) | ||
| params.require(:topic_id) | ||
|
|
@@ -476,6 +497,7 @@ def perform_show_response | |
| format.html do | ||
| @description_meta = @topic_view.topic.excerpt | ||
| store_preloaded("topic_#{@topic_view.topic.id}", MultiJson.dump(topic_view_serializer)) | ||
| render :show | ||
| end | ||
|
|
||
| format.json do | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,31 +1,29 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div id='main' class=<%= classes %>> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <%= render :partial => 'email/post', :locals => {:post => post} %> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <%= render partial: 'email/post', locals: { post: post } %> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <% if context_posts.present? %> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div class='footer'> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| %{respond_instructions} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <hr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <h4 class='.previous-discussion'><%= t "user_notifications.previous_discussion" %></h4> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <% if context_posts.present? %> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div class='footer'>%{respond_instructions}</div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <hr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <% context_posts.each do |p| %> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <%= render :partial => 'email/post', :locals => {:post => p} %> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <h4 class='.previous-discussion'><%= t "user_notifications.previous_discussion" %></h4> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Erroneous dot in HTML
Proposed fix- <h4 class='.previous-discussion'><%= t "user_notifications.previous_discussion" %></h4>
+ <h4 class='previous-discussion'><%= t "user_notifications.previous_discussion" %></h4>📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <% context_posts.each do |p| %> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <%= render partial: 'email/post', locals: { post: p } %> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <% end %> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <% end %> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <% end %> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <hr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <hr> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div class='footer'>%{respond_instructions}</div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div class='footer'>%{unsubscribe_link}</div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+5
to
+20
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
When Either remove the Proposed fix: remove the duplicate inside the conditional <% if context_posts.present? %>
- <div class='footer'>%{respond_instructions}</div>
-
<hr>
<h4 class='.previous-discussion'><%= t "user_notifications.previous_discussion" %></h4>📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div class='footer'> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| %{respond_instructions} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div class='footer'> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| %{unsubscribe_link} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div itemscope itemtype="http://schema.org/EmailMessage" style="display:none"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div itemprop="action" itemscope itemtype="http://schema.org/ViewAction"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <link itemprop="url" href="<%= Discourse.base_url %><%= post.url %>" /> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <meta itemprop="name" content="<%= t 'read_full_topic' %>"/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div itemprop="action" itemscope itemtype="http://schema.org/ViewAction"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <link itemprop="url" href="<%= Discourse.base_url %><%= post.url %>" /> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <meta itemprop="name" content="<%= t 'read_full_topic' %>"/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -434,10 +434,12 @@ | |||||||||||||||||
| # Topic routes | ||||||||||||||||||
| get "t/id_for/:slug" => "topics#id_for_slug" | ||||||||||||||||||
| get "t/:slug/:topic_id/wordpress" => "topics#wordpress", constraints: {topic_id: /\d+/} | ||||||||||||||||||
| get "t/:slug/:topic_id/moderator-liked" => "topics#moderator_liked", constraints: {topic_id: /\d+/} | ||||||||||||||||||
| get "t/:topic_id/wordpress" => "topics#wordpress", constraints: {topic_id: /\d+/} | ||||||||||||||||||
| get "t/:slug/:topic_id/summary" => "topics#show", defaults: {summary: true}, constraints: {topic_id: /\d+/, post_number: /\d+/} | ||||||||||||||||||
| get "t/:topic_id/summary" => "topics#show", constraints: {topic_id: /\d+/, post_number: /\d+/} | ||||||||||||||||||
| get "t/:slug/:topic_id/moderator-liked" => "topics#moderator_liked", constraints: {topic_id: /\d+/} | ||||||||||||||||||
| get "t/:slug/:topic_id/summary" => "topics#show", defaults: {summary: true}, constraints: {topic_id: /\d+/} | ||||||||||||||||||
| get "t/:slug/:topic_id/unsubscribe" => "topics#unsubscribe", constraints: {topic_id: /\d+/} | ||||||||||||||||||
| get "t/:topic_id/unsubscribe" => "topics#unsubscribe", constraints: {topic_id: /\d+/} | ||||||||||||||||||
| get "t/:topic_id/summary" => "topics#show", constraints: {topic_id: /\d+/} | ||||||||||||||||||
|
Comment on lines
+439
to
+442
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Slugless summary route (line 442) is missing The slug-based summary route on line 439 sets Proposed fix- get "t/:topic_id/summary" => "topics#show", constraints: {topic_id: /\d+/}
+ get "t/:topic_id/summary" => "topics#show", defaults: {summary: true}, constraints: {topic_id: /\d+/}📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||
| put "t/:slug/:topic_id" => "topics#update", constraints: {topic_id: /\d+/} | ||||||||||||||||||
| put "t/:slug/:topic_id/star" => "topics#star", constraints: {topic_id: /\d+/} | ||||||||||||||||||
| put "t/:topic_id/star" => "topics#star", constraints: {topic_id: /\d+/} | ||||||||||||||||||
|
|
||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo in property name:
stopNotificiationsText→stopNotificationsText.The property name has an extra 'i' ("Notificiations" instead of "Notifications"). This is consistent with the controller so it works, but it should be fixed in both places to avoid confusion for future maintainers.
Also, the triple-stache
{{{ }}}renders unescaped HTML. This is needed because the i18n string contains<strong>tags, andfancyTitleis sanitized server-side, so the XSS risk is mitigated. Worth noting for future reference.Proposed fix
Also fix in the controller (
topic-unsubscribe.js.es6):🤖 Prompt for AI Agents