From 2131a37811d628015b141deb9f826ba64b06287c Mon Sep 17 00:00:00 2001
From: Arpit Jalan <arpit@techapj.com>
Date: Thu, 16 Oct 2014 11:38:02 +0530
Subject: [PATCH] FEATURE: show raw email for replies/topics created via email

---
 .../discourse/controllers/raw-email.js.es6    | 24 +++++++++++++++++++
 .../discourse/routes/topic_route.js           |  5 ++++
 .../discourse/templates/modal/raw_email.hbs   |  7 ++++++
 .../javascripts/discourse/templates/post.hbs  |  2 +-
 .../javascripts/discourse/views/raw-email.es6 |  9 +++++++
 .../stylesheets/common/base/topic-post.scss   |  2 +-
 app/models/post.rb                            |  2 ++
 app/serializers/post_serializer.rb            |  3 ++-
 config/locales/client.en.yml                  |  1 +
 .../20141015060145_add_raw_email_to_posts.rb  |  5 ++++
 lib/email/receiver.rb                         |  1 +
 lib/post_creator.rb                           |  2 +-
 spec/components/email/receiver_spec.rb        |  1 +
 13 files changed, 60 insertions(+), 4 deletions(-)
 create mode 100644 app/assets/javascripts/discourse/controllers/raw-email.js.es6
 create mode 100644 app/assets/javascripts/discourse/templates/modal/raw_email.hbs
 create mode 100644 app/assets/javascripts/discourse/views/raw-email.es6
 create mode 100644 db/migrate/20141015060145_add_raw_email_to_posts.rb

diff --git a/app/assets/javascripts/discourse/controllers/raw-email.js.es6 b/app/assets/javascripts/discourse/controllers/raw-email.js.es6
new file mode 100644
index 000000000..24fa2eb85
--- /dev/null
+++ b/app/assets/javascripts/discourse/controllers/raw-email.js.es6
@@ -0,0 +1,24 @@
+import ModalFunctionality from 'discourse/mixins/modal-functionality';
+
+import ObjectController from 'discourse/controllers/object';
+
+/**
+  This controller handles displaying of raw email
+
+  @class RawEmailController
+  @extends ObjectController
+  @namespace Discourse
+  @uses ModalFunctionality
+  @module Discourse
+**/
+export default ObjectController.extend(ModalFunctionality, {
+  raw_email: "",
+
+  loadEmail: function(postId) {
+    var self = this;
+    Discourse.Post.load(postId).then(function (result) {
+      self.set("raw_email", result.get('raw_email'));
+    });
+  }
+
+});
diff --git a/app/assets/javascripts/discourse/routes/topic_route.js b/app/assets/javascripts/discourse/routes/topic_route.js
index a02a635bc..23aab8a89 100644
--- a/app/assets/javascripts/discourse/routes/topic_route.js
+++ b/app/assets/javascripts/discourse/routes/topic_route.js
@@ -73,6 +73,11 @@ Discourse.TopicRoute = Discourse.Route.extend({
       this.controllerFor('modal').set('modalClass', 'history-modal');
     },
 
+    showRawEmail: function(post) {
+      Discourse.Route.showModal(this, 'raw-email', post);
+      this.controllerFor('raw_email').loadEmail(post.get("id"));
+    },
+
     mergeTopic: function() {
       Discourse.Route.showModal(this, 'mergeTopic', this.modelFor('topic'));
     },
diff --git a/app/assets/javascripts/discourse/templates/modal/raw_email.hbs b/app/assets/javascripts/discourse/templates/modal/raw_email.hbs
new file mode 100644
index 000000000..522602dfa
--- /dev/null
+++ b/app/assets/javascripts/discourse/templates/modal/raw_email.hbs
@@ -0,0 +1,7 @@
+<div class="modal-body">
+  {{#if raw_email}}
+    <pre><code>{{raw_email}}</code></pre>
+  {{else}}
+    Not Available!
+  {{/if}}
+</div>
diff --git a/app/assets/javascripts/discourse/templates/post.hbs b/app/assets/javascripts/discourse/templates/post.hbs
index f9bf8059d..ee1c1a102 100644
--- a/app/assets/javascripts/discourse/templates/post.hbs
+++ b/app/assets/javascripts/discourse/templates/post.hbs
@@ -53,7 +53,7 @@
           <div class="post-info wiki" title="{{i18n post.wiki.about}}" {{action "editPost" this}}><i class="fa fa-pencil-square-o"></i></div>
         {{/if}}
         {{#if via_email}}
-          <div class="post-info via-email" title="{{i18n post.via_email}}"><i class="fa fa-envelope-o"></i></div>
+          <div class="post-info via-email" title="{{i18n post.via_email}}" {{action "showRawEmail" this}}><i class="fa fa-envelope-o"></i></div>
         {{/if}}
         <div {{bind-attr class=":read-state read"}} title="{{i18n post.unread}}"><i class='fa fa-circle'></i></div>
       </div>
diff --git a/app/assets/javascripts/discourse/views/raw-email.es6 b/app/assets/javascripts/discourse/views/raw-email.es6
new file mode 100644
index 000000000..fa6985e6f
--- /dev/null
+++ b/app/assets/javascripts/discourse/views/raw-email.es6
@@ -0,0 +1,9 @@
+export default Discourse.ModalBodyView.extend({
+  templateName: 'modal/raw_email',
+  title: I18n.t('raw_email'),
+
+  resizeModal: function(){
+    var viewPortHeight = $(window).height();
+    this.$(".modal-body").css("max-height", Math.floor(0.8 * viewPortHeight) + "px");
+  }.on("didInsertElement")
+});
diff --git a/app/assets/stylesheets/common/base/topic-post.scss b/app/assets/stylesheets/common/base/topic-post.scss
index 3cff74208..d103304e0 100644
--- a/app/assets/stylesheets/common/base/topic-post.scss
+++ b/app/assets/stylesheets/common/base/topic-post.scss
@@ -122,13 +122,13 @@ aside.quote {
 
 .post-info {
   &.wiki, &.via-email {
+    cursor: pointer;
     margin-right: 5px;
     i.fa {
       font-size: 14px;
     }
   }
   &.wiki {
-    cursor: pointer;
     color: $wiki;
   }
   &.via-email {
diff --git a/app/models/post.rb b/app/models/post.rb
index 0d311af67..91c0de77a 100644
--- a/app/models/post.rb
+++ b/app/models/post.rb
@@ -606,6 +606,8 @@ end
 #  version                 :integer          default(1), not null
 #  cook_method             :integer          default(1), not null
 #  wiki                    :boolean          default(FALSE), not null
+#  via_email               :boolean          default(FALSE), not null
+#  raw_email               :text             
 #  baked_at                :datetime
 #  baked_version           :integer
 #  hidden_at               :datetime
diff --git a/app/serializers/post_serializer.rb b/app/serializers/post_serializer.rb
index 3ee7ba875..72bb4a708 100644
--- a/app/serializers/post_serializer.rb
+++ b/app/serializers/post_serializer.rb
@@ -51,7 +51,8 @@ class PostSerializer < BasicPostSerializer
              :wiki,
              :user_custom_fields,
              :static_doc,
-             :via_email
+             :via_email,
+             :raw_email
 
   def topic_slug
     object.try(:topic).try(:slug)
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 2730043d5..097e61ca5 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -1382,6 +1382,7 @@ en:
     users_lowercase: "users"
     category_title: "Category"
     history: "History"
+    raw_email: "Raw Email"
     changed_by: "by {{author}}"
 
     categories_list: "Categories List"
diff --git a/db/migrate/20141015060145_add_raw_email_to_posts.rb b/db/migrate/20141015060145_add_raw_email_to_posts.rb
new file mode 100644
index 000000000..2c3b89b6d
--- /dev/null
+++ b/db/migrate/20141015060145_add_raw_email_to_posts.rb
@@ -0,0 +1,5 @@
+class AddRawEmailToPosts < ActiveRecord::Migration
+  def change
+    add_column :posts, :raw_email, :text
+  end
+end
diff --git a/lib/email/receiver.rb b/lib/email/receiver.rb
index a00796513..4ca8032cf 100644
--- a/lib/email/receiver.rb
+++ b/lib/email/receiver.rb
@@ -245,6 +245,7 @@ module Email
     def create_post(user, options)
       # Mark the reply as incoming via email
       options[:via_email] = true
+      options[:raw_email] = @raw
 
       creator = PostCreator.new(user, options)
       post = creator.create
diff --git a/lib/post_creator.rb b/lib/post_creator.rb
index 2eb4d6c1b..ae1c6fc17 100644
--- a/lib/post_creator.rb
+++ b/lib/post_creator.rb
@@ -223,7 +223,7 @@ class PostCreator
                             reply_to_post_number: @opts[:reply_to_post_number])
 
     # Attributes we pass through to the post instance if present
-    [:post_type, :no_bump, :cooking_options, :image_sizes, :acting_user, :invalidate_oneboxes, :cook_method, :via_email].each do |a|
+    [:post_type, :no_bump, :cooking_options, :image_sizes, :acting_user, :invalidate_oneboxes, :cook_method, :via_email, :raw_email].each do |a|
       post.send("#{a}=", @opts[a]) if @opts[a].present?
     end
 
diff --git a/spec/components/email/receiver_spec.rb b/spec/components/email/receiver_spec.rb
index c5e7c9c4f..f5484fa0b 100644
--- a/spec/components/email/receiver_spec.rb
+++ b/spec/components/email/receiver_spec.rb
@@ -146,6 +146,7 @@ Pleasure to have you here!
         topic.posts.count.should == (start_count + 1)
         created_post = topic.posts.last
         created_post.via_email.should == true
+        created_post.raw_email.should == fixture_file("emails/valid_reply.eml")
         created_post.cooked.strip.should == fixture_file("emails/valid_reply.cooked").strip
       end
     end