OSDN Git Service

Move part of file creation logic into separate context
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Tue, 5 Nov 2013 10:06:52 +0000 (12:06 +0200)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Tue, 5 Nov 2013 10:06:52 +0000 (12:06 +0200)
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
app/contexts/base_context.rb
app/contexts/files/base_context.rb [new file with mode: 0644]
app/contexts/files/create_context.rb [new file with mode: 0644]
app/controllers/projects/new_tree_controller.rb
app/views/projects/new_tree/show.html.haml

index 101be50..6accd9b 100644 (file)
@@ -17,4 +17,3 @@ class BaseContext
     abilities.allowed?(object, action, subject)
   end
 end
-
diff --git a/app/contexts/files/base_context.rb b/app/contexts/files/base_context.rb
new file mode 100644 (file)
index 0000000..44f9826
--- /dev/null
@@ -0,0 +1,31 @@
+module Files
+  class BaseContext < ::BaseContext
+    attr_reader :ref, :path
+
+    def initialize(project, user, params, ref, path = nil)
+      @project, @current_user, @params = project, user, params.dup
+      @ref = ref
+      @path = path
+    end
+
+    private
+
+    def error(message)
+      {
+        error: message,
+        status: :error
+      }
+    end
+
+    def success
+      {
+        error: '',
+        status: :success
+      }
+    end
+
+    def repository
+      project.repository
+    end
+  end
+end
diff --git a/app/contexts/files/create_context.rb b/app/contexts/files/create_context.rb
new file mode 100644 (file)
index 0000000..e1554c4
--- /dev/null
@@ -0,0 +1,50 @@
+module Files
+  class CreateContext < BaseContext
+    def execute
+      allowed = if project.protected_branch?(ref)
+                  can?(current_user, :push_code_to_protected_branches, project)
+                else
+                  can?(current_user, :push_code, project)
+                end
+
+      unless allowed
+        return error("You are not allowed to create file in this branch")
+      end
+
+      unless repository.branch_names.include?(ref)
+        return error("You can only create files if you are on top of a branch")
+      end
+
+      file_name = params[:file_name]
+
+      unless file_name =~ Gitlab::Regex.path_regex
+        return error("Your changes could not be commited, because file name contains not allowed characters")
+      end
+
+      file_path = if path.blank?
+                    file_name
+                  else
+                    File.join(path, file_name)
+                  end
+
+      blob = repository.blob_at(ref, file_path)
+
+      if blob
+        return error("Your changes could not be commited, because file with such name exists")
+      end
+
+      new_file_action = Gitlab::Satellite::NewFileAction.new(current_user, project, ref, path)
+      created_successfully = new_file_action.commit!(
+        params[:content],
+        params[:commit_message],
+        file_name,
+      )
+
+      if created_successfully
+        success
+      else
+        error("Your changes could not be commited, because the file has been changed")
+      end
+    end
+  end
+end
index 9003f2d..684c916 100644 (file)
@@ -6,60 +6,18 @@ class Projects::NewTreeController < Projects::ApplicationController
   before_filter :authorize_code_access!
   before_filter :require_non_empty_project
 
-  before_filter :create_requirements, only: [:show, :update]
-
   def show
   end
 
   def update
-    file_name = params[:file_name]
-
-    unless file_name =~ Gitlab::Regex.path_regex
-      flash[:notice] = "Your changes could not be commited, because file name contains not allowed characters"
-      render :show and return
-    end
-
-    file_path = if @path.blank?
-                  file_name
-                else
-                  File.join(@path, file_name)
-                end
-
-    blob = @repository.blob_at(@commit.id, file_path)
-
-    if blob
-      flash[:notice] = "Your changes could not be commited, because file with such name exists"
-      render :show and return
-    end
+    result = Files::CreateContext.new(@project, current_user, params, @ref, @path).execute
 
-    new_file_action = Gitlab::Satellite::NewFileAction.new(current_user, @project, @ref, @path)
-    updated_successfully = new_file_action.commit!(
-      params[:content],
-      params[:commit_message],
-      file_name,
-    )
-
-    if updated_successfully
-      redirect_to project_blob_path(@project, File.join(@id, params[:file_name])), notice: "Your changes have been successfully commited"
+    if result[:status] == :success
+      flash[:notice] = "Your changes have been successfully commited"
+      redirect_to project_blob_path(@project, File.join(@id, params[:file_name]))
     else
-      flash[:notice] = "Your changes could not be commited, because the file has been changed"
+      flash[:alert] = result[:error]
       render :show
     end
   end
-
-  private
-
-  def create_requirements
-    allowed = if project.protected_branch? @ref
-                can?(current_user, :push_code_to_protected_branches, project)
-              else
-                can?(current_user, :push_code, project)
-              end
-
-    return access_denied! unless allowed
-
-    unless @repository.branch_names.include?(@ref)
-      redirect_to project_blob_path(@project, @id), notice: "You can only create files if you are on top of a branch"
-    end
-  end
 end
index 4837b8e..d552530 100644 (file)
@@ -8,7 +8,7 @@
       .controls
         %span.monospace= @path[-1] == "/" ? @path : @path + "/"
         &nbsp;
-        = text_field_tag 'file_name', '', placeholder: "sample.rb", required: true
+        = text_field_tag 'file_name', params[:file_name], placeholder: "sample.rb", required: true
         %span
           &nbsp;
           on
       = label_tag 'commit_message', class: "control-label" do
         Commit message
       .controls
-        = text_area_tag 'commit_message', '', placeholder: "Added new file", required: true, rows: 3
+        = text_area_tag 'commit_message', params[:commit_message], placeholder: "Added new file", required: true, rows: 3
 
     .file-holder
       .file-title
         %i.icon-file
       .file-content.code
-        %pre#editor= ""
+        %pre#editor= params[:content]
 
     .form-actions
       = hidden_field_tag 'content', '', id: "file-content"