Newer Older
411 lines | 9.877kb
cleanup
Yuki Kimoto authored on 2012-11-28
1
package Gitprep::API;
2
use Mojo::Base -base;
3

            
improved password encrypt sy...
Yuki Kimoto authored on 2013-04-09
4
use Digest::MD5 'md5_hex';
support markdown foo_bar_baz
Yuki Kimoto authored on 2016-06-20
5
use Text::Markdown::Hoedown qw(HOEDOWN_EXT_FENCED_CODE HOEDOWN_EXT_TABLES HOEDOWN_EXT_NO_INTRA_EMPHASIS);
cleanup
Yuki Kimoto authored on 2012-11-28
6

            
7
has 'cntl';
8

            
add pull request count to he...
Yuki Kimoto authored on 2016-08-23
9
sub get_pull_request_count {
10
  my ($self, $user_id, $project_id, $opt) = @_;
11
  
12
  $opt ||= {};
13
  
14
  my $project_row_id = $self->get_project_row_id($user_id, $project_id);
15
  
16
  my $where = $self->app->dbi->where;
17
  my $clause = ['and', 'pull_request <> 0', ':project{=}'];
18
  my $param = {project => $project_row_id};
19
  
20
  # Open
21
  if (exists $opt->{open}) {
22
    push @$clause, ':issue.open{=}';
23
    $param->{'issue.open'} = $opt->{open};
24
  }
25
  
26
  $where->clause($clause);
27
  $where->param($param);
28
  
29
  my $pull_request_count = $self->app->dbi->model('issue')->select(
30
    'count(*)',
31
    where => $where
32
  )->value;
33
  
34
  return $pull_request_count;
35
}
36

            
37
sub get_open_pull_request_count {
38
  my ($self, $user_id, $project_id) = @_;
39
  
40
  return $self->get_pull_request_count($user_id, $project_id, {open => 1});
41
}
42

            
43
sub get_close_pull_request_count {
44
  my ($self, $user_id, $project_id) = @_;
45
  
46
  return $self->get_pull_request_count($user_id, $project_id, {open => 0});
47
}
48

            
add open issue count to head...
Yuki Kimoto authored on 2016-08-23
49
sub get_issue_count {
50
  my ($self, $user_id, $project_id, $opt) = @_;
51
  
52
  $opt ||= {};
53

            
54
  my $project_row_id = $self->get_project_row_id($user_id, $project_id);
55
  
56
  my $where = $self->app->dbi->where;
57
  my $clause = ['and', 'pull_request = 0', ':project{=}'];
58
  my $param = {project => $project_row_id};
59
  
60
  # Open
61
  if (exists $opt->{open}) {
62
    push @$clause, ':issue.open{=}';
63
    $param->{'issue.open'} = $opt->{open};
64
  }
65
  
66
  $where->clause($clause);
67
  $where->param($param);
68

            
69
  my $issue_count = $self->app->dbi->model('issue')->select(
70
    'count(*)',
71
    where => $where
72
  )->value;
73
  
74
  return $issue_count;
75
}
76

            
77
sub get_open_issue_count {
78
  my ($self, $user_id, $project_id) = @_;
79
  
80
  return $self->get_issue_count($user_id, $project_id, {open => 1});
81
}
82

            
83
sub get_close_issue_count {
84
  my ($self, $user_id, $project_id) = @_;
85
  
86
  return $self->get_issue_count($user_id, $project_id, {open => 0});
87
}
88

            
implement issue comment upda...
Yuki Kimoto authored on 2016-07-25
89
sub api_update_issue_message {
90
  my ($self, $issue_message_row_id, $message, $user_id) = @_;
91
  
92
  my $issue_message = $self->app->dbi->model('issue_message')->select(
93
    {user => ['id']}, where => {'issue_message.row_id' => $issue_message_row_id}
94
  )->one;
95
  
96
  my $session_user_id = $self->session_user_id;
97

            
98
  my $is_my_project = $user_id eq $session_user_id;
99
  my $is_my_comment = $issue_message->{'user.id'} eq $session_user_id;
100
  my $can_modify = $is_my_project || $is_my_comment;
101
  
102
  my $json;
103
  if ($can_modify) {
104
    my $now_tm = Time::Moment->now;
105
    my $update_time = $now_tm->epoch;
106
    $self->app->log->info($update_time);
107
    
108
    $self->app->dbi->model('issue_message')->update(
109
      {
110
        message => $message,
111
        update_time => $update_time
112
      },
113
      where => {row_id => $issue_message_row_id}
114
    );
115
    
116
    my $markdown_message = $self->markdown($message);
117
    
118
    $json = {
119
      success => 1,
120
      markdown_message => $markdown_message
121
    };
122
  }
123
  else {
124
    $json = {success => 0};
125
  }
126
  
127
  return $json;
128
}
129

            
add issue message delete fea...
Yuki Kimoto authored on 2016-07-16
130
sub api_delete_issue_message {
131
  my ($self, $issue_message_row_id, $user_id) = @_;
132
  
133
  my $issue_message = $self->app->dbi->model('issue_message')->select(
134
    {user => ['id']}, where => {'issue_message.row_id' => $issue_message_row_id}
135
  )->one;
136
  
137
  my $session_user_id = $self->session_user_id;
138

            
139
  my $is_my_project = $user_id eq $session_user_id;
140
  my $is_my_comment = $issue_message->{'user.id'} eq $session_user_id;
141
  my $can_modify = $is_my_project || $is_my_comment;
142
  
143
  my $json;
144
  if ($can_modify) {
145
    $self->app->dbi->model('issue_message')->delete(
146
      where => {row_id => $issue_message_row_id}
147
    );
148
    
149
    $json = {success => 1};
150
  }
151
  else {
152
    $json = {success => 0};
153
  }
154
  
155
  return $json;
156
}
157

            
improve pull request. add co...
Yuki Kimoto authored on 2016-07-11
158
sub add_issue_message {
159
  my ($self, $user_id, $project_id, $number, $message) = @_;
160
  
161
  $self->app->dbi->connector->txn(sub {
162
    my $issue_row_id = $self->app->dbi->model('issue')->select(
163
      'issue.row_id',
164
      where => {
165
        'project__user.id' => $user_id,
166
        'project.id' => $project_id,
167
        number => $number
168
      }
169
    )->value;
170

            
171
    # Issue message number
172
    my $issue_message_number = $self->app->dbi->model('issue_message')->select(
173
      'max(number)',
174
      where => {issue => $issue_row_id}
175
    )->value;
176
    $issue_message_number++;
177

            
178
    # New issue message
179
    my $now_tm = Time::Moment->now_utc;
180
    my $now_epoch = $now_tm->epoch;
181
    my $session_user_row_id = $self->session_user_row_id;
182
    my $new_issue_message = {
183
      issue => $issue_row_id,
184
      number => $issue_message_number,
185
      message => $message,
186
      create_time => $now_epoch,
187
      update_time => $now_epoch,
188
      user => $session_user_row_id
189
    };
190
    
191
    $self->app->dbi->model('issue_message')->insert($new_issue_message);
192
  });
193
}
194

            
support markdown table
Yuki Kimoto authored on 2016-06-18
195
sub markdown {
prevent XSS attack in issue ...
Yuki Kimoto authored on 2016-08-12
196
  my ($self, $markdown_text) = @_;
support markdown table
Yuki Kimoto authored on 2016-06-18
197

            
prevent XSS attack in issue ...
Yuki Kimoto authored on 2016-08-12
198
  # Remove script tags
199
  $markdown_text =~ s/\<\s*script\s*.*?\>//g;
200
  $markdown_text =~ s/\<\s*\/\s*script\s*.*?\>//g;
201

            
202
  my $html_text = Text::Markdown::Hoedown::markdown(
203
    $markdown_text, extensions => HOEDOWN_EXT_FENCED_CODE|HOEDOWN_EXT_TABLES|HOEDOWN_EXT_NO_INTRA_EMPHASIS
support markdown foo_bar_baz
Yuki Kimoto authored on 2016-06-20
204
  );
support markdown table
Yuki Kimoto authored on 2016-06-18
205
  
prevent XSS attack in issue ...
Yuki Kimoto authored on 2016-08-12
206
  return $html_text;
support markdown table
Yuki Kimoto authored on 2016-06-18
207
}
208

            
add pull request message
Yuki Kimoto authored on 2016-04-23
209
sub age_string {
210
  my ($self, $epoch_time) = @_;
211
  
212
  my $age = time - $epoch_time;
213
  
214
  my $age_string = $self->cntl->app->git->_age_string($age);
215
  
216
  return $age_string;
217
}
218

            
fix project page
Yuki Kimoto authored on 2016-04-21
219
sub get_user_row_id {
220
  my ($self, $user_id) = @_;
221
  
222
  my $user_row_id = $self->app->dbi->model('user')->select('row_id', where => {id => $user_id})->value;
223
  
224
  return $user_row_id;
225
}
226

            
227
sub get_project_row_id {
228
  my ($self, $user_id, $project_id) = @_;
229
  
230
  my $user_row_id = $self->app->dbi->model('user')->select('row_id', where => {id => $user_id})->value;
231
  my $project_row_id = $self->app->dbi->model('project')->model('project')->select(
232
    'row_id',
233
    where => {user => $user_row_id, id => $project_id}
234
  )->value;
235
  
236
  return $project_row_id;
237
}
238

            
changed database column info...
Yuki Kimoto authored on 2013-04-17
239
sub app { shift->cntl->app }
240

            
improved password encrypt sy...
Yuki Kimoto authored on 2013-04-09
241
sub encrypt_password {
242
  my ($self, $password) = @_;
243
  
244
  my $salt;
245
  $salt .= int(rand 10) for (1 .. 40);
246
  my $password_encryped = md5_hex md5_hex "$salt$password";
247
  
248
  return ($password_encryped, $salt);
249
}
250

            
251
sub check_password {
fixed bug that password chec...
Yuki Kimoto authored on 2013-04-12
252
  my ($self, $password, $salt, $password_encrypted) = @_;
improved password encrypt sy...
Yuki Kimoto authored on 2013-04-09
253
  
added admin page tests
Yuki Kimoto authored on 2013-05-16
254
  return unless defined $password && $salt && $password_encrypted;
255
  
fixed bug that password chec...
Yuki Kimoto authored on 2013-04-12
256
  return md5_hex(md5_hex "$salt$password") eq $password_encrypted;
improved password encrypt sy...
Yuki Kimoto authored on 2013-04-09
257
}
258

            
cleanup
Yuki Kimoto authored on 2013-11-16
259
sub check_user_and_password {
fix import_rep
Yuki Kimoto authored on 2016-04-22
260
  my ($self, $user_id, $password) = @_;
cleanup
Yuki Kimoto authored on 2013-11-16
261
  
262
  my $row
fix import_rep
Yuki Kimoto authored on 2016-04-22
263
    = $self->app->dbi->model('user')->select(['password', 'salt'], where => {id => $user_id})->one;
cleanup
Yuki Kimoto authored on 2013-11-16
264
  
265
  return unless $row;
266
  
267
  my $is_valid = $self->check_password(
268
    $password,
269
    $row->{salt},
270
    $row->{password}
271
  );
272
  
273
  return $is_valid;
274
}
275

            
complete collaborator featur...
Yuki Kimoto authored on 2013-11-17
276
sub is_collaborator {
change is_collaborator argum...
Yuki Kimoto authored on 2016-04-23
277
  my ($self, $collaborator_id, $user_id, $project_id) = @_;
fix session
Yuki Kimoto authored on 2016-04-21
278
  
279
  my $user_row_id = $self->get_user_row_id($user_id);
280
  my $project_row_id = $self->app->dbi->model('project')->select(
281
    where => {user => $user_row_id, id => $project_id}
282
  )->value;
283
  my $collaborator_row_id = $self->get_user_row_id($collaborator_id);
complete collaborator featur...
Yuki Kimoto authored on 2013-11-17
284
  
285
  my $row = $self->app->dbi->model('collaboration')->select(
fix can_access_private_proje...
Yuki Kimoto authored on 2016-04-22
286
    where => {project => $project_row_id, user => $collaborator_row_id}
complete collaborator featur...
Yuki Kimoto authored on 2013-11-17
287
  )->one;
288
  
289
  return $row ? 1 : 0;
290
}
291

            
292
sub can_access_private_project {
fix session
Yuki Kimoto authored on 2016-04-21
293
  my ($self, $user_id, $project_id) = @_;
complete collaborator featur...
Yuki Kimoto authored on 2013-11-17
294

            
fix session
Yuki Kimoto authored on 2016-04-21
295
  my $session_user_row_id = $self->cntl->session('user_row_id');
cleanup join table
Yuki Kimoto authored on 2016-04-28
296
  return unless defined $session_user_row_id;
297
  
fix session
Yuki Kimoto authored on 2016-04-21
298
  my $session_user_id = $self->app->dbi->model('user')->select(
299
    'id', where => {row_id => $session_user_row_id}
300
  )->value;
complete collaborator featur...
Yuki Kimoto authored on 2013-11-17
301
  
302
  my $is_valid =
change is_collaborator argum...
Yuki Kimoto authored on 2016-04-23
303
    ($user_id eq $session_user_id || $self->is_collaborator($session_user_id, $user_id, $project_id))
complete collaborator featur...
Yuki Kimoto authored on 2013-11-17
304
    && $self->logined;
305
  
306
  return $is_valid;
307
}
308

            
implement close and reopen
Yuki Kimoto authored on 2016-04-23
309
sub can_write_access {
310
  my ($self, $session_user_id, $user_id, $project_id) = @_;
311
  
add label remove feature
Yuki Kimoto authored on 2016-07-29
312
  return unless $session_user_id;
313
  
implement close and reopen
Yuki Kimoto authored on 2016-04-23
314
  my $can_write_access
315
    = length $session_user_id &&
316
    (
317
      $session_user_id eq $user_id
318
      || $self->is_collaborator($session_user_id, $user_id, $project_id)
319
    );
320
  
321
  return $can_write_access;
322
}
323

            
cleanup
Yuki Kimoto authored on 2012-11-28
324
sub new {
325
  my ($class, $cntl) = @_;
326

            
327
  my $self = $class->SUPER::new(cntl => $cntl);
328
  
329
  return $self;
330
}
331

            
added user delete feature
Yuki Kimoto authored on 2013-04-09
332
sub logined_admin {
333
  my $self = shift;
334

            
335
  # Controler
336
  my $c = $self->cntl;
337
  
338
  # Check logined as admin
fix session
Yuki Kimoto authored on 2016-04-21
339
  my $session_user_id = $self->session_user_id;
340
  
341
  return $self->app->manager->is_admin($session_user_id) && $self->logined($session_user_id);
342
}
343

            
complete pull request logic
Yuki Kimoto authored on 2016-04-28
344
sub session_user_row_id {
345
  my $self = shift;
346
  
347
  my $session_user_row_id = $self->cntl->session('user_row_id');
348
  
349
  return $session_user_row_id;
350
}
351

            
fix session
Yuki Kimoto authored on 2016-04-21
352
sub session_user_id {
353
  my $self = shift;
354
  
355
  my $session_user_row_id = $self->cntl->session('user_row_id');
356
  my $session_user_id = $self->app->dbi->model('user')->select(
357
    'id', where => {row_id => $session_user_row_id}
358
  )->value;
added user delete feature
Yuki Kimoto authored on 2013-04-09
359
  
fix session
Yuki Kimoto authored on 2016-04-21
360
  return $session_user_id;
added user delete feature
Yuki Kimoto authored on 2013-04-09
361
}
362

            
little more secure login
Yuki Kimoto authored on 2013-03-16
363
sub logined {
fix session
Yuki Kimoto authored on 2016-04-21
364
  my ($self, $user_id) = @_;
little more secure login
Yuki Kimoto authored on 2013-03-16
365
  
366
  my $c = $self->cntl;
367
  my $dbi = $c->app->dbi;
368
  
fix session
Yuki Kimoto authored on 2016-04-21
369
  my $session_user_row_id = $c->session('user_row_id');
370
  my $session_user_id = $self->session_user_id;
added reset password feature
Yuki Kimoto authored on 2013-04-10
371
  my $password = $c->session('password');
cleanup login page
Yuki Kimoto authored on 2013-03-16
372
  return unless defined $password;
little more secure login
Yuki Kimoto authored on 2013-03-16
373
  
fix session
Yuki Kimoto authored on 2016-04-21
374
  my $correct_password = $dbi->model('user')->select(
375
    'password',
376
    where => {row_id => $session_user_row_id}
377
  )->value;
changed database column info...
Yuki Kimoto authored on 2013-04-17
378
  return unless defined $correct_password;
little more secure login
Yuki Kimoto authored on 2013-03-16
379
  
added branch deleting featur...
Yuki Kimoto authored on 2013-05-05
380
  my $logined;
fix session
Yuki Kimoto authored on 2016-04-21
381
  if (defined $user_id) {
382
    $logined = $user_id eq $session_user_id && $password eq $correct_password;
added branch deleting featur...
Yuki Kimoto authored on 2013-05-05
383
  }
384
  else {
385
    $logined = $password eq $correct_password
386
  }
387
  
388
  return $logined;
little more secure login
Yuki Kimoto authored on 2013-03-16
389
}
390

            
added form to create reposit...
Yuki Kimoto authored on 2013-03-18
391
sub params {
392
  my $self = shift;
393
  
394
  my $c = $self->cntl;
395
  
fix branch not deleted bug a...
Yuki Kimoto authored on 2013-05-29
396
  my %params;
397
  for my $name ($c->param) {
398
    my @values = $c->param($name);
399
    if (@values > 1) {
400
      $params{$name} = \@values;
401
    }
402
    elsif (@values) {
403
      $params{$name} = $values[0];
404
    }
405
  }
added form to create reposit...
Yuki Kimoto authored on 2013-03-18
406
  
407
  return \%params;
408
}
409

            
cleanup
Yuki Kimoto authored on 2012-11-28
410
1;
411