diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index e5a37c14a3d..ffce1246243 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -2782,9 +2782,9 @@ en:
Options
- order:views | order:latest | order:likes | | |
+ order:views | order:latest | order:likes | @username | user:foo |
status:open | status:closed | status:archived | status:noreplies | status:single_user |
- #category-slug | category:foo | user:foo | group:foo | badge:foo | |
+ #category-slug | category:foo | group:foo | badge:foo | |
in:likes | in:posted | in:watching | in:tracking | in:private |
in:bookmarks | in:first | in:pinned | in:unpinned | |
posts_count:num | before:days or date | after:days or date | |
diff --git a/lib/search.rb b/lib/search.rb
index 17547d9fa92..c4bb98ca6db 100644
--- a/lib/search.rb
+++ b/lib/search.rb
@@ -279,7 +279,7 @@ class Search
end
end
- advanced_filter(/^\#([a-zA-Z0-9,\-:]+)/) do |posts,match|
+ advanced_filter(/^\#([a-zA-Z0-9\-:]+)/) do |posts,match|
slug = match.to_s.split(":")
if slug[1]
# sub category
@@ -315,6 +315,15 @@ class Search
end
end
+ advanced_filter(/^\@([a-zA-Z0-9_\-.]+)/) do |posts,match|
+ user_id = User.where(staged: false).where(username_lower: match.downcase).pluck(:id).first
+ if user_id
+ posts.where("posts.user_id = #{user_id}")
+ else
+ posts.where("1 = 0")
+ end
+ end
+
advanced_filter(/before:(.*)/) do |posts,match|
if date = Search.word_to_date(match)
posts.where("posts.created_at < ?", date)
diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb
index af371932f20..f3ee6f1561d 100644
--- a/spec/components/search_spec.rb
+++ b/spec/components/search_spec.rb
@@ -426,7 +426,7 @@ describe Search do
expect(Search.execute('boom in:unpinned', guardian: guardian).posts.length).to eq(1)
end
- it 'supports before and after in:first user:' do
+ it 'supports before and after, in:first, user:, @username' do
time = Time.zone.parse('2001-05-20 2:55')
freeze_time(time)
@@ -449,6 +449,8 @@ describe Search do
expect(Search.execute('user:nobody').posts.length).to eq(0)
expect(Search.execute("user:#{_post.user.username}").posts.length).to eq(1)
expect(Search.execute("user:#{_post.user_id}").posts.length).to eq(1)
+
+ expect(Search.execute("@#{_post.user.username}").posts.length).to eq(1)
end
it 'supports group' do