Showing 1 changed files with 98 additions and 67 deletions
+98 -67
templates/compare.html.ep
... ...
@@ -40,92 +40,121 @@
40 40
   # Git
41 41
   my $git = $self->app->git;
42 42
   
43
+  my $errors;
43 44
   if (lc $self->req->method eq 'post') {
44 45
     my $op = param('op');
45 46
     
46 47
     if ($op eq 'create-pull-request') {
48
+      
49
+      # Parameters
47 50
       my $title = param('title');
48 51
       my $message = param('message');
49 52
       
50
-      my $project_row_id = app->dbi->model('project')->select(
51
-        'project.row_id',
52
-        where => {'__user.id' => $base_user_id, 'project.id' => $base_project_id}
53
-      )->value;
53
+      # Validation
54
+      my $vc = app->vc;
55
+      my $validation = $vc->validation;
54 56
       
55
-      my $pull_request = app->dbi->model('pull_request')->select(
56
-        where => {
57
-          base_project => $project_row_id,
58
-          base_branch => $base_branch,
59
-          target_project => $target_project->{id},
60
-          target_branch => $target_branch
61
-        }
62
-      )->one;
57
+      # Check title
58
+      if (!(defined $title && length $title)) {
59
+        $validation->add_failed(title => 'title is empty');
60
+      }
61
+      elsif (length $title > 300) {
62
+        $validation->add_failed(title => 'title is too long');
63
+      }
63 64
       
64
-      if ($pull_request) {
65
-        $self->redirect_to("/$base_user_id/$base_project_id/pull/$pull_request->{row_id}");
66
-        return;
65
+      # Message
66
+      if (!(defined $message && length $message)) {
67
+        $message = '';
68
+        if (length $message > 1000) {
69
+          $validation->add_failed(message => 'message is too long');
70
+        }
67 71
       }
68
-      else {
69
-        my $now_tm = Time::Moment->now_utc;
70
-        my $now_epoch = $now_tm->epoch;
71
-        my $user_row_id = app->dbi->model('user')->select(
72
-          'row_id',
73
-          where => {id => $base_user_id}
72
+      
73
+      if ($validation->is_valid) {
74
+      
75
+        my $project_row_id = app->dbi->model('project')->select(
76
+          'project.row_id',
77
+          where => {'__user.id' => $base_user_id, 'project.id' => $base_project_id}
74 78
         )->value;
75 79
         
76
-        my $new_pull_request_row_id;
77
-        my $session_user_row_id = $api->session_user_row_id;
78
-        app->dbi->connector->txn(sub {
79
-          # New pull request
80
-          my $new_pull_request_params = {
80
+        my $pull_request = app->dbi->model('pull_request')->select(
81
+          where => {
81 82
             base_project => $project_row_id,
82 83
             base_branch => $base_branch,
83
-            target_project => $target_project->{row_id},
84
-            target_branch => $target_branch,
85
-            title => $title,
86
-            open => 1,
87
-            open_time => $now_epoch,
88
-            open_user => $session_user_row_id
89
-          };
90
-          
91
-          app->dbi->model('pull_request')->insert($new_pull_request_params);
92
-          
93
-          $new_pull_request_row_id = app->dbi->model('pull_request')->select(
84
+            target_project => $target_project->{id},
85
+            target_branch => $target_branch
86
+          }
87
+        )->one;
88
+        
89
+        if ($pull_request) {
90
+          $self->redirect_to("/$base_user_id/$base_project_id/pull/$pull_request->{row_id}");
91
+          return;
92
+        }
93
+        else {
94
+          my $now_tm = Time::Moment->now_utc;
95
+          my $now_epoch = $now_tm->epoch;
96
+          my $user_row_id = app->dbi->model('user')->select(
94 97
             'row_id',
95
-            where => {
98
+            where => {id => $base_user_id}
99
+          )->value;
100
+          
101
+          my $new_pull_request_row_id;
102
+          my $session_user_row_id = $api->session_user_row_id;
103
+          app->dbi->connector->txn(sub {
104
+            # New pull request
105
+            my $new_pull_request_params = {
96 106
               base_project => $project_row_id,
97 107
               base_branch => $base_branch,
98 108
               target_project => $target_project->{row_id},
99
-              target_branch => $target_branch
100
-            }
101
-          )->value;
102
-          
103
-          # Get pull request message number
104
-          my $number = app->dbi->model('pull_request_message')->select(
105
-            'max(number)',
106
-            where => {pull_request => $new_pull_request_row_id},
107
-            append => 'group by number'
108
-          )->value;
109
-          
110
-          $number //= 0;
111
-          
112
-          my $new_number = $number + 1;
109
+              target_branch => $target_branch,
110
+              title => $title,
111
+              open => 1,
112
+              open_time => $now_epoch,
113
+              open_user => $session_user_row_id
114
+            };
115
+            
116
+            app->dbi->model('pull_request')->insert($new_pull_request_params);
117
+            
118
+            $new_pull_request_row_id = app->dbi->model('pull_request')->select(
119
+              'row_id',
120
+              where => {
121
+                base_project => $project_row_id,
122
+                base_branch => $base_branch,
123
+                target_project => $target_project->{row_id},
124
+                target_branch => $target_branch
125
+              }
126
+            )->value;
127
+            
128
+            # Get pull request message number
129
+            my $number = app->dbi->model('pull_request_message')->select(
130
+              'max(number)',
131
+              where => {pull_request => $new_pull_request_row_id},
132
+              append => 'group by number'
133
+            )->value;
134
+            
135
+            $number //= 0;
136
+            
137
+            my $new_number = $number + 1;
138
+            
139
+            # New pull request message
140
+            my $new_pull_request_message_params = {
141
+              pull_request => $new_pull_request_row_id,
142
+              number => $new_number,
143
+              message => $message,
144
+              create_time => $now_epoch,
145
+              update_time => $now_epoch,
146
+              user => $session_user_row_id
147
+            };
148
+            
149
+            app->dbi->model('pull_request_message')->insert($new_pull_request_message_params);
150
+          });
113 151
           
114
-          # New pull request message
115
-          my $new_pull_request_message_params = {
116
-            pull_request => $new_pull_request_row_id,
117
-            number => $new_number,
118
-            message => $message,
119
-            create_time => $now_epoch,
120
-            update_time => $now_epoch,
121
-            user => $session_user_row_id
122
-          };
123
-          
124
-          app->dbi->model('pull_request_message')->insert($new_pull_request_message_params);
125
-        });
126
-        
127
-        $self->redirect_to("/$base_user_id/$base_project_id/pull/$new_pull_request_row_id");
128
-        return;
152
+          $self->redirect_to("/$base_user_id/$base_project_id/pull/$new_pull_request_row_id");
153
+          return;
154
+        }
155
+      }
156
+      else {
157
+        $errors = $validation->messages;
129 158
       }
130 159
     }
131 160
   }
... ...
@@ -321,6 +350,8 @@
321 350
 %= include '/include/header';
322 351
 
323 352
 <div class="container">
353
+  %= include '/include/errors', errors => $errors;
354
+  
324 355
   <div class="topic1">
325 356
     % if ($can_open_pull_request) {
326 357
       Open a pull request