diff --git a/app/controllers/api/v1/search_controller.rb b/app/controllers/api/v1/search_controller.rb index e34753b5..a9b60c69 100644 --- a/app/controllers/api/v1/search_controller.rb +++ b/app/controllers/api/v1/search_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Api::V1::SearchController < Api::BaseController - RESULTS_LIMIT = 20 + RESULTS_LIMIT = 100 respond_to :json diff --git a/app/javascript/gabsocial/actions/search.js b/app/javascript/gabsocial/actions/search.js index 7c06670e..b670d25c 100644 --- a/app/javascript/gabsocial/actions/search.js +++ b/app/javascript/gabsocial/actions/search.js @@ -37,7 +37,6 @@ export function submitSearch() { params: { q: value, resolve: true, - limit: 5, }, }).then(response => { if (response.data.accounts) { diff --git a/app/javascript/gabsocial/components/group_list_item.js b/app/javascript/gabsocial/components/group_list_item.js new file mode 100644 index 00000000..59cee23b --- /dev/null +++ b/app/javascript/gabsocial/components/group_list_item.js @@ -0,0 +1,40 @@ +import React from 'react'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import ImmutablePureComponent from 'react-immutable-pure-component'; +import { defineMessages, injectIntl } from 'react-intl'; +import { Link } from 'react-router-dom'; +import { shortNumberFormat } from '../utils/numbers'; + +const messages = defineMessages({ + members: { id: 'groups.card.members', defaultMessage: 'Members' }, +}); + +export default +@injectIntl +class GroupListItem extends ImmutablePureComponent { + static propTypes = { + group: ImmutablePropTypes.map.isRequired, + } + + render() { + const { intl, group } = this.props; + + if (!group) return null; + + return ( +
+
+ + {group.get('title')} +
+ + {shortNumberFormat(group.get('member_count'))} +   + {intl.formatMessage(messages.members)} + + +
+
+ ); + } +} \ No newline at end of file diff --git a/app/javascript/gabsocial/components/hashtag.js b/app/javascript/gabsocial/components/hashtag.js index ddcff27a..ee7df748 100644 --- a/app/javascript/gabsocial/components/hashtag.js +++ b/app/javascript/gabsocial/components/hashtag.js @@ -9,10 +9,10 @@ const Hashtag = ({ hashtag }) => (
- #{hashtag.get('name')} + #{hashtag.get('name')} - {shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']))} }} /> + {shortNumberFormat(hashtag.getIn(['history', 0, 'accounts']))} }} />
diff --git a/app/javascript/gabsocial/features/compose/components/search.js b/app/javascript/gabsocial/features/compose/components/search.js index a0c95584..476cf9b3 100644 --- a/app/javascript/gabsocial/features/compose/components/search.js +++ b/app/javascript/gabsocial/features/compose/components/search.js @@ -19,7 +19,7 @@ class SearchPopout extends React.PureComponent { render () { const { style } = this.props; - const extraInformation = searchEnabled ? : ; + const extraInformation = searchEnabled ? : ; return (
diff --git a/app/javascript/gabsocial/features/compose/components/search_results.js b/app/javascript/gabsocial/features/compose/components/search_results.js index de876c84..93a63079 100644 --- a/app/javascript/gabsocial/features/compose/components/search_results.js +++ b/app/javascript/gabsocial/features/compose/components/search_results.js @@ -9,13 +9,16 @@ import Hashtag from '../../../components/hashtag'; import Icon from 'gabsocial/components/icon'; import WhoToFollowPanel from '../../ui/components/who_to_follow_panel'; // import TrendsPanel from '../../ui/components/trends_panel'; +import GroupListItem from 'gabsocial/components/group_list_item'; -export default @injectIntl +export default +@injectIntl class SearchResults extends ImmutablePureComponent { static propTypes = { results: ImmutablePropTypes.map.isRequired, intl: PropTypes.object.isRequired, + location: PropTypes.object, }; state = { @@ -23,7 +26,7 @@ class SearchResults extends ImmutablePureComponent { } render () { - const { intl, results, dismissSuggestion } = this.props; + const { results, location } = this.props; const { isSmallScreen } = this.state; if (results.isEmpty() && isSmallScreen) { @@ -35,38 +38,44 @@ class SearchResults extends ImmutablePureComponent { ); } - let accounts, statuses, hashtags; + const pathname = location.pathname || ''; + const showPeople = pathname === '/search/people'; + const showHashtags = pathname === '/search/hashtags'; + const showGroups = pathname === '/search/groups'; + const isTop = !showPeople && !showHashtags && !showGroups; + + let accounts, statuses, hashtags, groups; let count = 0; - if (results.get('accounts') && results.get('accounts').size > 0) { - count += results.get('accounts').size; + if (results.get('accounts') && results.get('accounts').size > 0 && (isTop || showPeople)) { + const size = isTop ? Math.min(results.get('accounts').size, 5) : results.get('accounts').size; + count += size; accounts = (
-
- - {results.get('accounts').map(accountId => )} +
+ {results.get('accounts').slice(0, size).map(accountId => )}
); } - if (results.get('statuses') && results.get('statuses').size > 0) { - count += results.get('statuses').size; - statuses = ( + if (results.get('groups') && results.get('groups').size > 0 && (isTop || showGroups)) { + const size = isTop ? Math.min(results.get('groups').size, 5) : results.get('groups').size; + count += size; + groups = (
-
- - {results.get('statuses').map(statusId => )} +
+ {results.get('groups').slice(0, size).map(group => )}
); } - if (results.get('hashtags') && results.get('hashtags').size > 0) { - count += results.get('hashtags').size; + if (results.get('hashtags') && results.get('hashtags').size > 0 && (isTop || showHashtags)) { + const size = isTop ? Math.min(results.get('hashtags').size, 5) : results.get('hashtags').size; + count += size; hashtags = (
- - {results.get('hashtags').map(hashtag => )} + {results.get('hashtags').slice(0, size).map(hashtag => )}
); } @@ -79,6 +88,7 @@ class SearchResults extends ImmutablePureComponent {
{accounts} + {groups} {statuses} {hashtags}
diff --git a/app/javascript/gabsocial/features/compose/containers/search_results_container.js b/app/javascript/gabsocial/features/compose/containers/search_results_container.js index f9637861..cafe5010 100644 --- a/app/javascript/gabsocial/features/compose/containers/search_results_container.js +++ b/app/javascript/gabsocial/features/compose/containers/search_results_container.js @@ -1,6 +1,7 @@ import { connect } from 'react-redux'; import SearchResults from '../components/search_results'; import { fetchSuggestions, dismissSuggestion } from '../../../actions/suggestions'; +import { withRouter } from 'react-router-dom'; const mapStateToProps = state => ({ results: state.getIn(['search', 'results']), @@ -12,4 +13,4 @@ const mapDispatchToProps = dispatch => ({ dismissSuggestion: account => dispatch(dismissSuggestion(account.get('id'))), }); -export default connect(mapStateToProps, mapDispatchToProps)(SearchResults); +export default withRouter(connect(mapStateToProps, mapDispatchToProps)(SearchResults)); diff --git a/app/javascript/gabsocial/features/search/components/header.js b/app/javascript/gabsocial/features/search/components/header.js index 133e298b..837fb5fd 100644 --- a/app/javascript/gabsocial/features/search/components/header.js +++ b/app/javascript/gabsocial/features/search/components/header.js @@ -1,8 +1,7 @@ import React from 'react'; import { connect } from 'react-redux'; -import ImmutablePropTypes from 'react-immutable-proptypes'; +import { withRouter } from 'react-router-dom'; import PropTypes from 'prop-types'; -import ImmutablePureComponent from 'react-immutable-pure-component'; import { FormattedMessage } from 'react-intl'; import { NavLink } from 'react-router-dom'; @@ -11,7 +10,10 @@ const mapStateToProps = state => ({ submitted: state.getIn(['search', 'submitted']), }); -class Header extends ImmutablePureComponent { +export default +@withRouter +@connect(mapStateToProps) +class Header extends React.PureComponent { static propTypes = { value: PropTypes.string, @@ -32,10 +34,6 @@ class Header extends ImmutablePureComponent { render () { const { submittedValue } = this.state; - if (!submittedValue) { - return null; - } - return (
@@ -46,27 +44,22 @@ class Header extends ImmutablePureComponent {
- + - {/* - - - + - + - + - */} +
); } -} - -export default connect(mapStateToProps)(Header); +} \ No newline at end of file diff --git a/app/javascript/gabsocial/features/ui/index.js b/app/javascript/gabsocial/features/ui/index.js index d65ba40a..2307ba42 100644 --- a/app/javascript/gabsocial/features/ui/index.js +++ b/app/javascript/gabsocial/features/ui/index.js @@ -202,7 +202,10 @@ class SwitchingColumnsArea extends React.PureComponent { - + + + + diff --git a/app/javascript/gabsocial/locales/ast.json b/app/javascript/gabsocial/locales/ast.json index cf9d67b9..d10e280d 100644 --- a/app/javascript/gabsocial/locales/ast.json +++ b/app/javascript/gabsocial/locales/ast.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "etiqueta", "search_popout.tips.status": "estáu", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "usuariu", "search_results.accounts": "Xente", "search_results.hashtags": "Etiquetes", diff --git a/app/javascript/gabsocial/locales/bg.json b/app/javascript/gabsocial/locales/bg.json index 93e850a7..d9653985 100644 --- a/app/javascript/gabsocial/locales/bg.json +++ b/app/javascript/gabsocial/locales/bg.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", diff --git a/app/javascript/gabsocial/locales/defaultMessages.json b/app/javascript/gabsocial/locales/defaultMessages.json index 0bacc9c6..f1c8458a 100644 --- a/app/javascript/gabsocial/locales/defaultMessages.json +++ b/app/javascript/gabsocial/locales/defaultMessages.json @@ -1026,7 +1026,7 @@ "id": "search_popout.tips.full_text" }, { - "defaultMessage": "Simple text returns matching display names, usernames and hashtags", + "defaultMessage": "Simple text returns matching display names, usernames, groups and hashtags", "id": "search_popout.tips.text" }, { diff --git a/app/javascript/gabsocial/locales/en.json b/app/javascript/gabsocial/locales/en.json index 66365f4b..83d79665 100644 --- a/app/javascript/gabsocial/locales/en.json +++ b/app/javascript/gabsocial/locales/en.json @@ -310,7 +310,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favorited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", diff --git a/app/javascript/gabsocial/locales/hi.json b/app/javascript/gabsocial/locales/hi.json index 3c53a68b..e05f9231 100644 --- a/app/javascript/gabsocial/locales/hi.json +++ b/app/javascript/gabsocial/locales/hi.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", diff --git a/app/javascript/gabsocial/locales/hr.json b/app/javascript/gabsocial/locales/hr.json index 677e6d29..454818af 100644 --- a/app/javascript/gabsocial/locales/hr.json +++ b/app/javascript/gabsocial/locales/hr.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", diff --git a/app/javascript/gabsocial/locales/hu.json b/app/javascript/gabsocial/locales/hu.json index 1fc83213..3209d308 100644 --- a/app/javascript/gabsocial/locales/hu.json +++ b/app/javascript/gabsocial/locales/hu.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "felhasználó", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", diff --git a/app/javascript/gabsocial/locales/id.json b/app/javascript/gabsocial/locales/id.json index e9c99f53..c2739efe 100644 --- a/app/javascript/gabsocial/locales/id.json +++ b/app/javascript/gabsocial/locales/id.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "tagar", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", diff --git a/app/javascript/gabsocial/locales/io.json b/app/javascript/gabsocial/locales/io.json index ca9d7091..ff294b9e 100644 --- a/app/javascript/gabsocial/locales/io.json +++ b/app/javascript/gabsocial/locales/io.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", diff --git a/app/javascript/gabsocial/locales/lv.json b/app/javascript/gabsocial/locales/lv.json index 55ec186c..49d00b0c 100644 --- a/app/javascript/gabsocial/locales/lv.json +++ b/app/javascript/gabsocial/locales/lv.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", diff --git a/app/javascript/gabsocial/locales/ms.json b/app/javascript/gabsocial/locales/ms.json index 4b0adf09..bc1d883c 100644 --- a/app/javascript/gabsocial/locales/ms.json +++ b/app/javascript/gabsocial/locales/ms.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", diff --git a/app/javascript/gabsocial/locales/sl.json b/app/javascript/gabsocial/locales/sl.json index dcd88c14..6d7ee45c 100644 --- a/app/javascript/gabsocial/locales/sl.json +++ b/app/javascript/gabsocial/locales/sl.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", diff --git a/app/javascript/gabsocial/locales/ta.json b/app/javascript/gabsocial/locales/ta.json index bf26aaf7..6813c439 100644 --- a/app/javascript/gabsocial/locales/ta.json +++ b/app/javascript/gabsocial/locales/ta.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", diff --git a/app/javascript/gabsocial/locales/th.json b/app/javascript/gabsocial/locales/th.json index 268d0a7a..5fbbba05 100644 --- a/app/javascript/gabsocial/locales/th.json +++ b/app/javascript/gabsocial/locales/th.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "แฮชแท็ก", "search_popout.tips.status": "สถานะ", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "ผู้ใช้", "search_results.accounts": "ผู้คน", "search_results.hashtags": "แฮชแท็ก", diff --git a/app/javascript/gabsocial/locales/tr.json b/app/javascript/gabsocial/locales/tr.json index e6585083..c03f2411 100644 --- a/app/javascript/gabsocial/locales/tr.json +++ b/app/javascript/gabsocial/locales/tr.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "durum", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "kullanıcı", "search_results.accounts": "İnsanlar", "search_results.hashtags": "Hashtagler", diff --git a/app/javascript/gabsocial/locales/uk.json b/app/javascript/gabsocial/locales/uk.json index d4d61042..f97cc36f 100644 --- a/app/javascript/gabsocial/locales/uk.json +++ b/app/javascript/gabsocial/locales/uk.json @@ -307,7 +307,7 @@ "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", "search_popout.tips.hashtag": "hashtag", "search_popout.tips.status": "status", - "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags", + "search_popout.tips.text": "Simple text returns matching display names, usernames, groups and hashtags", "search_popout.tips.user": "user", "search_results.accounts": "People", "search_results.hashtags": "Hashtags", diff --git a/app/javascript/gabsocial/reducers/search.js b/app/javascript/gabsocial/reducers/search.js index ec3191de..163b47a8 100644 --- a/app/javascript/gabsocial/reducers/search.js +++ b/app/javascript/gabsocial/reducers/search.js @@ -43,6 +43,7 @@ export default function search(state = initialState, action) { accounts: ImmutableList(action.results.accounts.map(item => item.id)), statuses: ImmutableList(action.results.statuses.map(item => item.id)), hashtags: fromJS(action.results.hashtags), + groups: fromJS(action.results.groups), })).set('submitted', true); default: return state; diff --git a/app/javascript/styles/gabsocial/components.scss b/app/javascript/styles/gabsocial/components.scss index fd83909d..ddf7ad9b 100644 --- a/app/javascript/styles/gabsocial/components.scss +++ b/app/javascript/styles/gabsocial/components.scss @@ -4625,14 +4625,20 @@ noscript { text-overflow: ellipsis; white-space: nowrap; + span { + text-decoration: none; + } + strong { - font-weight: 500; + color: $primary-text-color; + font-weight: 600; + text-decoration: none; } a { color: $darker-text-color; text-decoration: none; - font-size: 14px; + font-size: 16px; font-weight: 500; display: block; overflow: hidden; @@ -5198,6 +5204,7 @@ noscript { white-space: nowrap; max-width: 1200px; margin: 0 auto; + height: 32px; } &__type-filters-tabs { diff --git a/app/models/group.rb b/app/models/group.rb index 1b03b569..c13519cd 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -43,6 +43,17 @@ class Group < ApplicationRecord before_destroy :clean_feed_manager after_create :add_owner_to_accounts + class << self + def search_for(term, limit = 100, offset = 0) + pattern = sanitize_sql_like(term.strip) + '%' + + Group.where('lower(title) like lower(?) AND is_archived=false', pattern) + .order(:title) + .limit(limit) + .offset(offset) + end + end + private def add_owner_to_accounts diff --git a/app/models/search.rb b/app/models/search.rb index 676c2a7f..fe5e1eb1 100644 --- a/app/models/search.rb +++ b/app/models/search.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true class Search < ActiveModelSerializers::Model - attributes :accounts, :statuses, :hashtags + attributes :accounts, :statuses, :hashtags, :groups end diff --git a/app/serializers/rest/search_serializer.rb b/app/serializers/rest/search_serializer.rb index 157f543a..769b0700 100644 --- a/app/serializers/rest/search_serializer.rb +++ b/app/serializers/rest/search_serializer.rb @@ -5,6 +5,7 @@ class REST::SearchSerializer < ActiveModel::Serializer has_many :accounts, serializer: REST::AccountSerializer has_many :statuses, serializer: REST::StatusSerializer + has_many :groups, serializer: REST::GroupSerializer def hashtags object.hashtags.map(&:name) diff --git a/app/serializers/rest/v2/search_serializer.rb b/app/serializers/rest/v2/search_serializer.rb index cdb6b3a5..61c531ea 100644 --- a/app/serializers/rest/v2/search_serializer.rb +++ b/app/serializers/rest/v2/search_serializer.rb @@ -4,4 +4,5 @@ class REST::V2::SearchSerializer < ActiveModel::Serializer has_many :accounts, serializer: REST::AccountSerializer has_many :statuses, serializer: REST::StatusSerializer has_many :hashtags, serializer: REST::TagSerializer + has_many :groups, serializer: REST::GroupSerializer end diff --git a/app/services/search_service.rb b/app/services/search_service.rb index e0da61da..50bd0543 100644 --- a/app/services/search_service.rb +++ b/app/services/search_service.rb @@ -16,6 +16,7 @@ class SearchService < BaseService results[:accounts] = perform_accounts_search! if account_searchable? results[:statuses] = perform_statuses_search! if full_text_searchable? results[:hashtags] = perform_hashtags_search! if hashtag_searchable? + results[:groups] = perform_groups_search! end end end @@ -32,6 +33,14 @@ class SearchService < BaseService ) end + def perform_groups_search! + Group.search_for( + @query.gsub(/\A#/, ''), + @limit, + @offset + ) + end + def perform_statuses_search! definition = StatusesIndex.filter(term: { searchable_by: @account.id }) .query(multi_match: { type: 'most_fields', query: @query, operator: 'and', fields: %w(text text.stemmed) })