diff --git a/README.md b/README.md index 616b863b3..aa0da2c70 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,12 @@ IQDB integration is now delegated to the [IQDBS service](https://github.com/r888 You will need to install your own copy and enable the appropriate configuration settings. +### Listbooru Service + +In order to access saved search functionality you will need to install and +configure the [Listbooru service](https://github.com/r888888888/listbooru). + ### Archive Service -In order to access versioned data for pools (and eventually posts) you will need to install and configure the [Archive service](https://github.com/r888888888/archives). +In order to access versioned data for pools (and eventually posts) you will +need to install and configure the [Archives service](https://github.com/r888888888/archives). diff --git a/app/controllers/saved_search_category_changes_controller.rb b/app/controllers/saved_search_category_changes_controller.rb index 0c97caa02..ef38de940 100644 --- a/app/controllers/saved_search_category_changes_controller.rb +++ b/app/controllers/saved_search_category_changes_controller.rb @@ -1,5 +1,6 @@ class SavedSearchCategoryChangesController < ApplicationController before_filter :member_only + before_filter :check_availabililty respond_to :html def new @@ -11,4 +12,22 @@ class SavedSearchCategoryChangesController < ApplicationController flash[:notice] = "Saved searches will be renamed" redirect_to saved_searches_path end + +private + + def check_availabililty + if !SavedSearch.enabled? + respond_to do |format| + format.html do + flash[:notice] = "Listbooru service is not configured. Saved searches are not available." + redirect_to :back + end + format.json do + render json: {success: false, reason: "Listbooru service is not configured"}.to_json, status: 501 + end + end + + return false + end + end end diff --git a/app/controllers/saved_searches_controller.rb b/app/controllers/saved_searches_controller.rb index 0822e213b..f9a8861d8 100644 --- a/app/controllers/saved_searches_controller.rb +++ b/app/controllers/saved_searches_controller.rb @@ -1,5 +1,6 @@ class SavedSearchesController < ApplicationController before_filter :member_only + before_fitler :check_availability respond_to :html, :xml, :json, :js def index @@ -47,6 +48,22 @@ class SavedSearchesController < ApplicationController private + def check_availabililty + if !SavedSearch.enabled? + respond_to do |format| + format.html do + flash[:notice] = "Listbooru service is not configured. Saved searches are not available." + redirect_to :back + end + format.json do + render json: {success: false, reason: "Listbooru service is not configured"}.to_json, status: 501 + end + end + + return false + end + end + def saved_searches CurrentUser.user.saved_searches end diff --git a/app/logical/moderator/tag_batch_change.rb b/app/logical/moderator/tag_batch_change.rb index 940d0463e..7a46025ec 100644 --- a/app/logical/moderator/tag_batch_change.rb +++ b/app/logical/moderator/tag_batch_change.rb @@ -23,11 +23,12 @@ module Moderator tags = Tag.scan_tags(antecedent, :strip_metatags => true) conds = tags.map {|x| "tag_query like ?"}.join(" AND ") conds = [conds, *tags.map {|x| "%#{x}%"}] - SavedSearch.where(*conds).find_each do |ss| - ss.tag_query = (ss.tag_query_array - tags + antecedent).uniq.join(" ") - ss.save + if SavedSearch.enabled? + SavedSearch.where(*conds).find_each do |ss| + ss.tag_query = (ss.tag_query_array - tags + antecedent).uniq.join(" ") + ss.save + end end - end end end diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index 13fac8b59..f818f24e1 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -102,15 +102,17 @@ class PostQueryBuilder end def add_saved_search_relation(saved_searches, relation) - saved_searches.each do |saved_search| - if saved_search == "all" - post_ids = SavedSearch.post_ids(CurrentUser.id) - else - post_ids = SavedSearch.post_ids(CurrentUser.id, saved_search) - end + if SavedSearch.enabled? + saved_searches.each do |saved_search| + if saved_search == "all" + post_ids = SavedSearch.post_ids(CurrentUser.id) + else + post_ids = SavedSearch.post_ids(CurrentUser.id, saved_search) + end - post_ids = [0] if post_ids.empty? - relation = relation.where(["posts.id IN (?)", post_ids]) + post_ids = [0] if post_ids.empty? + relation = relation.where(["posts.id IN (?)", post_ids]) + end end relation diff --git a/app/models/saved_search.rb b/app/models/saved_search.rb index 64fbfb628..0ed5b3974 100644 --- a/app/models/saved_search.rb +++ b/app/models/saved_search.rb @@ -5,63 +5,96 @@ class SavedSearch < ActiveRecord::Base extend ActiveSupport::Concern module ClassMethods + def enabled? + Danbooru.config.aws_sqs_saved_search_url.present? + end + def posts_search_available? - Danbooru.config.listbooru_server.present? && CurrentUser.is_gold? + enabled? && CurrentUser.is_gold? + end + + def sqs_service + SqsService.new(Danbooru.config.aws_sqs_saved_search_url) end def refresh_listbooru(user_id) - return false unless Danbooru.config.listbooru_enabled? + return false unless enabled? - sqs = SqsService.new(Danbooru.config.aws_sqs_queue_url) - sqs.send_message("refresh\n#{user_id}") + sqs_service.send_message("refresh\n#{user_id}") end def reset_listbooru(user_id) - return false unless Danbooru.config.listbooru_enabled? + return false unless enabled? - sqs = SqsService.new(Danbooru.config.aws_sqs_queue_url) user = User.find(user_id) - sqs.send_message("delete\n#{user_id}\nall\n") + sqs_service.send_message("delete\n#{user_id}\nall\n") user.saved_searches.each do |saved_search| - sqs.send_message("create\n#{user_id}\n#{saved_search.category}\n#{saved_search.tag_query}", :delay_seconds => 30) + sqs_service.send_message("create\n#{user_id}\n#{saved_search.category}\n#{saved_search.tag_query}", :delay_seconds => 30) end true end def rename_listbooru(user_id, old_category, new_category) - return false unless Danbooru.config.listbooru_enabled? + return false unless enabled? - sqs = SqsService.new(Danbooru.config.aws_sqs_queue_url) - sqs.send_message("rename\n#{user_id}\n#{old_category}\n#{new_category}\n") + sqs_service.send_message("rename\n#{user_id}\n#{old_category}\n#{new_category}\n") true end + + def post_ids(user_id, name = nil) + return [] unless enabled? + + if name + hash_name = Cache.hash(name) + else + hash_name = nil + end + + body = Cache.get("ss-pids-#{user_id}-#{hash_name}", 60) do + params = { + "key" => Danbooru.config.listbooru_auth_key, + "user_id" => user_id, + "name" => name + } + uri = URI.parse("#{Danbooru.config.listbooru_server}/users") + uri.query = URI.encode_www_form(params) + + Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.is_a?(URI::HTTPS)) do |http| + resp = http.request_get(uri.request_uri) + if resp.is_a?(Net::HTTPSuccess) + resp.body + else + raise "HTTP error code: #{resp.code} #{resp.message}" + end + end + end + + body.to_s.scan(/\d+/).map(&:to_i) + end end def update_listbooru_on_create - return unless Danbooru.config.listbooru_enabled? + return unless SavedSearch.enabled? return unless user.is_gold? - sqs = SqsService.new(Danbooru.config.aws_sqs_queue_url) - sqs.send_message("create\n#{user_id}\n#{category}\n#{tag_query}") + SavedSearch.sqs_service.send_message("create\n#{user_id}\n#{category}\n#{tag_query}") end def update_listbooru_on_destroy - return unless Danbooru.config.listbooru_enabled? + return unless SavedSearch.enabled? - sqs = SqsService.new(Danbooru.config.aws_sqs_queue_url) - sqs.send_message("delete\n#{user_id}\n#{category}\n#{tag_query}") + SavedSearch.sqs_service.send_message("delete\n#{user_id}\n#{category}\n#{tag_query}") end def update_listbooru_on_update - return unless Danbooru.config.listbooru_enabled? + return unless SavedSearch.enabled? return unless user.is_gold? - sqs = SqsService.new(Danbooru.config.aws_sqs_queue_url) - sqs.send_message("update\n#{user_id}\n#{category_was}\n#{tag_query_was}\n#{category}\n#{tag_query}") + SavedSearch.sqs_service.send_message("update\n#{user_id}\n#{category_was}\n#{tag_query_was}\n#{category}\n#{tag_query}") end end @@ -99,37 +132,6 @@ class SavedSearch < ActiveRecord::Base rename_listbooru(user_id, old_category, new_category) end - def self.post_ids(user_id, name = nil) - return [] unless Danbooru.config.listbooru_enabled? - - if name - hash_name = Cache.hash(name) - else - hash_name = nil - end - - body = Cache.get("ss-pids-#{user_id}-#{hash_name}", 60) do - params = { - "key" => Danbooru.config.listbooru_auth_key, - "user_id" => user_id, - "name" => name - } - uri = URI.parse("#{Danbooru.config.listbooru_server}/users") - uri.query = URI.encode_www_form(params) - - Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.is_a?(URI::HTTPS)) do |http| - resp = http.request_get(uri.request_uri) - if resp.is_a?(Net::HTTPSuccess) - resp.body - else - raise "HTTP error code: #{resp.code} #{resp.message}" - end - end - end - - body.to_s.scan(/\d+/).map(&:to_i) - end - def normalize self.category = SavedSearch.normalize_category(category) if category self.tag_query = SavedSearch.normalize(tag_query) diff --git a/app/models/tag_alias.rb b/app/models/tag_alias.rb index 34e200d0f..8efb2c95c 100644 --- a/app/models/tag_alias.rb +++ b/app/models/tag_alias.rb @@ -180,9 +180,12 @@ class TagAlias < ActiveRecord::Base def move_saved_searches escaped = Regexp.escape(antecedent_name) - SavedSearch.where("tag_query like ?", "%#{antecedent_name}%").find_each do |ss| - ss.tag_query = ss.tag_query.sub(/(?:^| )#{escaped}(?:$| )/, " #{consequent_name} ").strip.gsub(/ /, " ") - ss.save + + if SavedSearch.enabled? + SavedSearch.where("tag_query like ?", "%#{antecedent_name}%").find_each do |ss| + ss.tag_query = ss.tag_query.sub(/(?:^| )#{escaped}(?:$| )/, " #{consequent_name} ").strip.gsub(/ /, " ") + ss.save + end end end diff --git a/app/models/user.rb b/app/models/user.rb index 3d5d44875..c1ca34e91 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -847,15 +847,19 @@ class User < ActiveRecord::Base module SavedSearchMethods def unique_saved_search_categories - categories = saved_searches.pluck(:category) - - if categories.any? {|x| x.blank?} - categories.reject! {|x| x.blank?} - categories.unshift(SavedSearch::UNCATEGORIZED_NAME) + if SavedSearch.enabled? + categories = saved_searches.pluck(:category) + + if categories.any? {|x| x.blank?} + categories.reject! {|x| x.blank?} + categories.unshift(SavedSearch::UNCATEGORIZED_NAME) + end + + categories.uniq! + categories + else + [] end - - categories.uniq! - categories end end diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb index dc821a6d6..e034d3e6a 100644 --- a/app/presenters/user_presenter.rb +++ b/app/presenters/user_presenter.rb @@ -44,6 +44,10 @@ class UserPresenter end def posts_for_saved_search_category(category) + if !SavedSearch.enabled? + return Post.where("false") + end + if category == SavedSearch::UNCATEGORIZED_NAME ids = SavedSearch.post_ids(CurrentUser.user.id) else diff --git a/app/views/saved_searches/_interface.html.erb b/app/views/saved_searches/_interface.html.erb index 8e03c804e..69f0e8ce4 100644 --- a/app/views/saved_searches/_interface.html.erb +++ b/app/views/saved_searches/_interface.html.erb @@ -1,17 +1,19 @@ -<% if CurrentUser.show_saved_searches? %> +<% if SavedSearch.enabled? && CurrentUser.show_saved_searches? %> <%= button_tag "Save search", :id => "save-search" %> <% end %> -
+<% end %> \ No newline at end of file diff --git a/app/views/users/upgrade_information.html.erb b/app/views/users/upgrade_information.html.erb index fdbd2d797..f4ca556b6 100644 --- a/app/views/users/upgrade_information.html.erb +++ b/app/views/users/upgrade_information.html.erb @@ -43,12 +43,14 @@