gitprep / templates / admin / create.html.ep /
739d519 12 years ago
1 contributor
99 lines | 2.502kb
<%
  my $op = param('op') || '';
  
  my $errors;
  if ($op eq 'create') {
    # API
    my $api = gitprep_api;
    
    # Validation
    my $params = $api->params;
    my $keyword_check = sub {
      my $value = shift;
      
      return ($value || '') =~ /^[a-zA-Z0-9_\-]+$/
    };
    my $rule = [
      project => [
        ['not_blank' => 'Repository name is empty'],
        [$keyword_check => 'Invalid repository name']
      ],
      description => [
        'any'
      ]
    ];
    my $validator = app->validator;
    my $vresult = $validator->validate($params, $rule);
    
    # Git
    my $git = app->git;
    if ($vresult->is_ok) {
      # Not logined
      unless ($api->logined) {
        return $self->render_exception;
      }
      
      my $data = $vresult->data;
      my $user = session('user_id');
      my $project = $data->{project};
      my $description = $data->{description};

      if ($git->exists_repository($user, $project)) {
        $errors = ['Repositry already exists'];
      }
      else {
        # Create repository
        eval {
          $git->create_repository(
            $user,
            $project,
            {description => $description}
          );
        };
        $api->croak($@) if $@;
        
        # Create repository data
        eval {
          app->dbi->model('project')
            ->insert({config => '{}'}, id => [$user, $project]);
        };
        if ($@) {
          my $error = $@;
          $git->remove_repository($user, $project);
          $api->croak($error);
        }
        
        # Go to user page
        $self->redirect_to("/$user/$project");
        
        return 1;
      }
    }
    else { $errors = $vresult->messages }
  }
%>

% layout 'common';

  %= include '/include/header';
  
  <div class="container">
    % if ($errors) {
      <div class="alert alert-error">
        <button type="button" class="close" data-dismiss="alert">&times;</button>
        % for my $error (@$errors) {
          <p><%= $error %></p>
        % }
      </div>
    % }
    <form action="<%= url_for->query(op => 'create') %>" method="post">
      <div><b>Repository name</b></div>
      <div><%= input_tag 'project', type => 'text', style => 'width:300px' %></div>

      <div><b>Description</b> (optional)</div>
      <div><%= input_tag 'description', type => 'text', style => 'width:600px' %></div>

      <input type="submit" class="btn" value="Create repository">
    </form>
  </div>
  %= include '/include/footer';