summaryrefslogtreecommitdiff
path: root/lib/reserve_usernames/callbacks.rb
blob: a4bc2de12daf52f7c81c36831fa54c61810ce4a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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