summaryrefslogtreecommitdiff
path: root/app/contexts
diff options
context:
space:
mode:
authorGitLab <gitlab@localhost>2013-01-17 17:35:57 +0200
committerGitLab <gitlab@localhost>2013-01-17 17:35:57 +0200
commit232d61d59808e6f0c731d135d728800c4b13ae27 (patch)
tree87356bbbd97abd549fcc489fb3bed60dc0438528 /app/contexts
parentc7c1a97c2fecb8931bbe66af6860a072ca97335d (diff)
downloadgitlab-ce-232d61d59808e6f0c731d135d728800c4b13ae27.tar.gz
Refactor project creation. Added logout link to profile page
Diffstat (limited to 'app/contexts')
-rw-r--r--app/contexts/project_update_context.rb24
-rw-r--r--app/contexts/projects/create_context.rb64
-rw-r--r--app/contexts/projects/update_context.rb25
3 files changed, 89 insertions, 24 deletions
diff --git a/app/contexts/project_update_context.rb b/app/contexts/project_update_context.rb
deleted file mode 100644
index f6d69e7b62d..00000000000
--- a/app/contexts/project_update_context.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-class ProjectUpdateContext < BaseContext
- def execute(role = :default)
- namespace_id = params[:project].delete(:namespace_id)
- params[:project].delete(:public) unless can?(current_user, :change_public_mode, project)
-
- allowed_transfer = can?(current_user, :change_namespace, project) || role == :admin
-
- if allowed_transfer && namespace_id.present?
- if namespace_id == Namespace.global_id
- if project.namespace.present?
- # Transfer to global namespace from anyone
- project.transfer(nil)
- end
- elsif namespace_id.to_i != project.namespace_id
- # Transfer to someone namespace
- namespace = Namespace.find(namespace_id)
- project.transfer(namespace)
- end
- end
-
- project.update_attributes(params[:project], as: role)
- end
-end
-
diff --git a/app/contexts/projects/create_context.rb b/app/contexts/projects/create_context.rb
new file mode 100644
index 00000000000..5329443c5f7
--- /dev/null
+++ b/app/contexts/projects/create_context.rb
@@ -0,0 +1,64 @@
+module Projects
+ class CreateContext < BaseContext
+ def execute
+ # get namespace id
+ namespace_id = params[:project].delete(:namespace_id)
+
+ @project = Project.new(params[:project])
+
+ # Parametrize path for project
+ #
+ # Ex.
+ # 'GitLab HQ'.parameterize => "gitlab-hq"
+ #
+ @project.path = @project.name.dup.parameterize
+
+
+ if namespace_id
+ # Find matching namespace and check if it allowed
+ # for current user if namespace_id passed.
+ if allowed_namespace?(current_user, namespace_id)
+ @project.namespace_id = namespace_id unless namespace_id == Namespace.global_id
+ else
+ deny_namespace
+ return @project
+ end
+ else
+ # Set current user namespace if namespace_id is nil
+ @project.namespace_id = current_user.id
+ end
+
+ Project.transaction do
+ @project.creator = current_user
+ @project.save!
+
+ # Add user as project master
+ @project.users_projects.create!(project_access: UsersProject::MASTER, user: current_user)
+
+ # when project saved no team member exist so
+ # project repository should be updated after first user add
+ @project.update_repository
+ end
+
+ @project
+ rescue => ex
+ @project.errors.add(:base, "Can't save project. Please try again later")
+ @project
+ end
+
+ protected
+
+ def deny_namespace
+ @project.errors.add(:namespace, "is not valid")
+ end
+
+ def allowed_namespace?(user, namespace_id)
+ if namespace_id == Namespace.global_id
+ return user.admin
+ else
+ namespace = Namespace.find_by_id(namespace_id)
+ current_user.can?(:manage_namespace, namespace)
+ end
+ end
+ end
+end
diff --git a/app/contexts/projects/update_context.rb b/app/contexts/projects/update_context.rb
new file mode 100644
index 00000000000..e5d09b7df7f
--- /dev/null
+++ b/app/contexts/projects/update_context.rb
@@ -0,0 +1,25 @@
+module Projects
+ class UpdateContext < BaseContext
+ def execute(role = :default)
+ namespace_id = params[:project].delete(:namespace_id)
+ params[:project].delete(:public) unless can?(current_user, :change_public_mode, project)
+
+ allowed_transfer = can?(current_user, :change_namespace, project) || role == :admin
+
+ if allowed_transfer && namespace_id.present?
+ if namespace_id == Namespace.global_id
+ if project.namespace.present?
+ # Transfer to global namespace from anyone
+ project.transfer(nil)
+ end
+ elsif namespace_id.to_i != project.namespace_id
+ # Transfer to someone namespace
+ namespace = Namespace.find(namespace_id)
+ project.transfer(namespace)
+ end
+ end
+
+ project.update_attributes(params[:project], as: role)
+ end
+ end
+end