Commit 88dc8be

mo khan <mo@mokhan.ca>
2015-11-14 15:43:37
process csv exports received via email.
1 parent ece2e28
app/models/email_processor.rb
@@ -1,9 +1,15 @@
 class EmailProcessor
+  attr_reader :email
+
   def initialize(email)
     @email = email
   end
 
   def process
-    Rails.logger.info(@email.inspect)
+    user = User.find_by!(email: email.from[:email])
+
+    email.attachments.each do |attachment|
+      BackupFile.new(user, attachment).process_later(Program.stronglifts)
+    end
   end
 end
spec/fixtures/spreadsheet-stronglifts.csv
@@ -0,0 +1,101 @@
+"Date","Note","Workout","Body Weight (KG)","Body Weight (LB)","Exercise 1","Weight (KG)","Weight (LB)","Set 1","Set 2","Set 3","Set 4","Set 5","Exercise 2","Weight (KG)","Weight (LB)","Set 1","Set 2","Set 3","Set 4","Set 5","Exercise 3","Weight (KG)","Weight (LB)","Set 1","Set 2","Set 3","Set 4","Set 5","Arm work","Weight (KG)","Weight (LB)","Set 1","Set 2","Set 3"
+02/03/15,"",A,92.87,205,Squat,20,45,5,5,5,5,5,Bench press,30,65,5,5,5,5,5,Barbell row,30,65,5,5,5,5,5,,,,,
+04/03/15,"",B,92.87,205,Squat,30,65,5,5,5,5,5,Overhead press,27.5,60,5,5,5,5,5,Deadlift,42.5,95,5,,,,,,,,,
+07/03/15,"",A,92.87,205,Squat,32.5,70,5,5,5,5,5,Bench press,35,75,5,5,5,5,5,Barbell row,32.5,70,5,5,5,5,5,,,,,
+09/03/15,"",B,92.87,205,Squat,35,75,5,5,5,5,5,Overhead press,30,65,5,5,5,5,5,Deadlift,47.5,105,5,,,,,,,,,
+11/03/15,"",A,92.87,205,Squat,37.5,80,5,5,5,5,5,Bench press,37.5,80,5,5,5,5,5,Barbell row,35,75,5,5,5,5,5,,,,,
+14/03/15,"",B,92.87,205,Squat,37.5,85,5,5,5,5,5,Overhead press,32.5,70,5,5,5,5,5,Deadlift,52.5,115,5,,,,,Chinups,0,0,5,3,2
+16/03/15,"",A,92.87,205,Squat,40,90,5,5,5,5,5,Bench press,37.5,85,5,5,5,5,5,Barbell row,37.5,80,5,5,5,5,5,,,,,
+18/03/15,"",B,92.87,205,Squat,42.5,95,5,5,5,5,5,Overhead press,35,75,5,5,5,5,5,Deadlift,57.5,125,5,,,,,Chinups,0,0,5,4,3
+21/03/15,"",A,92.87,205,Squat,45,100,5,5,5,5,5,Bench press,40,90,5,5,5,5,5,Barbell row,37.5,85,5,5,5,5,5,Dips,0,0,10,10,8
+23/03/15,"",B,93.77,207,Squat,47.5,105,5,5,5,5,5,Overhead press,37.5,80,5,5,5,5,5,Deadlift,60,135,5,,,,,Chinups,0,0,6,5,4
+25/03/15,"",A,92.87,205,Squat,50,110,5,5,5,5,5,Bench press,42.5,95,5,5,5,5,5,Barbell row,40,90,5,5,5,5,5,Dips,0,0,10,10,6
+28/03/15,"",B,92.87,205,Squat,52.5,115,5,5,5,5,5,Overhead press,37.5,85,5,5,5,5,5,Deadlift,65,145,5,,,,,Chinups,0,0,5,4,3
+30/03/15,"",A,92.87,205,Squat,55,120,5,5,5,5,5,Bench press,45,100,5,5,5,5,5,Barbell row,42.5,95,5,5,5,5,5,Dips,0,0,10,10,9
+01/04/15,"",B,92.87,205,Squat,57.5,125,5,5,5,5,5,Overhead press,40,90,5,5,5,5,5,Deadlift,70,155,5,,,,,Chinups,0,0,3,3,3
+04/04/15,"",A,94.68,209,Squat,60,130,5,5,5,5,5,Bench press,47.5,105,5,5,5,5,5,Barbell row,45,100,5,5,5,5,5,Dips,0,0,10,10,8
+07/04/15,"",B,94.68,209,Squat,60,135,5,5,5,5,5,Overhead press,42.5,95,5,5,5,4,5,Deadlift,75,165,5,,,,,Chinups,0,0,3,2,2
+09/04/15,"",A,94.68,209,Squat,62.5,140,5,5,5,5,5,Bench press,50,110,5,5,5,5,5,Barbell row,47.5,105,5,5,5,5,5,Dips,0,0,10,10,10
+11/04/15,"",B,94.68,209,Squat,65,145,5,5,5,5,5,Overhead press,42.5,95,5,5,5,5,5,Deadlift,80,175,5,,,,,Chinups,0,0,3,3,3
+13/04/15,"",A,94.68,209,Squat,67.5,150,5,5,5,5,5,Bench press,52.5,115,5,5,5,5,5,Barbell row,50,110,5,5,5,5,5,Dips,0,0,10,10,9
+15/04/15,"",B,94.68,209,Squat,70,155,5,5,5,5,5,Overhead press,45,100,5,5,5,5,5,Deadlift,82.5,185,5,,,,,Chinups,0,0,3,3,2
+18/04/15,"",A,94.68,209,Squat,72.5,160,5,5,5,5,5,Bench press,55,120,5,5,5,5,5,Barbell row,52.5,115,5,5,5,5,5,Dips,2.5,5,5,5,5
+20/04/15,"",B,94.68,209,Squat,75,165,5,5,5,5,5,Overhead press,47.5,105,5,5,5,5,4,Deadlift,87.5,195,5,,,,,Chinups,0,0,4,3,3
+25/04/15,"",A,94.68,209,Squat,77.5,170,5,5,5,5,5,Bench press,57.5,125,5,5,5,5,5,Barbell row,55,120,5,5,3,5,4,Dips,2.5,7.5,5,5,5
+27/04/15,"",B,93.77,207,Squat,80,175,5,5,5,5,5,Overhead press,47.5,105,5,5,5,5,4,Deadlift,92.5,205,5,,,,,Chinups,0,0,4,3,3
+29/04/15,"",A,93.77,207,Squat,82.5,180,5,5,5,5,5,Bench press,60,130,5,5,5,5,5,Barbell row,55,120,5,5,5,4,4,Dips,5,10,5,5,4
+02/05/15,"",B,94.68,209,Squat,82.5,185,5,5,5,5,5,Overhead press,47.5,105,5,5,5,5,4,Deadlift,97.5,215,5,,,,,Chinups,0,0,4,3,2
+04/05/15,"",A,94.68,209,Squat,85,190,5,5,5,5,5,Bench press,60,135,5,5,5,5,5,Barbell row,55,120,5,5,5,5,5,Dips,5,10,5,5,5
+06/05/15,"",B,94.68,209,Squat,87.5,195,5,5,5,5,5,Overhead press,40,90,5,5,5,5,5,Deadlift,102.5,225,4,,,,,Chinups,0,0,5,3,3
+09/05/15,"",A,94.68,209,Squat,90,200,,,,,,Bench press,62.5,140,5,5,5,5,5,Barbell row,57.5,125,5,5,5,5,5,Dips,0,0,10,10,6
+11/05/15,"",B,94.68,209,Squat,90,200,,,,,,Overhead press,42.5,95,5,5,5,5,5,Deadlift,102.5,225,5,,,,,Chinups,0,0,5,4,3
+13/05/15,"",A,94.68,209,Squat,90,200,,,,,,Bench press,65,145,5,5,5,5,5,Barbell row,60,130,5,4,4,4,4,Dips,0,0,8,4,4
+16/05/15,"",B,94.68,209,Squat,80,175,,,,,,Overhead press,45,100,5,5,5,4,5,Deadlift,105,230,5,,,,,Chinups,0,0,5,4,4
+23/05/15,"",A,94.68,209,Squat,70,155,,,,,,Bench press,67.5,150,5,5,5,5,5,Barbell row,60,130,5,4,4,5,4,Dips,0,0,10,7,6
+25/05/15,"",B,91.05,201,Squat,70,155,,,,,,Overhead press,45,100,5,5,5,5,5,Deadlift,105,235,5,,,,,Chinups,0,0,5,4,3
+27/05/15,"",A,91.05,201,Squat,70,155,,,,,,Bench press,70,155,5,5,5,5,5,Barbell row,60,130,5,5,4,4,4,Dips,0,0,9,5,5
+30/05/15,"",B,92.41,204,Squat,60,135,4,,,,,Overhead press,47.5,105,5,5,4,5,4,Deadlift,107.5,240,5,,,,,Chinups,0,0,5,5,4
+01/06/15,"",A,92.41,204,Squat,60,135,5,5,5,5,5,Bench press,72.5,160,5,5,5,5,5,Barbell row,52.5,115,5,5,5,5,5,Dips,0,0,7,7,6
+03/06/15,"",B,92.41,204,Squat,62.5,140,5,5,5,5,5,Overhead press,47.5,105,5,5,5,5,5,Deadlift,110,245,5,,,,,Chinups,0,0,4,3,3
+06/06/15,"",A,92.41,204,Squat,65,145,5,5,5,5,5,Bench press,75,165,5,5,5,5,4,Barbell row,55,120,5,5,5,5,5,Dips,0,0,10,5,3
+08/06/15,"",B,92.41,204,Squat,67.5,150,5,5,5,5,5,Overhead press,47.5,105,5,5,5,5,5,Deadlift,112.5,250,5,,,,,Chinups,0,0,5,4,3
+10/06/15,"",A,92.41,204,Squat,70,155,5,5,5,5,5,Bench press,75,165,5,5,5,5,5,Barbell row,57.5,125,5,5,4,5,4,Dips,0,0,10,6,4
+13/06/15,"",B,92.41,204,Squat,72.5,160,5,5,5,5,5,Overhead press,50,110,5,5,5,5,5,Deadlift,115,255,5,,,,,Chinups,0,0,-1,-1,-1
+15/06/15,"",A,92.41,204,Squat,75,165,5,5,5,5,5,Bench press,77.5,170,5,5,5,5,5,Barbell row,57.5,125,5,5,5,5,4,Dips,0,0,10,9,5
+17/06/15,"",B,92.41,204,Squat,77.5,170,5,5,5,5,5,Overhead press,50,110,5,5,5,4,3,Deadlift,117.5,260,5,,,,,,,,,
+20/06/15,"",A,92.41,204,Squat,80,175,5,5,5,5,5,Bench press,80,175,5,5,5,4,4,Barbell row,57.5,125,5,5,5,5,5,Dips,0,0,8,5,1
+22/06/15,"",B,92.41,204,Squat,82.5,180,5,5,5,5,5,Overhead press,50,110,5,5,5,5,5,Deadlift,120,265,5,,,,,,,,,
+24/06/15,"",A,92.41,204,Squat,82.5,185,5,5,5,5,5,Bench press,80,175,5,5,5,5,5,Barbell row,60,130,5,5,5,5,5,Dips,0,0,10,6,6
+27/06/15,"",B,94.22,208,Squat,85,190,5,5,5,5,5,Overhead press,52.5,115,5,3,5,4,2,Deadlift,122.5,270,3,,,,,,,,,
+29/06/15,"",A,94.22,208,Squat,87.5,195,5,5,5,5,5,Bench press,82.5,180,5,4,4,3,0,Barbell row,60,135,5,4,5,4,5,Dips,0,0,5,5,2
+01/07/15,"",B,94.22,208,Squat,90,200,,,,,,Overhead press,52.5,115,,,,,,Deadlift,122.5,270,,,,,,,,,,
+04/07/15,"",A,94.22,208,Squat,90,200,5,5,5,5,4,Bench press,82.5,180,4,4,4,,,Barbell row,60,135,5,5,4,4,5,Dips,0,0,10,8,4
+06/07/15,"",B,94.22,208,Squat,90,200,5,5,5,5,5,Overhead press,45,100,5,5,5,4,4,Deadlift,107.5,240,5,,,,,,,,,
+08/07/15,"",A,95.13,210,Squat,92.5,205,5,5,5,5,5,Bench press,82.5,180,5,2,3,3,3,Barbell row,60,135,5,5,5,5,5,Dips,0,0,5,5,6
+11/07/15,"",B,95.13,210,Squat,95,210,5,5,5,5,5,Overhead press,45,100,5,5,5,5,5,Deadlift,110,245,5,,,,,,,,,
+13/07/15,"",A,95.13,210,Squat,97.5,215,5,5,5,5,5,Bench press,72.5,160,5,5,5,5,4,Barbell row,62.5,140,5,4,5,4,5,Dips,0,0,10,6,6
+15/07/15,"",B,95.13,210,Squat,100,220,5,4,5,5,4,Overhead press,45,102,5,5,5,5,5,Deadlift,112.5,250,5,,,,,,,,,
+18/07/15,"",A,95.58,211,Squat,100,220,5,5,5,5,5,Bench press,72.5,160,5,5,5,5,5,Barbell row,62.5,140,5,5,4,4,4,Dips,0,0,10,9,6
+20/07/15,"",B,95.58,211,Squat,102.5,225,5,5,5,5,5,Overhead press,47.5,104,5,5,5,5,5,Deadlift,115,255,5,,,,,,,,,
+22/07/15,"",A,95.58,211,Squat,105,230,5,5,5,5,5,Bench press,72.5,162,5,5,5,5,5,Barbell row,62.5,140,5,5,5,4,5,Dips,2.5,2.5,5,5,5
+25/07/15,"",B,96.94,214,Squat,105,235,5,5,5,5,5,Overhead press,47.5,106,5,5,5,5,5,Deadlift,117.5,260,5,,,,,,,,,
+27/07/15,"",A,96.94,214,Squat,107.5,240,5,5,5,5,5,Bench press,75,165,5,5,5,5,5,Barbell row,57.5,125,5,5,5,5,5,Dips,2.5,5,5,5,5
+29/07/15,"",B,96.94,214,Squat,110,245,5,5,5,5,5,Overhead press,47.5,107,5,5,5,5,5,Deadlift,120,265,5,,,,,,,,,
+01/08/15,"",A,96.94,214,Squat,112.5,250,5,2,5,5,4,Bench press,75,167,5,5,5,4,4,Barbell row,60,130,5,5,5,5,5,Dips,2.5,7.5,5,5,4
+04/08/15,"",B,96.94,214,Squat,112.5,250,5,4,5,5,5,Overhead press,50,110,5,5,5,5,5,Deadlift,122.5,270,5,,,,,,,,,
+08/08/15,"",A,95.13,210,Squat,112.5,250,5,5,5,5,4,Bench press,75,167,5,5,4,4,4,Barbell row,60,135,5,5,5,5,5,Dips,2.5,7.5,5,5,5
+10/08/15,"",B,95.13,210,Squat,102.5,225,5,5,5,5,5,Overhead press,50,112,5,,,,,Deadlift,125,275,5,,,,,,,,,
+12/08/15,"injured right shoulder",A,95.13,210,Squat,105,230,5,,,,,Bench press,75,167,,,,,,Barbell row,62.5,140,1,,,,,Dips,5,10,-1,-1,-1
+15/08/15,"",B,95.13,210,Squat,105,230,,,,,,Overhead press,50,112,5,5,5,3,4,Deadlift,127.5,280,5,,,,,,,,,
+17/08/15,"",A,95.13,210,Squat,105,230,4,,,,,Bench press,67.5,150,5,5,5,5,5,Barbell row,62.5,140,5,5,5,5,5,,,,,
+19/08/15,"",B,95.13,210,Squat,92.5,205,5,5,5,5,5,Overhead press,50,112,5,5,5,5,5,Deadlift,127.5,285,5,,,,,,,,,
+22/08/15,"",A,95.13,210,Squat,95,210,5,5,5,5,5,Bench press,67.5,152,5,5,5,5,5,Barbell row,65,145,5,5,5,4,5,Dips,0,0,10,7,6
+24/08/15,"",B,95.13,210,Squat,97.5,215,5,5,5,5,5,Overhead press,52.5,115,5,4,4,2,3,Deadlift,130,290,5,,,,,,,,,
+26/08/15,"",A,95.13,210,Squat,100,220,5,5,5,5,5,Bench press,70,155,5,5,5,5,5,Barbell row,65,145,5,5,5,5,4,Dips,0,0,8,5,5
+29/08/15,"",B,97.4,215,Squat,102.5,225,5,5,5,5,5,Overhead press,52.5,115,5,5,3,3,5,Deadlift,132.5,295,5,,,,,,,,,
+31/08/15,"",A,97.4,215,Squat,105,230,5,5,5,5,5,Bench press,70,157,5,5,5,5,5,Barbell row,65,145,4,5,5,5,5,Dips,0,0,10,10,5
+02/09/15,"",B,97.4,215,Squat,105,235,5,5,5,5,5,Overhead press,52.5,115,5,4,3,2,1,Deadlift,135,300,5,,,,,,,,,
+07/09/15,"",A,97.4,215,Squat,107.5,240,5,5,5,,,Bench press,72.5,160,5,5,5,5,5,Barbell row,60,130,5,5,5,5,5,Dips,0,0,7,4,3
+10/09/15,"",B,97.4,215,Squat,107.5,240,5,5,5,5,5,Overhead press,45,100,5,5,5,5,5,Deadlift,137.5,305,3,,,,,,,,,
+12/09/15,"",A,96.94,214,Squat,110,245,5,5,5,5,5,Bench press,72.5,162,5,5,5,5,5,Barbell row,60,135,5,5,5,5,5,Dips,2.5,5,5,5,5
+14/09/15,"",B,96.94,214,Squat,112.5,250,5,5,5,,,Overhead press,45,102,5,5,5,5,5,Deadlift,137.5,305,5,,,,,,,,,
+16/09/15,"",A,96.94,214,Squat,112.5,250,5,5,5,,,Bench press,75,165,5,5,5,5,5,Barbell row,62.5,140,5,5,5,5,5,Dips,2.5,7.5,5,5,5
+19/09/15,"",B,97.4,215,Squat,112.5,250,2,3,5,5,5,Overhead press,47.5,105,5,5,5,5,5,Deadlift,140,310,5,,,,,,,,,
+22/09/15,"",A,97.4,215,Squat,102.5,225,5,5,5,5,5,Bench press,75,167,5,5,5,5,4,Barbell row,65,145,5,5,5,5,5,Dips,5,10,5,5,5
+24/09/15,"",B,97.4,215,Squat,105,230,5,5,5,,,Overhead press,47.5,107,5,5,5,5,5,Deadlift,142.5,315,2,,,,,,,,,
+26/09/15,"",A,97.4,215,Squat,102.5,225,5,5,5,,,Bench press,75,165,5,5,5,5,5,Barbell row,67.5,150,5,5,5,4,5,Dips,5,12.5,5,5,5
+28/09/15,"",B,97.4,215,Squat,105,230,5,5,5,,,Overhead press,50,110,5,5,5,5,5,Deadlift,142.5,315,3,,,,,,,,,
+02/10/15,"",A,97.4,215,Squat,105,235,5,5,5,,,Bench press,75,167,5,5,5,5,5,Barbell row,67.5,150,5,5,5,5,5,Dips,7.5,15,5,5,5
+05/10/15,"",B,97.4,215,Squat,107.5,240,5,5,5,,,Overhead press,50,112,5,5,5,5,5,Deadlift,142.5,315,3,,,,,,,,,
+08/10/15,"",A,97.4,215,Squat,110,245,5,5,5,,,Bench press,77.5,170,5,5,5,5,5,Barbell row,70,155,5,5,5,5,4,Dips,7.5,17.5,5,5,4
+10/10/15,"",B,97.4,215,Squat,112.5,250,5,5,5,,,Overhead press,52.5,115,5,5,5,5,5,Deadlift,127.5,280,5,,,,,,,,,
+17/10/15,"",A,97.4,215,Squat,102.5,225,5,5,5,,,Bench press,67.5,150,5,5,5,5,5,Barbell row,60,135,5,5,5,5,5,Dips,0,0,10,9,6
+21/10/15,"",B,97.4,215,Squat,105,230,5,5,5,,,Overhead press,45,100,5,5,5,5,5,Deadlift,127.5,285,5,,,,,,,,,
+23/10/15,"",A,97.4,215,Squat,105,235,5,5,5,,,Bench press,70,155,5,5,5,5,5,Barbell row,62.5,140,5,5,5,5,4,Dips,2.5,5,5,5,5
+25/10/15,"",B,97.4,215,Squat,107.5,240,5,5,5,,,Overhead press,47.5,105,5,5,5,5,5,Deadlift,130,290,4,,,,,,,,,
+28/10/15,"",A,97.4,215,Squat,110,245,5,5,5,,,Bench press,72.5,160,5,5,5,5,5,Barbell row,62.5,140,5,5,5,5,5,Dips,2.5,7.5,5,5,5
+30/10/15,"",B,97.4,215,Squat,112.5,250,5,5,5,,,Overhead press,50,110,5,5,5,5,5,Deadlift,130,290,,,,,,,,,,
+01/11/15,"",A,97.4,215,Squat,115,255,5,5,5,,,Bench press,75,165,5,5,5,5,5,Barbell row,65,145,5,5,5,5,5,Dips,5,10,5,5,5
+04/11/15,"",B,97.4,215,Squat,117.5,260,5,5,5,,,Overhead press,52.5,115,5,5,4,4,2,Deadlift,117.5,260,,,,,,,,,,
+06/11/15,"",A,97.4,215,Squat,120,265,5,5,5,,,Bench press,77.5,170,5,5,5,5,5,Barbell row,67.5,150,5,5,5,5,5,Dips,5,12.5,5,5,5
+08/11/15,"",B,97.4,215,Squat,122.5,270,4,3,3,,,Overhead press,52.5,115,5,5,5,5,5,Deadlift,105,230,5,,,,,,,,,
spec/models/email_processor.rb
@@ -0,0 +1,25 @@
+require "rails_helper"
+
+describe EmailProcessor do
+  subject { EmailProcessor.new(email) }
+  let(:email) { build(:email, :with_attachment) }
+
+  context "with a csv attachment" do
+    let(:backup_file) { double(process_later: true) }
+    let(:user) { create(:user) }
+
+    before :each do
+      email.from[:email] = user.email
+    end
+
+    it "imports the csv attachment" do
+      allow(BackupFile).to receive(:new)
+        .with(user, email.attachments.first)
+        .and_return(backup_file)
+
+      subject.process
+
+      expect(backup_file).to have_received(:process_later).with(Program.stronglifts)
+    end
+  end
+end
spec/factories.rb
@@ -22,4 +22,34 @@ FactoryGirl.define do
     association :program
     name { FFaker::Internet.user_name }
   end
+  factory :email, class: OpenStruct do
+    to [{
+      full: 'to_user@email.com',
+      email: 'to_user@email.com',
+      token: 'to_user',
+      host: 'email.com',
+      name: nil
+    }]
+    from({
+      token: 'from_user',
+      host: 'email.com',
+      email: 'from_email@email.com',
+      full: 'From User <from_user@email.com>',
+      name: 'From User'
+    })
+    subject 'email subject'
+    body 'Hello!'
+    attachments {[]}
+
+    trait :with_attachment do
+      attachments {[
+        ActionDispatch::Http::UploadedFile.new({
+          filename: 'spreadsheet-stronglifts.csv',
+          type: 'text/plain',
+          tempfile: File.new("#{File.expand_path(File.dirname(__FILE__))}/fixtures/spreadsheet-stronglifts.csv")
+          #tempfile: fixture_file_upload("spreadsheet-stronglifts.csv")
+        })
+      ]}
+    end
+  end
 end