... | ... |
@@ -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 |