diff options
Diffstat (limited to 'lib/reserve_usernames/callbacks.rb')
-rw-r--r-- | lib/reserve_usernames/callbacks.rb | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/reserve_usernames/callbacks.rb b/lib/reserve_usernames/callbacks.rb new file mode 100644 index 0000000..a4bc2de --- /dev/null +++ b/lib/reserve_usernames/callbacks.rb @@ -0,0 +1,73 @@ +module ReserveUsernames::Callbacks + def self.included(base) + base.class_eval do + + around_create :create_reservation + around_destroy :destroy_reservation + + protected + + def create_reservation + if username + Rails.logger.info("ReserveUsernames - creating reservation for username '#{username}'.") + ru = ReservedUsername.create(:username => username, :reserved_by => owner_string) + ru.encode + unless ru.persisted? + if has_errors?(ru) + Rails.logger.error("ReserveUsernames - failed to reserve username (#{ru.errors.error_messages}).") + return false + else + Rails.logger.error("ReserveUsernames - failed to reserve username (remote error).") + raise RuntimeError.new('Failed to reserve username. (remote username reservation error)') + end + end + end + yield + if self.persisted? + ru.confirmed = true + ru.save + return false if has_errors?(ru) + end + end + + def destroy_reservation + ru = ReservedUsername.find(username) + ru.deleted = true + ru.save + yield + if self.destroyed? + ReservedUsername.delete(username) + end + rescue ActiveResource::ResourceNotFound + end + + def username + address ? address.split('@').first : nil + end + + # + # a label to identify the owner + # + def owner_string + if user && user.id + user.id + else + username + end + end + + def has_errors?(record) + if record.errors.any? + record.errors.each do |attr, msg| + Rails.logger.error("ReserveUsernames - REMOTE ERROR #{attr}: #{msg}") + self.errors.add(attr, msg + " (remote username reservation error)") + end + true + else + false + end + end + + end + end +end |