recent activity search
This commit is contained in:
Родитель
11ff55bb5f
Коммит
c6dd1a8a85
5
Rakefile
5
Rakefile
|
@ -130,7 +130,8 @@ namespace :db do
|
|||
comment_thread.course_id = COURSE_ID
|
||||
comment_thread.save!
|
||||
threads << comment_thread
|
||||
TOP_COMMENTS_PER_THREAD.times do
|
||||
users.sample(3).each {|user| user.subscribe(comment_thread)}
|
||||
(1 + rand(TOP_COMMENTS_PER_THREAD)).times do
|
||||
comment = comment_thread.comments.new(body: Faker::Lorem.paragraph(2))
|
||||
comment.author = users.sample
|
||||
comment.endorsed = [true, false].sample
|
||||
|
@ -140,7 +141,7 @@ namespace :db do
|
|||
top_comments << comment
|
||||
inner_top_comments << comment
|
||||
end
|
||||
ADDITIONAL_COMMENTS_PER_THREAD.times do
|
||||
(1 + rand(ADDITIONAL_COMMENTS_PER_THREAD)).times do
|
||||
comment = inner_top_comments.sample
|
||||
sub_comment = comment.children.new(body: Faker::Lorem.paragraph(2))
|
||||
sub_comment.author = users.sample
|
||||
|
|
35
app.rb
35
app.rb
|
@ -88,6 +88,41 @@ get "#{api_prefix}/search/threads/more_like_this" do
|
|||
end.results.map(&:to_hash).to_json
|
||||
end
|
||||
|
||||
get "#{api_prefix}/search/threads/recent_active" do
|
||||
|
||||
return [].to_json if not params["course_id"]
|
||||
|
||||
follower_id = params["follower_id"]
|
||||
from_time = {
|
||||
"today" => Date.today.to_time,
|
||||
"this_week" => Date.today.to_time - 1.weeks,
|
||||
"this_month" => Date.today.to_time - 1.months,
|
||||
}[params["from_time"] || "today"]
|
||||
|
||||
query_params = {}
|
||||
query_params["course_id"] = params["course_id"] if params["course_id"]
|
||||
query_params["commentable_id"] = params["commentable_id"] if params["commentable_id"]
|
||||
|
||||
comment_threads = if follower_id
|
||||
User.find(follower_id).subscribed_threads.select do |thread|
|
||||
thread.last_activity_at >= from_time and \
|
||||
query_params.to_a.map {|query| thread[query.first] == query.last}.all?
|
||||
end
|
||||
else
|
||||
CommentThread.all.where(query_params.merge(:last_activity_at => {:$gte => from_time}))
|
||||
end
|
||||
|
||||
comment_threads.to_a.sort {|x, y| y.last_activity_at <=> x.last_activity_at}[0..4].to_json
|
||||
end
|
||||
|
||||
#
|
||||
#get "#{api_prefix}/search/tags/trending" do
|
||||
# query_params = {}
|
||||
# query_params["course_id"] = params["course_id"] if params["course_id"]
|
||||
# query_params["commentable_id"] = params["commentable_id"] if params["commentable_id"]
|
||||
# CommentThread.all.where(query_params).to_a.map(&:tags_array).flatten.g
|
||||
#end
|
||||
|
||||
delete "#{api_prefix}/:commentable_id/threads" do |commentable_id|
|
||||
commentable.comment_threads.destroy_all
|
||||
{}.to_json
|
||||
|
|
|
@ -39,6 +39,7 @@ class CommentThread < Content
|
|||
|
||||
belongs_to :author, class_name: "User", inverse_of: :comment_threads, index: true#, autosave: true
|
||||
has_many :comments, dependent: :destroy#, autosave: true# Use destroy to envoke callback on the top-level comments TODO async
|
||||
has_many :activities, autosave: true
|
||||
|
||||
attr_accessible :title, :body, :course_id, :commentable_id, :anonymous, :closed
|
||||
|
||||
|
@ -54,6 +55,8 @@ class CommentThread < Content
|
|||
before_create :set_last_activity_at
|
||||
before_update :set_last_activity_at
|
||||
|
||||
scope :active_since, ->(from_time) { where(:last_activity_at => {:$gte => from_time}) }
|
||||
|
||||
def self.new_dumb_thread(options={})
|
||||
c = self.new
|
||||
c.title = options[:title] || "title"
|
||||
|
@ -94,6 +97,23 @@ class CommentThread < Content
|
|||
search
|
||||
end
|
||||
|
||||
def activity_since(from_time=nil)
|
||||
if from_time
|
||||
activities.where(:created_at => {:$gte => from_time})
|
||||
else
|
||||
activities
|
||||
end
|
||||
end
|
||||
|
||||
def activity_today; activity_since(Date.today.to_time); end
|
||||
|
||||
def activity_this_week; activity_since(Date.today.to_time - 1.weeks); end
|
||||
|
||||
def activity_this_month; activity_since(Date.today.to_time - 1.months); end
|
||||
|
||||
def activity_overall; activity_since(nil); end
|
||||
|
||||
|
||||
def root_comments
|
||||
Comment.roots.where(comment_thread_id: self.id)
|
||||
end
|
||||
|
@ -139,8 +159,6 @@ private
|
|||
RE_WORD = /#{RE_HEADCHAR}(((#{RE_CHAR})*(#{RE_ENDCHAR})+)?(#{RE_ENDONLYCHAR})*)?/
|
||||
RE_TAG = /^#{RE_WORD}( #{RE_WORD})*$/
|
||||
|
||||
|
||||
|
||||
def tag_names_valid
|
||||
unless tags_array.all? {|tag| self.class.tag_name_valid? tag}
|
||||
errors.add :tag, "can consist of words, numbers, dashes and spaces only and cannot start with dash"
|
||||
|
|
|
@ -5,8 +5,8 @@ class Notification
|
|||
field :notification_type, type: String
|
||||
field :info, type: Hash
|
||||
|
||||
belongs_to :actor, class_name: "User", inverse_of: :activities, index: true, autosave: true
|
||||
belongs_to :target, inverse_of: :activities, polymorphic: true, autosave: true
|
||||
#belongs_to :actor, class_name: "User", inverse_of: :activities, index: true, autosave: true
|
||||
#belongs_to :target, inverse_of: :activities, polymorphic: true, index: true, autosave: true
|
||||
|
||||
attr_accessible :notification_type, :info
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ private
|
|||
username = parts.first[1..-1]
|
||||
user = User.where(username: username).first
|
||||
if user
|
||||
list << { position: parts.last.to_i, username: parts.first[1..-1], user_id: user.id }#parts.last.to_i, parts.first[1..-1], user.id]
|
||||
list << { position: parts.last.to_i, username: parts.first[1..-1], user_id: user.id }
|
||||
end
|
||||
end
|
||||
list
|
||||
|
|
|
@ -2,10 +2,19 @@ class PostReplyObserver < Mongoid::Observer
|
|||
observe :comment
|
||||
|
||||
def after_create(comment)
|
||||
self.class.delay.generate_notifications(comment)
|
||||
self.class.delay.generate_activity_and_notifications(comment)
|
||||
end
|
||||
|
||||
def self.generate_notifications(comment)
|
||||
def self.generate_activity_and_notifications(comment)
|
||||
|
||||
activity = Activity.new
|
||||
activity.happend_at = comment.created_at
|
||||
activity.anonymous = comment.anonymous
|
||||
activity.actor = comment.author
|
||||
activity.target = comment.comment_thread
|
||||
activity.activity_type = "post_reply"
|
||||
activity.save!
|
||||
|
||||
if comment.comment_thread.subscribers or (comment.author.followers if not comment.anonymous)
|
||||
notification = Notification.new(
|
||||
notification_type: "post_reply",
|
||||
|
|
|
@ -41,6 +41,22 @@ class User
|
|||
subscriptions_as_subscriber.where(source_type: "User").map(&:source_id)
|
||||
end
|
||||
|
||||
def subscribed_threads
|
||||
subscribed_thread_ids.map {|id| CommentThread.find(id)}
|
||||
end
|
||||
|
||||
def subscribed_commentables
|
||||
subscribed_commentable_ids.map {|id| Commentable.find(id)}
|
||||
end
|
||||
|
||||
def subscribed_users
|
||||
subscribed_user_ids.map {|id| User.find(id)}
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def to_hash(params={})
|
||||
hash = as_document.slice(*%w[_id username external_id])
|
||||
if params[:complete]
|
||||
|
|
Загрузка…
Ссылка в новой задаче