account creation on the fly!
[kwestie.git] / app / models / kwestie_mailer.rb
blob9b050ee4152617a8dcc641eee54dcd53407cb471
1 class KwestieMailer < ActionMailer::Base
3   # Generic Receive Mail method
4   # The goal here is to
5   #   1. identify the reporter sending mail
6   #   1a. create a user for reporter if no account exists with that mail
7   #   2. identify and process the mail as either
8   #   2a. a new issue
9   #   2b. a comment on a current issue
10   def receive(email)
12     # 1. identify the sender
13     User.current_user = find_user_from_email(email)
15     # 2. if we find the issue the email is a comment response, otherwise we have a new issue
16     issue = Issue.find_or_create_by_id(issue_id_from_email(email))
18     if issue.new_record?
19       # 2a. process the email into the issue
20       process_issue_from_email(issue, email)
21     else
22       # 2b. process the email into a comment for this issue
23       process_comment_from_email(issue, email)
24     end
26   end
28   def process_comment_from_email(issue, email)
29     comment = issue.comments.create( { :description => email.body, :issue_id => issue.id } )
31     if email.has_attachments?
32       for attachment in email.attachments
33         comment.attachments.create({ :uploaded_data => attachment })
34       end
35     end
37     issue.save
38   end
40   def process_issue_from_email(issue, email)
41     issue.update_attributes( { :description => email.body, :title => email.subject } )
43     if email.has_attachments?
44       for attachment in email.attachments
45         issue.attachments.create({ :uploaded_data => attachment })
46       end
47     end
49     issue.save
50   end
52   private
54     #FIXME: this creates a user on the fly but needs a little more love to be ok
55     def find_user_from_email(email)
56       for mail in email.from_addrs
57         user = User.find_or_create_by_mail(mail)
58         return user if ! user.nil?
59       end
60       return nil
61     end
63     # FIXME: doesn't handle the CC address
64     def issue_id_from_email(email)
65       for mail in email.to_addrs
66         id = mail.spec.split('@')[0].split('+')[1]
67         return id if ! id.nil?
68       end
69       return nil
70     end
71 end