From 938be908267d4377935729484682eaf6342d17e9 Mon Sep 17 00:00:00 2001 From: elijah Date: Fri, 10 Jul 2015 17:11:44 -0700 Subject: initial commit. --- lib/reserve_usernames.rb | 12 +++++++ lib/reserve_usernames/callbacks.rb | 73 ++++++++++++++++++++++++++++++++++++++ lib/reserve_usernames/engine.rb | 4 +++ lib/reserve_usernames/validate.rb | 27 ++++++++++++++ lib/reserve_usernames/version.rb | 5 +++ 5 files changed, 121 insertions(+) create mode 100644 lib/reserve_usernames.rb create mode 100644 lib/reserve_usernames/callbacks.rb create mode 100644 lib/reserve_usernames/engine.rb create mode 100644 lib/reserve_usernames/validate.rb create mode 100644 lib/reserve_usernames/version.rb (limited to 'lib') diff --git a/lib/reserve_usernames.rb b/lib/reserve_usernames.rb new file mode 100644 index 0000000..6fc6d2c --- /dev/null +++ b/lib/reserve_usernames.rb @@ -0,0 +1,12 @@ +module ReserveUsernames + CONFIG = YAML.load_file(File.expand_path('../../config.yml', __FILE__))[Rails.env] +end + +require 'reserve_usernames/engine' +require 'reserve_usernames/callbacks' +require 'reserve_usernames/validate' + +ActiveSupport.on_load(:identity) do + include ReserveUsernames::Validate + include ReserveUsernames::Callbacks +end 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 diff --git a/lib/reserve_usernames/engine.rb b/lib/reserve_usernames/engine.rb new file mode 100644 index 0000000..a4bdbfa --- /dev/null +++ b/lib/reserve_usernames/engine.rb @@ -0,0 +1,4 @@ +module ReserveUsernames + class Engine < ::Rails::Engine + end +end diff --git a/lib/reserve_usernames/validate.rb b/lib/reserve_usernames/validate.rb new file mode 100644 index 0000000..669c2fb --- /dev/null +++ b/lib/reserve_usernames/validate.rb @@ -0,0 +1,27 @@ +module ReserveUsernames::Validate + def self.included(base) + base.class_eval do + + validate :check_if_address_is_taken + + protected + + # + # Only query ReservedUsername if this is a new record. + # Otherwise, validation will always fail because the address + # has been taken... by this identity. + # + def check_if_address_is_taken + if new_record? && address + username = address.split('@').first + if ReservedUsername.find(username) + Rails.logger.info("ReserveUsernames - #{username} is taken.") + errors.add :address, :taken + end + end + rescue ActiveResource::ResourceNotFound + end + + end + end +end diff --git a/lib/reserve_usernames/version.rb b/lib/reserve_usernames/version.rb new file mode 100644 index 0000000..b92ea68 --- /dev/null +++ b/lib/reserve_usernames/version.rb @@ -0,0 +1,5 @@ +module ReserveUsernames + unless defined?(VERSION) + VERSION = "0.0.1" + end +end -- cgit v1.2.3