diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/components/actions/suggestions.jsx | 15 | ||||
-rw-r--r-- | app/controllers/api/v1/accounts_controller.rb | 6 | ||||
-rw-r--r-- | app/models/follow.rb | 24 | ||||
-rw-r--r-- | app/models/follow_suggestion.rb | 7 | ||||
-rw-r--r-- | app/views/api/v1/accounts/suggestions.rabl | 2 |
5 files changed, 53 insertions, 1 deletions
diff --git a/app/assets/javascripts/components/actions/suggestions.jsx b/app/assets/javascripts/components/actions/suggestions.jsx new file mode 100644 index 000000000..562a901c5 --- /dev/null +++ b/app/assets/javascripts/components/actions/suggestions.jsx @@ -0,0 +1,15 @@ +import api from '../api'; + +export const SUGGESTIONS_FETCH_REQUEST = 'SUGGESTIONS_FETCH_REQUEST'; +export const SUGGESTIONS_FETCH_SUCCESS = 'SUGGESTIONS_FETCH_SUCCESS'; +export const SUGGESTIONS_FETCH_FAIL = 'SUGGESTIONS_FETCH_FAIL'; + +export function fetchSuggestions() { + return (dispatch, getState) => { + api(getState).get('/api/v1/accounts/suggestions').then(response => { + console.log(response.data); + }).catch(error => { + console.error(error); + }); + }; +}; diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index 930f60cc3..7757fd7f8 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -1,6 +1,6 @@ class Api::V1::AccountsController < ApiController before_action :doorkeeper_authorize! - before_action :set_account, except: :verify_credentials + before_action :set_account, except: [:verify_credentials, :suggestions] respond_to :json def show @@ -19,6 +19,10 @@ class Api::V1::AccountsController < ApiController @followers = @account.followers end + def suggestions + @accounts = FollowSuggestion.get(current_user.account_id) + end + def statuses @statuses = @account.statuses.with_includes.with_counters.paginate_by_max_id(20, params[:max_id], params[:since_id]).to_a end diff --git a/app/models/follow.rb b/app/models/follow.rb index 4f47580e1..1c52f24c0 100644 --- a/app/models/follow.rb +++ b/app/models/follow.rb @@ -22,4 +22,28 @@ class Follow < ApplicationRecord def title destroyed? ? "#{account.acct} is no longer following #{target_account.acct}" : "#{account.acct} started following #{target_account.acct}" end + + after_create :add_to_graph + after_destroy :remove_from_graph + + private + + def add_to_graph + neo = Neography::Rest.new + + a = neo.create_unique_node('account_index', 'Account', account_id.to_s, account_id: account_id) + b = neo.create_unique_node('account_index', 'Account', target_account_id.to_s, account_id: target_account_id) + + neo.create_unique_relationship('follow_index', 'Follow', id.to_s, 'follows', a, b) + rescue Neography::NeographyError => e + Rails.logger.error e + end + + def remove_from_graph + neo = Neography::Rest.new + rel = neo.get_relationship_index('follow_index', 'Follow', id.to_s) + neo.delete_relationship(rel) + rescue Neography::NeographyError => e + Rails.logger.error e + end end diff --git a/app/models/follow_suggestion.rb b/app/models/follow_suggestion.rb new file mode 100644 index 000000000..2f291bc49 --- /dev/null +++ b/app/models/follow_suggestion.rb @@ -0,0 +1,7 @@ +class FollowSuggestion + def self.get(for_account_id) + neo = Neography::Rest.new + account_ids = neo.execute_query('START a=node:account_index(Account={id}) MATCH (a)-[:follows]->(b)-[:follows]->(c) WHERE a <> c AND NOT (a)-[:follows]->(c) RETURN DISTINCT c.account_id', id: for_account_id) + Account.where(id: account_ids['data'].first) unless account_ids.empty? + end +end diff --git a/app/views/api/v1/accounts/suggestions.rabl b/app/views/api/v1/accounts/suggestions.rabl new file mode 100644 index 000000000..f4dc121ea --- /dev/null +++ b/app/views/api/v1/accounts/suggestions.rabl @@ -0,0 +1,2 @@ +collection @accounts +extends('api/v1/accounts/show') |