diff --git a/app/assets/stylesheets/shared.scss b/app/assets/stylesheets/shared.scss
index 3beb495f8..2edc6780b 100644
--- a/app/assets/stylesheets/shared.scss
+++ b/app/assets/stylesheets/shared.scss
@@ -200,4 +200,16 @@
100% {
width: 140%;
}
-}
\ No newline at end of file
+}
+
+.global-notice {
+ font-family: $helvetica;
+ background: $green;
+ color: black;
+ padding: 20px 0px 20px;
+ text-align: center;
+ position: relative;
+ top: 0px;
+ left: 0px;
+ right: 0px;
+}
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index fd15b5697..977c5f0c4 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -71,7 +71,7 @@ class UsersController < ApplicationController
if @user.articles_count.zero? && @user.comments_count.zero?
@user.destroy!
NotifyMailer.account_deleted_email(@user).deliver
- flash[:settings_notice] = "Your account has been deleted."
+ flash[:global_notice] = "Your account has been deleted."
sign_out @user
redirect_to root_path
else
@@ -80,6 +80,15 @@ class UsersController < ApplicationController
end
end
+ def full_delete
+ set_user
+ set_tabs("account")
+ Users::SelfDeleteJob.perform_later(@user.id)
+ sign_out @user
+ flash[:global_notice] = "Your account deletion is scheduled. You'll be notified when it's deleted."
+ redirect_to root_path
+ end
+
def remove_association
set_user
provider = params[:provider]
@@ -249,10 +258,6 @@ class UsersController < ApplicationController
%0A%0A
You can keep any comments and discussion posts under the Ghost account.
%0A
- ---OR---
- %0A
- Please delete all my personal information, including comments and discussion posts.
- %0A
%0A
Regards,
%0A
diff --git a/app/jobs/users/self_delete_job.rb b/app/jobs/users/self_delete_job.rb
new file mode 100644
index 000000000..b69096df8
--- /dev/null
+++ b/app/jobs/users/self_delete_job.rb
@@ -0,0 +1,15 @@
+module Users
+ class SelfDeleteJob < ApplicationJob
+ queue_as :users_self_delete
+
+ def perform(user_id, service = Users::Delete)
+ user = User.find_by(id: user_id)
+ return unless user
+
+ service.call(user)
+ NotifyMailer.account_deleted_email(user).deliver
+ rescue StandardError => e
+ Rails.logger.error("Error while deleting user: #{e}")
+ end
+ end
+end
diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb
index 542417016..83f306737 100644
--- a/app/policies/user_policy.rb
+++ b/app/policies/user_policy.rb
@@ -27,6 +27,10 @@ class UserPolicy < ApplicationPolicy
current_user?
end
+ def full_delete?
+ current_user?
+ end
+
def join_org?
!user_is_banned?
end
diff --git a/app/services/moderator/delete_user.rb b/app/services/moderator/delete_user.rb
index 8e63a2863..4fef3bffd 100644
--- a/app/services/moderator/delete_user.rb
+++ b/app/services/moderator/delete_user.rb
@@ -12,7 +12,7 @@ module Moderator
if user_params[:ghostify] == "true"
new(user: user, admin: admin, user_params: user_params).ghostify
else
- new(user: user, admin: admin, user_params: user_params).full_delete
+ Users::Delete.call(user)
end
end
@@ -24,12 +24,6 @@ module Moderator
CacheBuster.new.bust("/ghost")
end
- def full_delete
- delete_comments
- delete_articles
- delete_non_content_activity_and_user
- end
-
private
def delete_non_content_activity_and_user
diff --git a/app/services/moderator/manage_activity_and_roles.rb b/app/services/moderator/manage_activity_and_roles.rb
index 894f81707..1a0b364f3 100644
--- a/app/services/moderator/manage_activity_and_roles.rb
+++ b/app/services/moderator/manage_activity_and_roles.rb
@@ -13,50 +13,15 @@ module Moderator
end
def delete_comments
- return unless user.comments.any?
-
- cachebuster = CacheBuster.new
- user.comments.find_each do |comment|
- comment.reactions.delete_all
- cachebuster.bust_comment(comment.commentable)
- comment.delete
- comment.remove_notifications
- end
- cachebuster.bust_user(user)
+ Users::DeleteComments.call(user)
end
def delete_articles
- return unless user.articles.any?
-
- cachebuster = CacheBuster.new
- virtual_articles = user.articles.map { |article| Article.new(article.attributes) }
- user.articles.find_each do |article|
- article.reactions.delete_all
- article.comments.includes(:user).find_each do |comment|
- comment.reactions.delete_all
- cachebuster.bust_comment(comment.commentable)
- cachebuster.bust_user(comment.user)
- comment.delete
- end
- article.remove_algolia_index
- article.delete
- article.purge
- end
- virtual_articles.each do |article|
- cachebuster.bust_article(article)
- end
+ Users::DeleteArticles.call(user)
end
def delete_user_activity
- user.notifications.delete_all
- user.reactions.delete_all
- user.follows.delete_all
- Follow.where(followable_id: user.id, followable_type: "User").delete_all
- user.messages.delete_all
- user.chat_channel_memberships.delete_all
- user.mentions.delete_all
- user.badge_achievements.delete_all
- user.github_repos.delete_all
+ Users::DeleteActivity.call(user)
end
def remove_privileges
diff --git a/app/services/users/delete.rb b/app/services/users/delete.rb
new file mode 100644
index 000000000..dd4a92c16
--- /dev/null
+++ b/app/services/users/delete.rb
@@ -0,0 +1,36 @@
+module Users
+ class Delete
+ def initialize(user)
+ @user = user
+ end
+
+ def call
+ delete_comments
+ delete_articles
+ delete_user_activity
+ user.unsubscribe_from_newsletters
+ CacheBuster.new.bust("/#{user.username}")
+ user.delete
+ end
+
+ def self.call(*args)
+ new(*args).call
+ end
+
+ private
+
+ attr_reader :user
+
+ def delete_user_activity
+ DeleteActivity.call(user)
+ end
+
+ def delete_comments
+ DeleteComments.call(user)
+ end
+
+ def delete_articles
+ DeleteArticles.call(user)
+ end
+ end
+end
diff --git a/app/services/users/delete_activity.rb b/app/services/users/delete_activity.rb
new file mode 100644
index 000000000..070fff596
--- /dev/null
+++ b/app/services/users/delete_activity.rb
@@ -0,0 +1,17 @@
+module Users
+ module DeleteActivity
+ module_function
+
+ def call(user)
+ user.notifications.delete_all
+ user.reactions.delete_all
+ user.follows.delete_all
+ Follow.where(followable_id: user.id, followable_type: "User").delete_all
+ user.messages.delete_all
+ user.chat_channel_memberships.delete_all
+ user.mentions.delete_all
+ user.badge_achievements.delete_all
+ user.github_repos.delete_all
+ end
+ end
+end
diff --git a/app/services/users/delete_articles.rb b/app/services/users/delete_articles.rb
new file mode 100644
index 000000000..0b6591248
--- /dev/null
+++ b/app/services/users/delete_articles.rb
@@ -0,0 +1,26 @@
+module Users
+ module DeleteArticles
+ module_function
+
+ def call(user, cache_buster = CacheBuster.new)
+ return unless user.articles.any?
+
+ virtual_articles = user.articles.map { |article| Article.new(article.attributes) }
+ user.articles.find_each do |article|
+ article.reactions.delete_all
+ article.comments.includes(:user).find_each do |comment|
+ comment.reactions.delete_all
+ cache_buster.bust_comment(comment.commentable)
+ cache_buster.bust_user(comment.user)
+ comment.delete
+ end
+ article.remove_algolia_index
+ article.delete
+ article.purge
+ end
+ virtual_articles.each do |article|
+ cache_buster.bust_article(article)
+ end
+ end
+ end
+end
diff --git a/app/services/users/delete_comments.rb b/app/services/users/delete_comments.rb
new file mode 100644
index 000000000..662a943c4
--- /dev/null
+++ b/app/services/users/delete_comments.rb
@@ -0,0 +1,17 @@
+module Users
+ module DeleteComments
+ module_function
+
+ def call(user, cache_buster = CacheBuster.new)
+ return unless user.comments.any?
+
+ user.comments.find_each do |comment|
+ comment.reactions.delete_all
+ cache_buster.bust_comment(comment.commentable)
+ comment.delete
+ comment.remove_notifications
+ end
+ cache_buster.bust_user(user)
+ end
+ end
+end
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index 5e1a490b0..51e7f5011 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -88,6 +88,11 @@
<% end %>
+ <% if flash[:global_notice] %>
+
+ <%= flash[:global_notice] %>
+
+ <% end %>
<%= yield %>
diff --git a/app/views/users/_account.html.erb b/app/views/users/_account.html.erb
index 09b532e6c..5fa3d65dc 100644
--- a/app/views/users/_account.html.erb
+++ b/app/views/users/_account.html.erb
@@ -66,7 +66,7 @@
Note that this does not revoke our OAuth app access; you will have to do so in your
- Twitter profile settings or your
+ Twitter profile settings or your
GitHub profile settings.
@@ -87,71 +87,72 @@
<% end %>
-<% if @user.articles_count.zero? && @user.comments_count.zero? %>
-
Delete Account
-
- <%= form_tag "/users/destroy", method: :delete, autocomplete: "off" do %>
- Deleting your account will:
-
-
delete your profile, along with your Twitter and/or GitHub associations.
- This does not include app permissions, which you will have to remove yourself on Twitter/GitHub.
-
- <%# TODO: expand the delete messaging later %>
-
delete any and all content you have, such as your reading list or chat messages.
-
allow your username to become available to anyone.
-
-
-
-
-
-
-
-
-
-
- <% end %>
-
-
-
-<% end %>
+ deleteAcccountVerificationInput.addEventListener('input', function () {
+ if (bothInputsVerified()) {
+ deleteAccountBtn.disabled = false;
+ } else {
+ deleteAccountBtn.disabled = true;
+ }
+ })
+
+If you would like to keep your content under the <%= link_to "@ghost", "/ghost" %> account, please: