From e20895f251d28b3631b1f5768302517a5b687b04 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 5 Dec 2017 23:02:27 +0100 Subject: Add list of lists component to web UI (#5811) * Add list of lists component to web UI * Add list adding * Add list removing * List editor modal * Add API account search limited by following=true relation * Rework list editor modal * Remove mandatory pagination of GET /api/v1/lists/:id/accounts * Adjust search input placeholder * Fix rspec (#5890) * i18n: (zh-CN) Add missing translations for #5811 (#5891) * i18n: (zh-CN) yarn manage:translations -- zh-CN * i18n: (zh-CN) Add missing translations for #5811 * Fix some issues - Display loading/missing state for list timelines - Order lists alphabetically in overview - Fix async list editor reset - Redirect to /lists after deleting unpinned list - Redirect to / after pinning a list * Remove dead list columns when a list is deleted or fetch returns 404 --- app/models/account.rb | 53 +++++++++++++++++++++++++++++++++------------- app/models/list_account.rb | 2 ++ 2 files changed, 40 insertions(+), 15 deletions(-) (limited to 'app/models') diff --git a/app/models/account.rb b/app/models/account.rb index b6d46b2cc..77b78ffef 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -277,23 +277,46 @@ class Account < ApplicationRecord find_by_sql([sql, limit]) end - def advanced_search_for(terms, account, limit = 10) + def advanced_search_for(terms, account, limit = 10, following = false) textsearch, query = generate_query_for_search(terms) - sql = <<-SQL.squish - SELECT - accounts.*, - (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank - FROM accounts - LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) OR (accounts.id = f.target_account_id AND f.account_id = ?) - WHERE #{query} @@ #{textsearch} - AND accounts.suspended = false - GROUP BY accounts.id - ORDER BY rank DESC - LIMIT ? - SQL - - find_by_sql([sql, account.id, account.id, limit]) + if following + sql = <<-SQL.squish + WITH first_degree AS ( + SELECT target_account_id + FROM follows + WHERE account_id = ? + ) + SELECT + accounts.*, + (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank + FROM accounts + LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) OR (accounts.id = f.target_account_id AND f.account_id = ?) + WHERE accounts.id IN (SELECT * FROM first_degree) + AND #{query} @@ #{textsearch} + AND accounts.suspended = false + GROUP BY accounts.id + ORDER BY rank DESC + LIMIT ? + SQL + + find_by_sql([sql, account.id, account.id, account.id, limit]) + else + sql = <<-SQL.squish + SELECT + accounts.*, + (count(f.id) + 1) * ts_rank_cd(#{textsearch}, #{query}, 32) AS rank + FROM accounts + LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = ?) OR (accounts.id = f.target_account_id AND f.account_id = ?) + WHERE #{query} @@ #{textsearch} + AND accounts.suspended = false + GROUP BY accounts.id + ORDER BY rank DESC + LIMIT ? + SQL + + find_by_sql([sql, account.id, account.id, limit]) + end end private diff --git a/app/models/list_account.rb b/app/models/list_account.rb index c08239aa0..253932590 100644 --- a/app/models/list_account.rb +++ b/app/models/list_account.rb @@ -14,6 +14,8 @@ class ListAccount < ApplicationRecord belongs_to :account, required: true belongs_to :follow, required: true + validates :account_id, uniqueness: { scope: :list_id } + before_validation :set_follow private -- cgit