X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/5a70476d38447d7b57d9bb96b55097d9d0873e3a..53aa7259bb0612eb48a17d0b954ad71ea37d87a4:/app/models/user.rb diff --git a/app/models/user.rb b/app/models/user.rb index 1bb532152..7a0d06992 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -45,7 +45,7 @@ class User < ApplicationRecord require "digest" - require "xml/libxml" + include AASM has_many :traces, -> { where(:visible => true) } has_many :diary_entries, -> { order(:created_at => :desc) } @@ -87,7 +87,7 @@ class User < ApplicationRecord scope :active, -> { where(:status => %w[active confirmed]) } scope :identifiable, -> { where(:data_public => true) } - has_one_attached :avatar + has_one_attached :avatar, :service => Settings.avatar_storage validates :display_name, :presence => true, :length => 3..255, :exclusion => %w[new terms save confirm confirm-email go_public reset-password forgot-password suspended] @@ -159,6 +159,64 @@ class User < ApplicationRecord user end + aasm :column => :status, :no_direct_assignment => true do + state :pending, :initial => true + state :active + state :confirmed + state :suspended + state :deleted + + # A normal account is active + event :activate do + transitions :from => :pending, :to => :active + end + + # Used in test suite, not something that we would normally need to do. + if Rails.env.test? + event :deactivate do + transitions :from => :active, :to => :pending + end + end + + # To confirm an account is used to override the spam scoring + event :confirm do + transitions :from => [:pending, :active, :suspended], :to => :confirmed + end + + # To unconfirm an account is to make it subject to future spam scoring again + event :unconfirm do + transitions :from => :confirmed, :to => :active + end + + # Accounts can be automatically suspended by spam_check + event :suspend do + transitions :from => [:pending, :active], :to => :suspended + end + + # Unsuspending an account moves it back to active without overriding the spam scoring + event :unsuspend do + transitions :from => :suspended, :to => :active + end + + # Mark the account as deleted but keep all data intact + event :hide do + transitions :from => [:pending, :active, :confirmed, :suspended], :to => :deleted + end + + event :unhide do + transitions :from => [:deleted], :to => :active + end + + # Mark the account as deleted and remove personal data + event :soft_destroy do + before do + remove_personal_data + end + + transitions :from => [:pending, :active, :confirmed, :suspended], :to => :deleted + end + end + def description RichText.new(self[:description_format], self[:description]) end @@ -242,8 +300,8 @@ class User < ApplicationRecord end ## - # destroy a user - leave the account but purge most personal data - def destroy + # remove personal data - leave the account but purge most personal data + def remove_personal_data avatar.purge_later self.display_name = "user_#{id}" @@ -254,7 +312,6 @@ class User < ApplicationRecord self.new_email = nil self.auth_provider = nil self.auth_uid = nil - self.status = "deleted" save end @@ -280,7 +337,7 @@ class User < ApplicationRecord ## # perform a spam check on a user def spam_check - update(:status => "suspended") if status == "active" && spam_score > Settings.spam_threshold + suspend! if may_suspend? && spam_score > Settings.spam_threshold end ##