12b3640 7 years ago
1 contributor
144 lines | 4.375kb
<%
  # API
  my $api = gitprep_api;

  # Parameters
  my $user_id = param('user');
  my $project_id = param('project');
  my $issue_number = param('number');
  
  unless ($api->logined) {
    $self->redirect_to("/$user_id/$project_id/issues");
    return;
  }
  
  my $errors;
  if (lc $self->req->method eq 'post') {
    my $op = param('op');

    if ($op eq 'create') {
      
      # Parameters
      my $title = param('title');
      my $message = param('message');
      
      # Validation
      my $vc = app->vc;
      my $validation = $vc->validation;
      
      # Check title
      if (!(defined $title && length $title)) {
        $validation->add_failed(title => 'title is empty');
      }
      elsif (length $title > 300) {
        $validation->add_failed(title => 'title is too long');
      }
      
      # Message
      if (!(defined $message && length $message)) {
        $message = '';
        if (length $message > 1000) {
          $validation->add_failed(message => 'message is too long');
        }
      }
      
      if ($validation->is_valid) {
        my $project_row_id = app->dbi->model('project')->select(
          'project.row_id',
          where => {'user.id' => $user_id, 'project.id' => $project_id}
        )->value;
        
        my $issue;
        my $now_tm = Time::Moment->now_utc;
        my $now_epoch = $now_tm->epoch;
        my $session_user_row_id = $api->session_user_row_id;
        my $issue_number;
        
        app->dbi->connector->txn(sub {

          # issue number
          $issue_number = app->dbi->model('issue')->select(
            'max(number)',
            where => {project => $project_row_id},
            append => 'group by project'
          )->value;
          $issue_number++;
          
          # New issue
          my $new_issue = {
            title => $title,
            open => 1,
            open_time => $now_epoch,
            open_user => $session_user_row_id,
            pull_request => 0,
            project => $project_row_id,
            number => $issue_number
          };
          app->dbi->model('issue')->insert($new_issue);
          my $new_issue_row_id = app->dbi->execute("select LAST_INSERT_ROWID()")->value;
          
          # New issue message
          my $new_issue_message = {
            issue => $new_issue_row_id,
            number => 1,
            message => $message,
            create_time => $now_epoch,
            update_time => $now_epoch,
            user => $session_user_row_id
          };
          
          app->dbi->model('issue_message')->insert($new_issue_message);
        });
        
        $self->redirect_to("/$user_id/$project_id/issues/$issue_number");
        return;
      }
      else {
        $errors = $validation->messages;
      }
    }
  }
  
  layout 'common', title => "New issue - $user_id/$project_id";
%>

%= javascript begin
  $(document).ready(function() {
    %= include '/include/js/issue';
  });
% end

%= include '/include/header';
<div class="container">
  %= include '/include/errors', errors => $errors;
  <div class="issue-add-comment" style="width:80%">
    <form action="<%= url_for %>" method="post">
      <%= hidden_field op => 'create' %>
      <div class="issue-add-comment-header">
        <div class="issue-add-comment-title">
          <%= text_field 'title' %>
        </div>
        <div class="issue-message-write-tab issue-add-comment-header-tab"><a href="javascript:void(0)">Write</a></div>
        <div class="issue-message-preview-tab issue-add-comment-header-tab"><a class="disable" href="javascript:void(0)">Preview</a></div>
        %= include '/include/issue_comment_icon';
      </div>
      <div class="issue-add-comment-body">
        <div class="issue-message-write-area issue-add-comment-message">
          <%= text_area 'message' %>
        </div>
        <div class="issue-message-preview-area issue-add-comment-preview markdown-body" style="padding:10px">
        </div>
        <div class="issue-add-comment-bottom">
          <div class="issue-add-comment-button-left">
            Styling with Markdown is supported
          </div>
          <div class="issue-add-comment-button">
            <input type="submit" value="Submit new issue" class="btn btn-green">
          </div>
        </div>
      </div>
    </form>
  </div>
</div>

%= include '/include/footer';