diff --git a/app/controllers/moments_controller.rb b/app/controllers/moments_controller.rb index 6229a3e8bc..468615f7fa 100644 --- a/app/controllers/moments_controller.rb +++ b/app/controllers/moments_controller.rb @@ -25,6 +25,7 @@ def index # GET /moments/1.json def show show_with_comments(@moment) + @resources = ResourceRecommendation.new(@moment).resources end # GET /moments/new diff --git a/app/services/moment_keywords.rb b/app/services/moment_keywords.rb new file mode 100644 index 0000000000..0b34af87de --- /dev/null +++ b/app/services/moment_keywords.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +class MomentKeywords + def initialize(moment) + @moment = moment + @moment_keywords = [] + end + + def extract_moment_keywords + extract_keywords(@moment.categories) + extract_keywords(@moment.moods) + extract_keywords(@moment.strategies) + extract_moment_name + extract_moment_why + extract_moment_fix + remove_special_chars + downcase_keywords + end + + private + + def strip_tags(str) + ActionController::Base.helpers.strip_tags(str) + end + + def extract_keywords(array) + array.each do |item| + @moment_keywords.push(item['name'].split, + strip_tags(item['description']).split) + end + end + + def extract_moment_name + @moment_keywords.push(@moment.name.split) + end + + def extract_moment_why + @moment_keywords.push(strip_tags(@moment.why).split) + end + + def extract_moment_fix + @moment_keywords.push(strip_tags(@moment.fix).split) + end + + def remove_special_chars + @moment_keywords = @moment_keywords.flatten.each do |keyword| + keyword.tr!('-', ' ') + keyword.gsub!(/[^\p{Alpha} -]/, '') + end + end + + def downcase_keywords + @moment_keywords = @moment_keywords.map(&:downcase) + end +end diff --git a/app/services/resource_recommendation.rb b/app/services/resource_recommendation.rb new file mode 100644 index 0000000000..11433af6f0 --- /dev/null +++ b/app/services/resource_recommendation.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +class ResourceRecommendation + def initialize(moment) + @moment = moment + @moment_keywords = [] + end + + def resources + @moment_keywords = MomentKeywords.new(@moment).extract_moment_keywords + all_resources.select do |resource| + tags = resource['tags'].flat_map do |tag| + tag.tr('_', ' ') + end + (tags & @moment_keywords).any? + end + end + + private + + def all_resources + JSON.parse(File.read(Rails.root.join('doc', 'pages', 'resources.json'))) + end +end diff --git a/app/views/moments/show.html.erb b/app/views/moments/show.html.erb index 89c7ed2b68..b979fd3cf2 100644 --- a/app/views/moments/show.html.erb +++ b/app/views/moments/show.html.erb @@ -43,6 +43,16 @@ <% end %> +
+
<%= label_tag "What resources could help?" %>
+ +
+ <% if @moment.owned_by?(current_user) && @moment.shared? %>
<%= react_component('Form', props: secret_share_props(@moment)) %> diff --git a/spec/services/moment_keywords_spec.rb b/spec/services/moment_keywords_spec.rb new file mode 100644 index 0000000000..f17fb65b07 --- /dev/null +++ b/spec/services/moment_keywords_spec.rb @@ -0,0 +1,38 @@ +describe MomentKeywords do + let(:moment) do + FactoryBot.build( + :moment, + categories: [build(:category, name: 'free', description: 'Description')], + moods: [build(:mood, name: 'Name', description: 'Blog^^')], + strategies: [build(:strategy, name: 'Name', description: 'books@!##.')], + name: "ADDICTION", + why: "self-care.", + fix: "@Teachers!!" + ) + end + + subject(:keywords) { MomentKeywords.new(moment).extract_moment_keywords } + + it 'downcases words' do + expect(keywords).to include("addiction") + end + + it 'removes hyphen from compound words' do + expect(keywords).to include("self care") + end + + it 'removes special characters' do + expect(keywords).to include("teachers") + end + + it 'returns an array of all the key words' do + expect(keywords).to eq( + ["free", "description","name", "blog", "name", "books", + "addiction", "self care", "teachers"] + ) + end +end + + + + diff --git a/spec/services/resource_recommendation_spec.rb b/spec/services/resource_recommendation_spec.rb new file mode 100644 index 0000000000..da53f7525f --- /dev/null +++ b/spec/services/resource_recommendation_spec.rb @@ -0,0 +1,22 @@ +describe ResourceRecommendation do + subject(:moment) {FactoryBot.build(:moment, + name: 'SELF-INJURY@', + why: 'text', + fix: 'text' )} + + let(:resources) { ResourceRecommendation.new(moment).resources} + + describe 'A test for resources method from ResourceRecommendation class' do + it 'returns recommended resources based on moment keywords' do + available_resource = [{'tags'=> ["self_injury"]}] + allow(JSON).to receive(:parse) { available_resource } + expect(resources).to eq(available_resource) + end + + it 'does not return any matched resources' do + available_resource2 = [{'tags'=> ['self_care', 'anonymous', 'ios', 'communities']}] + allow(JSON).to receive(:parse) { available_resource2 } + expect(resources).not_to eq(available_resource2) + end + end +end