diff --git a/app/assets/javascripts/admin/templates/dashboard.hbs b/app/assets/javascripts/admin/templates/dashboard.hbs index 039ed9844..b788bb08f 100644 --- a/app/assets/javascripts/admin/templates/dashboard.hbs +++ b/app/assets/javascripts/admin/templates/dashboard.hbs @@ -57,7 +57,6 @@ {{ render 'admin_report_counts' likes }} {{ render 'admin_report_counts' flags }} {{ render 'admin_report_counts' bookmarks }} - {{ render 'admin_report_counts' starred }} {{ render 'admin_report_counts' emails }} {{/unless}} </table> diff --git a/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 b/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 index 2f9c73c60..544684c19 100644 --- a/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 +++ b/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 @@ -165,7 +165,7 @@ var controllerOpts = { var split = this.get('filter').split('/'); - if (split[0] !== 'new' && split[0] !== 'unread' && split[0] !== 'starred') { return; } + if (split[0] !== 'new' && split[0] !== 'unread') { return; } return I18n.t("topics.none.educate." + split[0], { userPrefsUrl: Discourse.getURL("/users/") + (Discourse.User.currentProp("username_lower")) + "/preferences" diff --git a/app/assets/javascripts/discourse/lib/keyboard_shortcuts.js b/app/assets/javascripts/discourse/lib/keyboard_shortcuts.js index 9fc70afbd..d7c6d0c14 100644 --- a/app/assets/javascripts/discourse/lib/keyboard_shortcuts.js +++ b/app/assets/javascripts/discourse/lib/keyboard_shortcuts.js @@ -3,7 +3,6 @@ var PATH_BINDINGS = { 'g l': '/latest', 'g n': '/new', 'g u': '/unread', - 'g f': '/starred', 'g c': '/categories', 'g t': '/top' }, diff --git a/app/assets/javascripts/discourse/models/nav_item.js b/app/assets/javascripts/discourse/models/nav_item.js index b79cd0239..c081fbcd2 100644 --- a/app/assets/javascripts/discourse/models/nav_item.js +++ b/app/assets/javascripts/discourse/models/nav_item.js @@ -74,7 +74,7 @@ Discourse.NavItem.reopenClass({ if (!Discourse.Category.list() && testName === "categories") return null; if (!Discourse.Site.currentProp('top_menu_items').contains(testName)) return null; - var args = { name: name, hasIcon: name === "unread" || name === "starred" }; + var args = { name: name, hasIcon: name === "unread" }; if (opts.category) { args.category = opts.category; } if (opts.noSubcategories) { args.noSubcategories = true; } return Discourse.NavItem.create(args); diff --git a/app/assets/javascripts/discourse/models/topic.js b/app/assets/javascripts/discourse/models/topic.js index 57fe8d907..f4b13f818 100644 --- a/app/assets/javascripts/discourse/models/topic.js +++ b/app/assets/javascripts/discourse/models/topic.js @@ -172,14 +172,6 @@ Discourse.Topic = Discourse.Model.extend({ .then(function () { self.set('archetype', 'regular'); }); }, - starTooltipKey: function() { - return this.get('starred') ? 'starred.help.unstar' : 'starred.help.star'; - }.property('starred'), - - starTooltip: function() { - return I18n.t(this.get('starTooltipKey')); - }.property('starTooltipKey'), - estimatedReadingTime: function() { var wordCount = this.get('word_count'); if (!wordCount) return; @@ -188,15 +180,15 @@ Discourse.Topic = Discourse.Model.extend({ return Math.floor(wordCount / 500.0); }.property('word_count'), - toggleStar: function() { + toggleBookmark: function() { var topic = this; - topic.toggleProperty('starred'); + topic.toggleProperty('bookmarked'); return Discourse.ajax({ - url: "" + (this.get('url')) + "/star", + url: "" + (this.get('url')) + "/bookmark", type: 'PUT', - data: { starred: topic.get('starred') ? true : false } + data: { bookmarked: topic.get('bookmarked') ? true : false } }).then(null, function (error) { - topic.toggleProperty('starred'); + topic.toggleProperty('bookmarked'); if (error && error.responseText) { bootbox.alert($.parseJSON(error.responseText).errors); diff --git a/app/assets/javascripts/discourse/models/user_action.js b/app/assets/javascripts/discourse/models/user_action.js index fd88f1791..ba555e848 100644 --- a/app/assets/javascripts/discourse/models/user_action.js +++ b/app/assets/javascripts/discourse/models/user_action.js @@ -16,7 +16,6 @@ var UserActionTypes = { replies: 6, mentions: 7, quotes: 9, - starred: 10, edits: 11, messages_sent: 12, messages_received: 13 @@ -127,8 +126,6 @@ Discourse.UserAction = Discourse.Model.extend({ case UserActionTypes.likes_given: case UserActionTypes.likes_received: return "likes"; - case UserActionTypes.starred: - return "stars"; case UserActionTypes.edits: return "edits"; case UserActionTypes.bookmarks: @@ -205,7 +202,6 @@ Discourse.UserAction.reopenClass({ TO_COLLAPSE: [ UserActionTypes.likes_given, UserActionTypes.likes_received, - UserActionTypes.starred, UserActionTypes.edits, UserActionTypes.bookmarks ], @@ -213,7 +209,6 @@ Discourse.UserAction.reopenClass({ TO_SHOW: [ UserActionTypes.likes_given, UserActionTypes.likes_received, - UserActionTypes.starred, UserActionTypes.edits, UserActionTypes.bookmarks, UserActionTypes.messages_sent, diff --git a/app/assets/javascripts/discourse/routes/user-activity-starred.js.es6 b/app/assets/javascripts/discourse/routes/user-activity-starred.js.es6 deleted file mode 100644 index 2e74e1ddc..000000000 --- a/app/assets/javascripts/discourse/routes/user-activity-starred.js.es6 +++ /dev/null @@ -1,9 +0,0 @@ -import UserTopicListRoute from "discourse/routes/user-topic-list"; - -export default UserTopicListRoute.extend({ - userActionType: Discourse.UserAction.TYPES.starred, - - model: function() { - return Discourse.TopicList.find('starred', { user_id: this.modelFor('user').get('id') }); - } -}); diff --git a/app/assets/javascripts/discourse/templates/modal/keyboard_shortcuts_help.hbs b/app/assets/javascripts/discourse/templates/modal/keyboard_shortcuts_help.hbs index 64de5b261..c13311cea 100644 --- a/app/assets/javascripts/discourse/templates/modal/keyboard_shortcuts_help.hbs +++ b/app/assets/javascripts/discourse/templates/modal/keyboard_shortcuts_help.hbs @@ -7,7 +7,6 @@ <li>{{{i18n 'keyboard_shortcuts_help.jump_to.latest'}}}</li> <li>{{{i18n 'keyboard_shortcuts_help.jump_to.new'}}}</li> <li>{{{i18n 'keyboard_shortcuts_help.jump_to.unread'}}}</li> - <li>{{{i18n 'keyboard_shortcuts_help.jump_to.starred'}}}</li> <li>{{{i18n 'keyboard_shortcuts_help.jump_to.categories'}}}</li> <li>{{{i18n 'keyboard_shortcuts_help.jump_to.top'}}}</li> </ul> diff --git a/app/assets/javascripts/discourse/views/activity-filter.js.es6 b/app/assets/javascripts/discourse/views/activity-filter.js.es6 index 24445239d..7a7ed0f2a 100644 --- a/app/assets/javascripts/discourse/views/activity-filter.js.es6 +++ b/app/assets/javascripts/discourse/views/activity-filter.js.es6 @@ -54,7 +54,6 @@ export default Ember.Component.extend(StringBuffer, { case Discourse.UserAction.TYPES.bookmarks: return "bookmark"; case Discourse.UserAction.TYPES.edits: return "pencil"; case Discourse.UserAction.TYPES.replies: return "reply"; - case Discourse.UserAction.TYPES.starred: return "star"; } }.property("content.action_type") }); diff --git a/app/assets/javascripts/discourse/views/star-button.js.es6 b/app/assets/javascripts/discourse/views/star-button.js.es6 deleted file mode 100644 index c87aea9f2..000000000 --- a/app/assets/javascripts/discourse/views/star-button.js.es6 +++ /dev/null @@ -1,21 +0,0 @@ -import ButtonView from 'discourse/views/button'; - -export default ButtonView.extend({ - classNames: ['star'], - textKey: 'starred.title', - helpKeyBinding: 'controller.starTooltipKey', - attributeBindings: ['disabled'], - - rerenderTriggers: ['controller.starred'], - - click: function() { - this.get('controller').send('toggleStar'); - }, - - renderIcon: function(buffer) { - buffer.push("<i class='fa fa-star " + - (this.get('controller.starred') ? ' starred' : '') + - "'></i>"); - } -}); - diff --git a/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6 b/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6 index d94cead5c..918845ca6 100644 --- a/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6 +++ b/app/assets/javascripts/discourse/views/topic-footer-buttons.js.es6 @@ -1,7 +1,6 @@ import TopicAdminMenuButton from 'discourse/views/topic-admin-menu-button'; import LoginReplyButton from 'discourse/views/login-reply-button'; import FlagTopicButton from 'discourse/views/flag-topic-button'; -import StarButton from 'discourse/views/star-button'; import ShareButton from 'discourse/views/share-button'; import InviteReplyButton from 'discourse/views/invite-reply-button'; import ReplyButton from 'discourse/views/reply-button'; @@ -30,7 +29,6 @@ export default DiscourseContainerView.extend({ if (this.get('topic.details.can_invite_to')) { this.attachViewClass(InviteReplyButton); } - this.attachViewClass(StarButton); this.attachViewClass(ShareButton); if (this.get('topic.details.can_flag_topic')) { this.attachViewClass(FlagTopicButton); diff --git a/app/assets/stylesheets/common/base/_topic-list.scss b/app/assets/stylesheets/common/base/_topic-list.scss index 6a477b288..751adbada 100644 --- a/app/assets/stylesheets/common/base/_topic-list.scss +++ b/app/assets/stylesheets/common/base/_topic-list.scss @@ -10,9 +10,6 @@ margin-right: 4px; font: 1.071em/0.9 "FontAwesome"; } - .has-icon .starred:before { - content: "\f005"; - } } } diff --git a/app/assets/stylesheets/desktop/discourse.scss b/app/assets/stylesheets/desktop/discourse.scss index 7bc5d8848..e35b97994 100644 --- a/app/assets/stylesheets/desktop/discourse.scss +++ b/app/assets/stylesheets/desktop/discourse.scss @@ -36,24 +36,12 @@ body { } } #main { - .fa-star.starred { - color: $danger; - } a.star { color: dark-light-diff($secondary, $primary, 80%, -20%); &:before { font-family: "FontAwesome"; content: "\f005"; } - &.starred { - color: $danger; - @include hover { - opacity: 1; - &:before { - content: "\f005"; - } - } - } @include hover { opacity: 0.6; } diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss index b2ec22dfc..e02090233 100644 --- a/app/assets/stylesheets/desktop/topic-post.scss +++ b/app/assets/stylesheets/desktop/topic-post.scss @@ -551,12 +551,6 @@ video { line-height: 1.3em; } - a.star { - margin: 0 7px 20px 2px; - color: dark-light-diff($secondary, $primary, 80%, -20%) !important; - } - a.star.starred {color: $danger !important;} - .topic-statuses { margin-top: -2px; } diff --git a/app/assets/stylesheets/mobile/discourse.scss b/app/assets/stylesheets/mobile/discourse.scss index e22c9c93d..65e446814 100644 --- a/app/assets/stylesheets/mobile/discourse.scss +++ b/app/assets/stylesheets/mobile/discourse.scss @@ -18,36 +18,6 @@ body { } } #main { - .fa-star.starred { - color: $danger; - } - a.star { - display: inline-block; - font-size: 1.429em; - color: scale-color($primary, $lightness: 75%); - margin-right: 8px; - margin-top: 4px; - &:before { - font-family: "FontAwesome"; - content: "\f005"; - } - &.starred { - color: $danger; - @include hover { - opacity: 1; - &:before { - content: "\f005"; - } - } - } - @include hover { - opacity: 0.6; - } - - &:active { - opacity: 1; - } - } img.avatar { &.header { width: 45px; diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index 73bc006ae..6ca4ac35b 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -166,14 +166,6 @@ class TopicsController < ApplicationController render nothing: true end - def star - @topic = Topic.find_by(id: params[:topic_id].to_i) - guardian.ensure_can_see!(@topic) - - @topic.toggle_star(current_user, params[:starred] == 'true') - render nothing: true - end - def mute toggle_mute end diff --git a/app/models/admin_dashboard_data.rb b/app/models/admin_dashboard_data.rb index 4f4ff2802..ccb1db1d6 100644 --- a/app/models/admin_dashboard_data.rb +++ b/app/models/admin_dashboard_data.rb @@ -11,7 +11,6 @@ class AdminDashboardData 'users_by_trust_level', 'likes', 'bookmarks', - 'starred', 'emails', 'user_to_user_private_messages', 'system_private_messages', diff --git a/app/models/report.rb b/app/models/report.rb index 51f4d0a6c..3cabe4349 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -91,13 +91,7 @@ class Report end end - def self.report_starred(report) - basic_report_about report, Topic, :starred_counts_per_day, default_days - add_counts report, TopicUser.where(starred: true), 'topic_users.starred_at' - end - # Post action counts: - def self.report_flags(report) basic_report_about report, PostAction, :flag_count_by_date, report.start_date, report.end_date add_counts report, PostAction.where(post_action_type_id: PostActionType.flag_types.values), 'post_actions.created_at' diff --git a/app/models/topic.rb b/app/models/topic.rb index 2eab5fe2d..13f507b63 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -141,13 +141,6 @@ class Topic < ActiveRecord::Base WHERE #{condition[0]})", condition[1]) } - # Helps us limit how many topics can be starred in a day - class StarLimiter < RateLimiter - def initialize(user) - super(user, "starred:#{Date.today}", SiteSetting.max_stars_per_day, 1.day.to_i) - end - end - attr_accessor :ignore_category_auto_close attr_accessor :skip_callbacks @@ -612,27 +605,6 @@ class Topic < ActiveRecord::Base @participants_summary ||= TopicParticipantsSummary.new(self, options).summary end - # Enable/disable the star on the topic - def toggle_star(user, starred) - Topic.transaction do - TopicUser.change(user, id, {starred: starred}.merge( starred ? {starred_at: DateTime.now, unstarred_at: nil} : {unstarred_at: DateTime.now})) - - # Update the star count - exec_sql "UPDATE topics - SET star_count = (SELECT COUNT(*) - FROM topic_users AS ftu - WHERE ftu.topic_id = topics.id - AND ftu.starred = true) - WHERE id = ?", id - - if starred - StarLimiter.new(user).performed! - else - StarLimiter.new(user).rollback! - end - end - end - def make_banner!(user) # only one banner at the same time previous_banner = Topic.where(archetype: Archetype.banner).first @@ -662,10 +634,6 @@ class Topic < ActiveRecord::Base } end - def self.starred_counts_per_day(sinceDaysAgo=30) - TopicUser.starred_since(sinceDaysAgo).by_date_starred.count - end - # Even if the slug column in the database is null, topic.slug will return something: def slug unless slug = read_attribute(:slug) diff --git a/app/models/topic_user.rb b/app/models/topic_user.rb index a70bf224a..7996f1f0f 100644 --- a/app/models/topic_user.rb +++ b/app/models/topic_user.rb @@ -2,9 +2,6 @@ class TopicUser < ActiveRecord::Base belongs_to :user belongs_to :topic - scope :starred_since, lambda { |sinceDaysAgo| where('starred_at > ?', sinceDaysAgo.days.ago) } - scope :by_date_starred, -> { group('date(starred_at)').order('date(starred_at)') } - scope :tracking, lambda { |topic_id| where(topic_id: topic_id) .where("COALESCE(topic_users.notification_level, :regular) >= :tracking", @@ -86,8 +83,6 @@ class TopicUser < ActiveRecord::Base TopicUser.transaction do attrs = attrs.dup - attrs[:starred_at] = DateTime.now if attrs[:starred_at].nil? && attrs[:starred] - if attrs[:notification_level] attrs[:notifications_changed_at] ||= DateTime.now attrs[:notifications_reason_id] ||= TopicUser.notification_reasons[:user_changed] diff --git a/app/models/user_action.rb b/app/models/user_action.rb index 6cd1f24a5..95f87387d 100644 --- a/app/models/user_action.rb +++ b/app/models/user_action.rb @@ -14,7 +14,6 @@ class UserAction < ActiveRecord::Base RESPONSE= 6 MENTION = 7 QUOTE = 9 - STAR = 10 EDIT = 11 NEW_PRIVATE_MESSAGE = 12 GOT_PRIVATE_MESSAGE = 13 @@ -30,7 +29,6 @@ class UserAction < ActiveRecord::Base MENTION, QUOTE, BOOKMARK, - STAR, EDIT ].each_with_index.to_a.flatten] @@ -240,35 +238,8 @@ SQL builder.exec end - def self.synchronize_starred - exec_sql(" - DELETE FROM user_actions ua - WHERE action_type = :star - AND NOT EXISTS ( - SELECT 1 FROM topic_users tu - WHERE - tu.user_id = ua.user_id AND - tu.topic_id = ua.target_topic_id AND - starred - )", star: UserAction::STAR) - - exec_sql("INSERT INTO user_actions - (action_type, user_id, target_topic_id, target_post_id, acting_user_id, created_at, updated_at) - SELECT :star, tu.user_id, tu.topic_id, -1, tu.user_id, tu.starred_at, tu.starred_at - FROM topic_users tu - WHERE starred AND NOT EXISTS( - SELECT 1 FROM user_actions ua - WHERE tu.user_id = ua.user_id AND - tu.topic_id = ua.target_topic_id AND - ua.action_type = :star - ) - ", star: UserAction::STAR) - - end - def self.ensure_consistency! self.synchronize_target_topic_ids - self.synchronize_starred end def self.update_like_count(user_id, action_type, delta) @@ -294,7 +265,7 @@ SQL end unless (guardian.user && guardian.user.id == user_id) || guardian.is_staff? - builder.where("a.action_type not in (#{BOOKMARK},#{STAR})") + builder.where("a.action_type not in (#{BOOKMARK})") builder.where("t.visible") end diff --git a/app/models/user_action_observer.rb b/app/models/user_action_observer.rb index 45fba9064..a7e79ac92 100644 --- a/app/models/user_action_observer.rb +++ b/app/models/user_action_observer.rb @@ -9,27 +9,6 @@ class UserActionObserver < ActiveRecord::Observer log_topic(model) when (model.is_a?(Post)) log_post(model) - when (model.is_a?(TopicUser)) - log_topic_user(model) - end - end - - def log_topic_user(model) - action = UserAction::STAR - - row = { - action_type: action, - user_id: model.user_id, - acting_user_id: model.user_id, - target_topic_id: model.topic_id, - target_post_id: -1, - created_at: model.starred_at - } - - if model.starred - UserAction.log_action!(row) - else - UserAction.remove_action!(row) end end diff --git a/app/serializers/topic_list_item_serializer.rb b/app/serializers/topic_list_item_serializer.rb index 97adc464f..c22560d8b 100644 --- a/app/serializers/topic_list_item_serializer.rb +++ b/app/serializers/topic_list_item_serializer.rb @@ -2,7 +2,6 @@ class TopicListItemSerializer < ListableTopicSerializer attributes :views, :like_count, - :starred, :has_summary, :archetype, :last_poster_username, @@ -13,12 +12,6 @@ class TopicListItemSerializer < ListableTopicSerializer has_many :posters, serializer: TopicPosterSerializer, embed: :objects has_many :participants, serializer: TopicPosterSerializer, embed: :objects - def starred - object.user_data.starred? - end - - alias :include_starred? :has_user_data - def posters object.posters || [] end diff --git a/app/serializers/topic_view_serializer.rb b/app/serializers/topic_view_serializer.rb index 92c08c346..c48c2c1d3 100644 --- a/app/serializers/topic_view_serializer.rb +++ b/app/serializers/topic_view_serializer.rb @@ -29,7 +29,6 @@ class TopicViewSerializer < ApplicationSerializer attributes :draft, :draft_key, :draft_sequence, - :starred, :posted, :unpinned, :pinned_globally, @@ -145,11 +144,6 @@ class TopicViewSerializer < ApplicationSerializer object.topic_user.present? end - def starred - object.topic_user.starred? - end - alias_method :include_starred?, :has_topic_user? - def highest_post_number object.highest_post_number end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 5e206b06d..3a931ef15 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -785,12 +785,6 @@ en: not_logged_in_user: 'user page with summary of current activity and preferences' current_user: 'go to your user page' - starred: - title: 'Star' - help: - star: 'add this topic to your starred list' - unstar: 'remove this topic from your starred list' - topics: bulk: reset_read: "Reset Read" @@ -811,7 +805,6 @@ en: other: "You have selected <b>{{count}}</b> topics." none: - starred: "You have no starred topics." unread: "You have no unread topics." new: "You have no new topics." read: "You haven't read any topics yet." @@ -823,7 +816,6 @@ en: educate: new: '<p>Your new topics appear here.</p><p>By default, topics are considered new and will show a <span class="badge new-topic badge-notification" style="vertical-align:middle;line-height:inherit;">new</span> indicator if they were created in the last 2 days.</p><p>You can change this in your <a href="%{userPrefsUrl}">preferences</a>.</p>' unread: '<p>Your unread topics appear here.</p><p>By default, topics are considered unread and will show unread counts <span class="badge new-posts badge-notification">1</span> if you:</p><ul><li>Created the topic</li><li>Replied to the topic</li><li>Read the topic for more than 4 minutes</li></ul><p>Or if you have explicitly set the topic to Tracked or Watched via the notification control at the bottom of each topic.</p><p>You can change this in your <a href="%{userPrefsUrl}">preferences</a>.</p>' - starred: '<p>Your starred topics appear here.</p><p>To star or unstar a topic, use:</p><ul><li>the <i class="fa fa-star"></i> next to any topic title</li><li>the Star button at the bottom of each topic</li></ul>' bottom: latest: "There are no more latest topics." hot: "There are no more hot topics." @@ -831,7 +823,6 @@ en: read: "There are no more read topics." new: "There are no more new topics." unread: "There are no more unread topics." - starred: "There are no more starred topics." category: "There are no more {{category}} topics." top: "There are no more top topics." @@ -1433,9 +1424,6 @@ en: hot: title: "Hot" help: "a selection of the hottest topics" - starred: - title: "Starred" - help: "topics you starred" read: title: "Read" help: "topics you've read, in the order that you last read them" @@ -2217,7 +2205,6 @@ en: latest: '<b>g</b>, <b>l</b> Latest' new: '<b>g</b>, <b>n</b> New' unread: '<b>g</b>, <b>u</b> Unread' - starred: '<b>g</b>, <b>f</b> Starred' categories: '<b>g</b>, <b>c</b> Categories' top: '<b>g</b>, <b>t</b> Top' navigation: diff --git a/db/migrate/20150106215342_remove_stars.rb b/db/migrate/20150106215342_remove_stars.rb new file mode 100644 index 000000000..7e5f6e44d --- /dev/null +++ b/db/migrate/20150106215342_remove_stars.rb @@ -0,0 +1,29 @@ +class RemoveStars < ActiveRecord::Migration + def up + r = execute <<SQL + INSERT INTO post_actions(user_id, post_id, post_action_type_id, created_at, updated_at) + SELECT tu.user_id, p.id, 1, coalesce(tu.starred_at, now()), coalesce(tu.starred_at, now()) + FROM topic_users tu + JOIN posts p ON p.topic_id = tu.topic_id AND p.post_number = 1 + LEFT JOIN post_actions pa ON + pa.post_id = p.id AND + pa.user_id = tu.user_id AND + pa.post_action_type_id = 1 + WHERE pa.post_id IS NULL AND tu.starred +SQL + puts "#{r.cmd_tuples} stars were converted to bookmarks!" + + execute <<SQL + DELETE FROM user_actions WHERE action_type = 10 +SQL + + remove_column :topic_users, :starred + remove_column :topic_users, :starred_at + remove_column :topic_users, :unstarred_at + remove_column :topics, :star_count + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/lib/discourse.rb b/lib/discourse.rb index 4f5f6528b..c5546eb01 100644 --- a/lib/discourse.rb +++ b/lib/discourse.rb @@ -56,7 +56,7 @@ module Discourse class CSRF < Exception; end def self.filters - @filters ||= [:latest, :unread, :new, :starred, :read, :posted] + @filters ||= [:latest, :unread, :new, :read, :posted] end def self.feed_filters diff --git a/lib/topic_query.rb b/lib/topic_query.rb index 78175bf0c..68c109cb2 100644 --- a/lib/topic_query.rb +++ b/lib/topic_query.rb @@ -69,11 +69,6 @@ class TopicQuery create_list(:latest, {}, latest_results) end - # The starred topics - def list_starred - create_list(:starred) {|topics| topics.where('tu.starred') } - end - def list_read create_list(:read, unordered: true) do |topics| topics.order('COALESCE(tu.last_visited_at, topics.bumped_at) DESC') diff --git a/spec/components/topic_query_spec.rb b/spec/components/topic_query_spec.rb index 48c2e3e77..55070d6d3 100644 --- a/spec/components/topic_query_spec.rb +++ b/spec/components/topic_query_spec.rb @@ -285,27 +285,6 @@ describe TopicQuery do end - context 'list_starred' do - - let(:topic) { Fabricate(:topic) } - - it "returns no results when the user hasn't starred any topics" do - topic_query.list_starred.topics.should be_blank - end - - context 'with a starred topic' do - - before do - topic.toggle_star(user, true) - end - - it "returns the topic after it has been starred" do - topic_query.list_starred.topics.should == [topic] - end - end - - end - context 'list_new' do context 'without a new topic' do @@ -386,11 +365,6 @@ describe TopicQuery do end context "but interacted with" do - it "is not included if starred" do - other_users_topic.toggle_star(user, true) - - topics.should be_blank - end it "is not included if read" do TopicUser.update_last_read(user, other_users_topic.id, 0, 0) diff --git a/spec/controllers/list_controller_spec.rb b/spec/controllers/list_controller_spec.rb index 66b087e95..49184a289 100644 --- a/spec/controllers/list_controller_spec.rb +++ b/spec/controllers/list_controller_spec.rb @@ -184,22 +184,6 @@ describe ListController do end end - context 'starred' do - it 'raises an error when not logged in' do - lambda { xhr :get, :starred }.should raise_error(Discourse::NotLoggedIn) - end - - context 'when logged in' do - before do - log_in_user(@user) - xhr :get, :starred - end - - it { should respond_with(:success) } - end - end - - context 'read' do it 'raises an error when not logged in' do lambda { xhr :get, :read }.should raise_error(Discourse::NotLoggedIn) diff --git a/spec/controllers/topics_controller_spec.rb b/spec/controllers/topics_controller_spec.rb index cc827889d..48c06963d 100644 --- a/spec/controllers/topics_controller_spec.rb +++ b/spec/controllers/topics_controller_spec.rb @@ -436,49 +436,10 @@ describe TopicsController do @topic = Fabricate(:topic, user: log_in) end - it "changes the user's starred flag when the parameter is present" do - Topic.any_instance.expects(:toggle_mute).with(@topic.user) - xhr :put, :mute, topic_id: @topic.id, starred: 'true' - end - - it "removes the user's starred flag when the parameter is not true" do - Topic.any_instance.expects(:toggle_mute).with(@topic.user) - xhr :put, :unmute, topic_id: @topic.id, starred: 'false' - end - end end - describe 'star' do - - it 'needs you to be logged in' do - lambda { xhr :put, :star, topic_id: 1, starred: true }.should raise_error(Discourse::NotLoggedIn) - end - - describe 'when logged in' do - before do - @topic = Fabricate(:topic, user: log_in) - end - - it "ensures the user can see the topic" do - Guardian.any_instance.expects(:can_see?).with(@topic).returns(false) - xhr :put, :star, topic_id: @topic.id, starred: 'true' - response.should be_forbidden - end - - it "changes the user's starred flag when the parameter is present" do - Topic.any_instance.expects(:toggle_star).with(@topic.user, true) - xhr :put, :star, topic_id: @topic.id, starred: 'true' - end - - it "removes the user's starred flag when the parameter is not true" do - Topic.any_instance.expects(:toggle_star).with(@topic.user, false) - xhr :put, :star, topic_id: @topic.id, starred: 'false' - end - end - end - describe 'recover' do it "won't allow us to recover a topic when we're not logged in" do lambda { xhr :put, :recover, topic_id: 1 }.should raise_error(Discourse::NotLoggedIn) diff --git a/spec/fabricators/user_action_fabricator.rb b/spec/fabricators/user_action_fabricator.rb index 0763828c0..201a78852 100644 --- a/spec/fabricators/user_action_fabricator.rb +++ b/spec/fabricators/user_action_fabricator.rb @@ -1,4 +1,4 @@ Fabricator(:user_action) do user - action_type UserAction::STAR + action_type UserAction::BOOKMARK end diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index 664309e40..8f0f9594b 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -562,70 +562,6 @@ describe Topic do end end - describe 'toggle_star' do - - shared_examples_for "adding a star to a topic" do - it 'triggers a forum topic user change with true' do - # otherwise no chance the mock will work - freeze_time - TopicUser.expects(:change).with(@user, @topic.id, starred: true, starred_at: DateTime.now, unstarred_at: nil) - @topic.toggle_star(@user, true) - end - - it 'increases the star_count of the forum topic' do - expect { - @topic.toggle_star(@user, true) - @topic.reload - }.to change(@topic, :star_count).by(1) - end - - it 'triggers the rate limiter' do - Topic::StarLimiter.any_instance.expects(:performed!) - @topic.toggle_star(@user, true) - end - end - - before do - @topic = Fabricate(:topic) - @user = @topic.user - end - - it_should_behave_like "adding a star to a topic" - - describe 'removing a star' do - before do - @topic.toggle_star(@user, true) - @topic.reload - end - - it 'rolls back the rate limiter' do - Topic::StarLimiter.any_instance.expects(:rollback!) - @topic.toggle_star(@user, false) - end - - it 'triggers a forum topic user change with false' do - freeze_time - TopicUser.expects(:change).with(@user, @topic.id, starred: false, unstarred_at: DateTime.now) - @topic.toggle_star(@user, false) - end - - it 'reduces the star_count' do - expect { - @topic.toggle_star(@user, false) - @topic.reload - }.to change(@topic, :star_count).by(-1) - end - - describe 'and adding a star again' do - before do - @topic.toggle_star(@user, false) - @topic.reload - end - it_should_behave_like "adding a star to a topic" - end - end - end - describe "banner" do let(:topic) { Fabricate(:topic) } diff --git a/spec/models/topic_user_spec.rb b/spec/models/topic_user_spec.rb index c1a62ac4d..d4712969f 100644 --- a/spec/models/topic_user_spec.rb +++ b/spec/models/topic_user_spec.rb @@ -20,14 +20,14 @@ describe TopicUser do let(:topic_new_user) { TopicUser.get(topic, new_user)} let(:yesterday) { DateTime.now.yesterday } + def ensure_topic_user + TopicUser.change(user, topic, last_emailed_post_number: 1) + end describe "unpinned" do - before do - TopicUser.change(user, topic, {starred_at: yesterday}) - end - it "defaults to blank" do + ensure_topic_user topic_user.cleared_pinned_at.should be_blank end @@ -37,19 +37,19 @@ describe TopicUser do it 'should be set to tracking if auto_track_topics is enabled' do user.update_column(:auto_track_topics_after_msecs, 0) - TopicUser.change(user, topic, {starred_at: yesterday}) + ensure_topic_user TopicUser.get(topic, user).notification_level.should == TopicUser.notification_levels[:tracking] end it 'should reset regular topics to tracking topics if auto track is changed' do - TopicUser.change(user, topic, {starred_at: yesterday}) + ensure_topic_user user.auto_track_topics_after_msecs = 0 user.save topic_user.notification_level.should == TopicUser.notification_levels[:tracking] end it 'should be set to "regular" notifications, by default on non creators' do - TopicUser.change(user, topic, {starred_at: yesterday}) + ensure_topic_user TopicUser.get(topic,user).notification_level.should == TopicUser.notification_levels[:regular] end @@ -195,37 +195,20 @@ describe TopicUser do describe 'change a flag' do - it 'creates a forum topic user record' do - user; topic - - lambda { - TopicUser.change(user, topic.id, starred: true) - }.should change(TopicUser, :count).by(1) - end - it "only inserts a row once, even on repeated calls" do topic; user lambda { - TopicUser.change(user, topic.id, starred: true) - TopicUser.change(user, topic.id, starred: false) - TopicUser.change(user, topic.id, starred: true) + TopicUser.change(user, topic.id, total_msecs_viewed: 1) + TopicUser.change(user, topic.id, total_msecs_viewed: 2) + TopicUser.change(user, topic.id, total_msecs_viewed: 3) }.should change(TopicUser, :count).by(1) end - it 'triggers the observer callbacks when updating' do - UserActionObserver.instance.expects(:after_save).twice - 3.times { TopicUser.change(user, topic.id, starred: true) } - end - describe 'after creating a row' do before do - TopicUser.change(user, topic.id, starred: true) - end - - it 'has the correct starred value' do - TopicUser.get(topic, user).should be_starred + ensure_topic_user end it 'has a lookup' do diff --git a/spec/models/user_action_spec.rb b/spec/models/user_action_spec.rb index eed6c78f4..e4fd78823 100644 --- a/spec/models/user_action_spec.rb +++ b/spec/models/user_action_spec.rb @@ -257,38 +257,6 @@ describe UserAction do end - describe 'synchronize_starred' do - it 'corrects out of sync starred' do - post = Fabricate(:post) - post.topic.toggle_star(post.user, true) - UserAction.delete_all - - UserAction.log_action!( - action_type: UserAction::STAR, - user_id: post.user.id, - acting_user_id: post.user.id, - target_topic_id: 99, - target_post_id: -1, - ) - - UserAction.log_action!( - action_type: UserAction::STAR, - user_id: Fabricate(:user).id, - acting_user_id: post.user.id, - target_topic_id: post.topic_id, - target_post_id: -1, - ) - - UserAction.synchronize_starred - - actions = UserAction.all.to_a - - expect(actions.length).to eq(1) - expect(actions.first.action_type).to eq(UserAction::STAR) - expect(actions.first.user_id).to eq(post.user.id) - end - end - describe 'synchronize_target_topic_ids' do it 'correct target_topic_id' do post = Fabricate(:post)