-
Notifications
You must be signed in to change notification settings - Fork 0
/
refactor.rb
161 lines (127 loc) · 3.79 KB
/
refactor.rb
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# Controllers
class People < ActionController::Base
# ... Other REST actions
def create
@person = Person.new(params[:person])
if @person.save
redirect_to @person, :notice => "Account added!"
else
render :new
end
end
end
class PersonValidation < ActionController::Base
# move this to it's own controller.. I LIKE REST
def update
@user = Person.find_by_slug(params[:slug])
if @user.present?
@user.set_validated!
else
flash[:alert] = 'Sorry we could not process'
redirect_to sorry_email_validation_failed_url
end
end
end
# Model
class Person < ActiveRecord::Base
# Looks like :handle, :team are not needed
attr_accessible :first_name, :last_name, :email, :admin, :validated
validates :first_name, :presence => true
validates :last_name, :presence => true
validates :email, :presence => true
# validates :admin, :presence => true # default this to false in the migration
validates :slug, :presence => true
before_validation :set_defaults, :on => :create
after_create :send_welcome_emails
def handle
"#{team}#{id}"
end
# Move to Model. Still I'd have to ask someone why we have this code in the first place
def team
id.odd? ? "UnicornRainbows" : "LaserScorpions"
end
def set_validated!
@user.update_attribute(:validated, true)
# why is this here?
Rails.logger.info "USER: User ##{@person.id} validated email successfully."
Emails.admin_user_validated(@user.id)
Emails.welcome(@user.id).deliver
end
end
def self.admin_emails
Person.admin.pluck(:email)
end
def self.admin
where(:admin => true)
end
def self.unvalidated
where(:validated => false)
end
def created_longer_than(days_ago )
where('created_at < ?', Time.zone.now - days_ago.days)
end
private
# welcome emails are set on creation
def send_welcome_emails
Emails.validate_email(self.id).deliver
Emails.admin_new_user(self.id).deliver
end
def set_defaults
set_slug
set_admin
end
# I don't like this slug. Why do we need it? UUID
def set_slug
self.slug = "ABC123#{Time.now.to_i.to_s}1239827#{rand(10000)}"
end
# by default this is not and admin user
def set_admin
self.admin = false if admin.nil?
end
end
# Mailer
# Next step move these all to a background job like resque
class Emails < ActionMailer::Base
default :from => "[email protected]"
def welcome(person_id)
@person = Person.find( person_id )
mail to: @person.email
end
def validate_email(person_id)
@person = Person.find( person_id )
mail to: @person.email
end
def admin_user_validated(person_id)
@user = Person.find( person_id )
mail to: admin_emails
end
def admin_new_user(person_id)
@user = Person.find(person_id)
mail to: admin_emails
end
# best to move to a log file or something. or even just inactivating the emails
def admin_removing_unvalidated_users(user_emails)
@user_emails = user_emails
mail to: admin_emails
end
private
def admin_emails
@admin_emails ||= Person.admin_emails
end
end
# Rake Task
namespace :accounts do
# rake accounts:remove_unvalidated --trace
desc "Remove accounts where the email was never validated and it is over 30 days old"
task :remove_unvalidated do
# this is memory intensive... best to move to a log file or something other than emailing to someone
@emails = Person.created_longer_than( 30 ).unvalidated.pluck(:email)
# find in batches... memory HOG
Person.created_longer_than( 30 ).unvalidated.find_each do |person|
Rails.logger.info "Removing unvalidated user #{person.email}"
person.destroy # i don't like destroying... inactive please.
end
Emails.admin_removing_unvalidated_users(@emails).deliver
end
end