diff --git a/src/lib/Hydra/Controller/Project.pm b/src/lib/Hydra/Controller/Project.pm index bf9f4451..6dba60ac 100644 --- a/src/lib/Hydra/Controller/Project.pm +++ b/src/lib/Hydra/Controller/Project.pm @@ -1,5 +1,6 @@ package Hydra::Controller::Project; +use utf8; use strict; use warnings; use base 'Hydra::Base::Controller::ListBuilds'; @@ -9,8 +10,9 @@ use Hydra::Helper::CatalystUtils; sub projectChain :Chained('/') :PathPart('project') :CaptureArgs(1) { my ($self, $c, $projectName) = @_; + $c->stash->{params}->{name} //= $projectName; - my $project = $c->model('DB::Projects')->find($projectName, { columns => [ + $c->stash->{project} = $c->model('DB::Projects')->find($projectName, { columns => [ "me.name", "me.displayname", "me.description", @@ -19,25 +21,15 @@ sub projectChain :Chained('/') :PathPart('project') :CaptureArgs(1) { "me.homepage", "owner.username", "owner.fullname", - "views.name", "releases.name", "releases.timestamp", "jobsets.name", "jobsets.enabled", - ], join => [ 'owner', 'views', 'releases', 'jobsets' ], order_by => { -desc => "releases.timestamp" }, collapse => 1 }); + ], join => [ 'owner', 'releases', 'jobsets' ], order_by => { -desc => "releases.timestamp" }, collapse => 1 }); - if ($project) { - $c->stash->{project} = $project; - } else { - if ($c->action->name eq "project" and $c->request->method eq "PUT") { - $c->stash->{projectName} = $projectName; - } else { - $self->status_not_found( - $c, - message => "Project $projectName doesn't exist." - ); - $c->detach; - } + if (!$c->stash->{project} && !($c->action->name eq "project" and $c->request->method eq "PUT")) { + $self->status_not_found($c, message => "Project ‘$projectName’ doesn't exist."); + $c->detach; } } @@ -54,17 +46,13 @@ sub project_GET { $c->stash->{releases} = [$c->stash->{project}->releases->search({}, {order_by => ["timestamp DESC"]})]; - $self->status_ok( - $c, - entity => $c->stash->{project} - ); + $self->status_ok($c, entity => $c->stash->{project}); } sub project_PUT { my ($self, $c) = @_; if (defined $c->stash->{project}) { - error($c, "Cannot rename project `$c->stash->{params}->{oldName}' over existing project `$c->stash->{project}->name") if defined $c->stash->{params}->{oldName}; requireProjectOwner($c, $c->stash->{project}); txn_do($c->model('DB')->schema, sub { updateProject($c, $c->stash->{project}); @@ -75,34 +63,10 @@ sub project_PUT { } else { $self->status_no_content($c); } - } elsif (defined $c->stash->{params}->{oldName}) { - my $project = $c->model('DB::Projects')->find($c->stash->{params}->{oldName}); - if (defined $project) { - requireProjectOwner($c, $project); - txn_do($c->model('DB')->schema, sub { - updateProject($c, $project); - }); + } - my $uri = $c->uri_for($self->action_for("project"), [$project->name]); - - if ($c->req->looks_like_browser) { - $c->res->redirect($uri . "#tabs-configuration"); - } else { - $self->status_created( - $c, - location => "$uri", - entity => { name => $project->name, uri => "$uri", type => "project" } - ); - } - } else { - $self->status_not_found( - $c, - message => "Project $c->stash->{params}->{oldName} doesn't exist." - ); - } - } else { + else { requireMayCreateProjects($c); - error($c, "Invalid project name: ‘$c->stash->{projectName}’") if $c->stash->{projectName} !~ /^$projectNameRE$/; my $project; txn_do($c->model('DB')->schema, sub { @@ -111,7 +75,7 @@ sub project_PUT { # valid. Idem for the owner. my $owner = $c->user->username; $project = $c->model('DB::Projects')->create( - {name => $c->stash->{projectName}, displayname => "", owner => $owner}); + { name => ".tmp.$$." . int(rand(100000)), displayname => "", owner => $owner }); updateProject($c, $project); }); @@ -154,13 +118,6 @@ sub submit : Chained('projectChain') PathPart Args(0) { return $c->res->redirect($c->uri_for("/")); } - my $newName = trim $c->stash->{params}->{name}; - my $oldName = trim $c->stash->{project}->name; - unless ($oldName eq $newName) { - $c->stash->{params}->{oldName} = $oldName; - $c->stash->{projectName} = $newName; - undef $c->stash->{project}; - } project_PUT($self, $c); } @@ -188,9 +145,6 @@ sub create : Path('/create-project') { sub create_submit : Path('/create-project/submit') { my ($self, $c) = @_; - - $c->stash->{projectName} = trim $c->stash->{params}->{name}; - project_PUT($self, $c); } @@ -222,15 +176,18 @@ sub updateProject { my $owner = $project->owner; if ($c->check_user_roles('admin') and defined $c->stash->{params}->{owner}) { $owner = trim $c->stash->{params}->{owner}; - error($c, "Invalid owner: $owner") - unless defined $c->model('DB::Users')->find({username => $owner}); + error($c, "The user name ‘$owner’ does not exist.") + unless defined $c->model('DB::Users')->find($owner); } - my $projectName = $c->stash->{projectName} or $project->name; - error($c, "Invalid project name: ‘$projectName’") if $projectName !~ /^$projectNameRE$/; + my $projectName = $c->stash->{params}->{name}; + error($c, "Invalid project name ‘$projectName’.") if $projectName !~ /^$projectNameRE$/; + + error($c, "Cannot rename project to ‘$projectName’ since that name is already taken.") + if $projectName ne $project->name && defined $c->model('DB::Projects')->find($projectName); my $displayName = trim $c->stash->{params}->{displayname}; - error($c, "Invalid display name: $displayName") if $displayName eq ""; + error($c, "You must specify a display name.") if $displayName eq ""; $project->update( { name => $projectName