Showing 5 changed files with 154 additions and 103 deletions
+30 -6
lib/Gitprep.pm
... ...
@@ -175,14 +175,38 @@ sub startup {
175 175
   
176 176
   # Model
177 177
   my $models = [
178
-    {table => 'user', primary_key => 'id'},
179
-    {table => 'ssh_public_key', primary_key => 'key'},
180
-    {table => 'project', primary_key => ['user_id', 'name']},
181
-    {table => 'number', primary_key => 'key'},
182
-    {table => 'collaboration', primary_key => ['user_id', 'project_name', 'collaborator_id']},
178
+    {
179
+      table => 'user',
180
+      primary_key => 'row_id'
181
+    },
182
+    {
183
+      table => 'ssh_public_key',
184
+      primary_key => 'row_id',
185
+      join => [
186
+        'left join user on ssh_public_key.user = user.row_id'
187
+      ]
188
+    },
189
+    {
190
+      table => 'project',
191
+      primary_key => 'row_id',
192
+      join => [
193
+        'left join user on project.user = user.row_id'
194
+      ]
195
+    },
196
+    {
197
+      table => 'collaboration',
198
+      primary_key => 'row_id',
199
+      join => [
200
+        'left join user on collaboration.collaborator = user.row_id',
201
+        'left join project on collaboration.project = project.row_id'
202
+      ]
203
+    },
183 204
     {
184 205
       table => 'pull_request',
185
-      join => ['left join user on pull_request.open_user = user.row_id']
206
+      primary_key => 'row_id',
207
+      join => [
208
+        'left join user on pull_request.open_user = user.row_id'
209
+      ]
186 210
     }
187 211
   ];
188 212
   $dbi->create_model($_) for @$models;
+20
lib/Gitprep/API.pm
... ...
@@ -5,6 +5,26 @@ use Digest::MD5 'md5_hex';
5 5
 
6 6
 has 'cntl';
7 7
 
8
+sub get_user_row_id {
9
+  my ($self, $user_id) = @_;
10
+  
11
+  my $user_row_id = $self->app->dbi->model('user')->select('row_id', where => {id => $user_id})->value;
12
+  
13
+  return $user_row_id;
14
+}
15
+
16
+sub get_project_row_id {
17
+  my ($self, $user_id, $project_id) = @_;
18
+  
19
+  my $user_row_id = $self->app->dbi->model('user')->select('row_id', where => {id => $user_id})->value;
20
+  my $project_row_id = $self->app->dbi->model('project')->model('project')->select(
21
+    'row_id',
22
+    where => {user => $user_row_id, id => $project_id}
23
+  )->value;
24
+  
25
+  return $project_row_id;
26
+}
27
+
8 28
 sub app { shift->cntl->app }
9 29
 
10 30
 sub encrypt_password {
+74 -70
lib/Gitprep/Manager.pm
... ...
@@ -127,20 +127,22 @@ sub admin_user {
127 127
 }
128 128
 
129 129
 sub default_branch {
130
-  my ($self, $user, $project, $default_branch) = @_;
130
+  my ($self, $user_id, $project_id, $default_branch) = @_;
131
+  
132
+  my $user_row_id = $self->api->get_user_row_id($user_id);
131 133
   
132 134
   # Set default branch
133 135
   my $dbi = $self->app->dbi;
134 136
   if (defined $default_branch) {
135 137
     $dbi->model('project')->update(
136 138
       {default_branch => $default_branch},
137
-      id => [$user, $project]
139
+      where => {user => $user_row_id, id => $project_id}
138 140
     );
139 141
   }
140 142
   else {
141 143
     # Get default branch
142 144
     my $default_branch = $dbi->model('project')
143
-      ->select('default_branch', id => [$user, $project])
145
+      ->select('default_branch', where => {user => $user_row_id, id => $project_id})
144 146
       ->value;
145 147
     
146 148
     return $default_branch;
... ...
@@ -158,14 +160,14 @@ sub fork_project {
158 160
       
159 161
       # Original project id
160 162
       my $project_info = $dbi->model('project')->select(
161
-        ['original_pid', 'private'],
162
-        id => [$original_user, $project]
163
+        ['original_project', 'private'],
164
+        where => {user => $original_user, id => $project}
163 165
       )->one;
164 166
       
165
-      my $original_pid = $project_info->{original_pid};
167
+      my $original_project = $project_info->{original_project};
166 168
       
167 169
       croak "Can't get original project id"
168
-        unless defined $original_pid && $original_pid > 0;
170
+        unless defined $original_project && $original_project > 0;
169 171
       
170 172
       # Create project
171 173
       eval {
... ...
@@ -174,7 +176,7 @@ sub fork_project {
174 176
           $project,
175 177
           {
176 178
             original_user => $original_user,
177
-            original_pid => $original_pid,
179
+            original_project => $original_project,
178 180
             private => $project_info->{private}
179 181
           }
180 182
         );
... ...
@@ -192,47 +194,55 @@ sub fork_project {
192 194
 }
193 195
 
194 196
 sub is_admin {
195
-  my ($self, $user) = @_;
197
+  my ($self, $user_id) = @_;
196 198
   
197 199
   # Check admin
198 200
   my $is_admin = $self->app->dbi->model('user')
199
-    ->select('admin', id => $user)->value;
201
+    ->select('admin', where => {id => $user_id})->value;
200 202
   
201 203
   return $is_admin;
202 204
 }
203 205
 
204 206
 sub is_private_project {
205
-  my ($self, $user, $project) = @_;
207
+  my ($self, $user_id, $project_id) = @_;
208
+  
209
+  my $user_row_id = $self->api->get_user_row_id($user_id);
206 210
   
207 211
   # Is private
208 212
   my $private = $self->app->dbi->model('project')
209
-    ->select('private', id => [$user, $project])->value;
213
+    ->select('private', where => {user => $user_row_id, project_id => $project_id})->value;
210 214
   
211 215
   return $private;
212 216
 }
213 217
 
218
+sub api { shift->app->gitprep_api }
219
+
220
+
214 221
 sub members {
215
-  my ($self, $user, $project) = @_;
222
+  my ($self, $user_id, $project_id) = @_;
223
+  
224
+  my $user_row_id = $self->api->get_user_row_id($user_id);
216 225
   
217 226
   # DBI
218 227
   my $dbi = $self->app->dbi;
219 228
   
220 229
   # Original project id
221
-  my $original_pid = $dbi->model('project')
222
-    ->select('original_pid', id => [$user, $project])->value;
230
+  my $original_project = $dbi->model('project')
231
+    ->select('original_project', where => {user => $user_row_id, id => $project_id})->value;
223 232
   
224 233
   # Members
225 234
   my $members = $dbi->model('project')->select(
226
-    ['user_id as id', 'name as project'],
235
+    [
236
+      {__MY__ => '*'},
237
+      {user => ['id']}
238
+    ],
227 239
     where => [
228 240
       ['and',
229
-        ':original_pid{=}',
241
+        ':original_project{=}',
230 242
         ['or', ':user_id{<>}', ':name{<>}']
231 243
       ],
232 244
       {
233
-        original_pid => $original_pid,
234
-        user_id => $user,
235
-        name => $project
245
+        original_project => $original_project,
236 246
       }
237 247
     ],
238 248
     append => 'order by user_id, name'
... ...
@@ -318,43 +328,35 @@ sub delete_user {
318 328
 }
319 329
 
320 330
 sub original_project {
321
-  my ($self, $user, $project) = @_;
331
+  my ($self, $user_id, $project_id) = @_;
332
+  
333
+  my $user_row_id = $self->api->get_user_row_id($user_id);
322 334
   
323 335
   # Original project id
324 336
   my $dbi = $self->app->dbi;
325
-  my $row = $dbi->model('project')->select(
326
-    ['original_user', 'original_pid'],
327
-    id => [$user, $project]
328
-  )->one;
337
+  my $original_project_row_id = $dbi->model('project')->select(
338
+    'original_project',
339
+    where => {user => $user_row_id, id => $project_id}
340
+  )->value;
329 341
   
330
-  croak "Original project don't eixsts." unless $row;
342
+  croak "Original project don't eixsts." unless defined $original_project_row_id;
331 343
   
332 344
   # Original project
333 345
   my $original_project = $dbi->model('project')->select(
334
-    'name',
346
+    [
347
+      {__MY__ => '*'},
348
+      {user => ['id']}
349
+    ],
335 350
     where => {
336
-      user_id => $row->{original_user},
337
-      original_pid => $row->{original_pid}
351
+      'project.row_id' => $original_project_row_id
338 352
     }
339
-  )->value;
353
+  )->one;
340 354
   
341
-  return unless defined $original_project && length $original_project;
355
+  return unless defined $original_project;
342 356
   
343 357
   return $original_project;
344 358
 }
345 359
 
346
-sub original_user {
347
-  my ($self, $user, $project) = @_;
348
-  
349
-  # Orginal user
350
-  my $original_user = $self->app->dbi->model('project')
351
-    ->select('original_user', id => [$user, $project])
352
-    ->value;
353
-  return unless defined $original_user && length $original_user;
354
-  
355
-  return $original_user;
356
-}
357
-
358 360
 sub projects {
359 361
   my ($self, $user_id) = @_;
360 362
   
... ...
@@ -685,7 +687,7 @@ EOS
685 687
   my $project_columns = [
686 688
     "default_branch not null default 'master'",
687 689
     "original_user not null default ''",
688
-    "original_pid integer not null default 0",
690
+    "original_project integer not null default 0",
689 691
     "private not null default 0",
690 692
     "ignore_space_change not null default 0",
691 693
     "guess_encoding not null default ''"
... ...
@@ -697,7 +699,7 @@ EOS
697 699
   # Check project table
698 700
   eval {
699 701
     $dbi->select(
700
-      [qw/default_branch original_user original_pid private ignore_space_change guess_encoding/],
702
+      [qw/default_branch original_user original_project private ignore_space_change guess_encoding/],
701 703
       table => 'project'
702 704
     );
703 705
   };
... ...
@@ -757,14 +759,14 @@ EOS
757 759
   }
758 760
   
759 761
   # Original project id number
760
-  eval { $dbi->insert({key => 'original_pid'}, table => 'number') };
761
-  my $original_pid = $dbi->select(
762
+  eval { $dbi->insert({key => 'original_project'}, table => 'number') };
763
+  my $original_project = $dbi->select(
762 764
     'key',
763 765
     table => 'number',
764
-    where => {key => 'original_pid'}
766
+    where => {key => 'original_project'}
765 767
   )->value;
766
-  unless (defined $original_pid) {
767
-    my $error = "Can't create original_pid row in number table";
768
+  unless (defined $original_project) {
769
+    my $error = "Can't create original_project row in number table";
768 770
     $self->app->log->error($error);
769 771
     croak $error;
770 772
   }
... ...
@@ -939,12 +941,6 @@ sub _create_project {
939 941
   # Create project
940 942
   my $dbi = $self->app->dbi;
941 943
   $dbi->connector->txn(sub {
942
-    unless (defined $params->{original_pid}) {
943
-      my $number = $dbi->model('number')->select('value', where => {key => 'original_pid'})->value;
944
-      $number++;
945
-      $dbi->model('number')->update({value => $number}, where => {key => 'original_pid'});
946
-      $params->{original_pid} = $number;
947
-    }
948 944
     $dbi->model('project')->insert($params, id => [$user, $project]);
949 945
   });
950 946
 }
... ...
@@ -1094,10 +1090,12 @@ sub _create_rep {
1094 1090
 }
1095 1091
 
1096 1092
 sub _create_db_user {
1097
-  my ($self, $user, $data) = @_;
1093
+  my ($self, $user_id, $data) = @_;
1094
+  
1095
+  $data->{id} = $user_id;
1098 1096
   
1099 1097
   # Create database user
1100
-  $self->app->dbi->model('user')->insert($data, id => $user);
1098
+  $self->app->dbi->model('user')->insert($data);
1101 1099
 }
1102 1100
 
1103 1101
 sub _create_user_dir {
... ...
@@ -1110,10 +1108,10 @@ sub _create_user_dir {
1110 1108
 }
1111 1109
 
1112 1110
 sub _delete_db_user {
1113
-  my ($self, $user) = @_;
1111
+  my ($self, $user_id) = @_;
1114 1112
   
1115 1113
   # Delete database user
1116
-  my $count = $self->app->dbi->model('user')->delete(id => $user);
1114
+  my $count = $self->app->dbi->model('user')->delete(where => {id => $user_id});
1117 1115
   
1118 1116
   return $count;
1119 1117
 }
... ...
@@ -1128,11 +1126,13 @@ sub _delete_user_dir {
1128 1126
 }
1129 1127
 
1130 1128
 sub _delete_project {
1131
-  my ($self, $user, $project) = @_;
1129
+  my ($self, $user_id, $project_id) = @_;
1130
+  
1131
+  my $user_row_id = $self->api->get_user_row_id($user_id);
1132 1132
   
1133 1133
   # Delete project
1134 1134
   my $dbi = $self->app->dbi;
1135
-  $dbi->model('project')->delete(id => [$user, $project]);
1135
+  $dbi->model('project')->delete(where => {user => $user_row_id, id => $project_id});
1136 1136
 }
1137 1137
 
1138 1138
 sub _delete_rep {
... ...
@@ -1149,20 +1149,22 @@ sub _delete_rep {
1149 1149
 }
1150 1150
 
1151 1151
 sub exists_project {
1152
-  my ($self, $user, $project) = @_;
1152
+  my ($self, $user_id, $project_id) = @_;
1153
+  
1154
+  my $user_row_id = $self->api->get_user_row_id($user_id);
1153 1155
   
1154 1156
   # Exists project
1155 1157
   my $dbi = $self->app->dbi;
1156
-  my $row = $dbi->model('project')->select(id => [$user, $project])->one;
1158
+  my $row = $dbi->model('project')->select(where => {user => $user_row_id, id => $project_id})->one;
1157 1159
   
1158 1160
   return $row ? 1 : 0;
1159 1161
 }
1160 1162
 
1161 1163
 sub exists_user {
1162
-  my ($self, $user) = @_;
1164
+  my ($self, $user_id) = @_;
1163 1165
   
1164 1166
   # Exists project
1165
-  my $row = $self->app->dbi->model('user')->select(id => $user)->one;
1167
+  my $row = $self->app->dbi->model('user')->select(where => {id => $user_id})->one;
1166 1168
   
1167 1169
   return $row ? 1 : 0;
1168 1170
 }
... ...
@@ -1206,17 +1208,19 @@ sub _fork_rep {
1206 1208
 }
1207 1209
 
1208 1210
 sub _rename_project {
1209
-  my ($self, $user, $project, $renamed_project) = @_;
1211
+  my ($self, $user_id, $project_id, $renamed_project_id) = @_;
1212
+  
1213
+  my $user_row_id = $self->api->get_user_row_id($user_id);
1210 1214
   
1211 1215
   # Check arguments
1212 1216
   croak "Invalid parameters(_rename_project)"
1213
-    unless defined $user && defined $project && defined $renamed_project;
1217
+    unless defined $user_id && defined $project_id && defined $renamed_project_id;
1214 1218
   
1215 1219
   # Rename project
1216 1220
   my $dbi = $self->app->dbi;
1217 1221
   $dbi->model('project')->update(
1218
-    {name => $renamed_project},
1219
-    id => [$user, $project]
1222
+    {id => $renamed_project_id},
1223
+    where => {user => $user_row_id, id => $project_id}
1220 1224
   );
1221 1225
 }
1222 1226
 
+28 -27
templates/include/header.html.ep
... ...
@@ -2,20 +2,21 @@
2 2
   my $api = gitprep_api;
3 3
   my $logined = $api->logined;
4 4
 
5
-  my $current_user = session('user');
6
-  my $user = $self->param('user');
5
+  my $current_user_row_id = session('user_row_id');
6
+  my $current_user = app->dbi->model('user')->select(where => {row_id => $current_user_row_id})->one;
7
+  
8
+  my $user_id = $self->param('user');
7 9
 
8
-  my $project = param('project');
9
-  my $original_user;
10
+  my $project_id = param('project');
11
+  
10 12
   my $original_project;
11 13
   my $is_private_project;
12 14
   
13 15
   my $no_project_header = stash('no_project_header');
14 16
   
15
-  if (!$no_project_header && defined $project) {
16
-    $original_user = app->manager->original_user($user, $project);
17
-    $original_project = app->manager->original_project($user, $project);
18
-    $is_private_project = app->manager->is_private_project($user, $project);
17
+  if (!$no_project_header && defined $project_id) {
18
+    $original_project = app->manager->original_project($user_id, $project_id);
19
+    $is_private_project = app->manager->is_private_project($user_id, $project_id);
19 20
   }
20 21
 %>
21 22
 
... ...
@@ -32,21 +33,21 @@
32 33
     <div class="header-right">
33 34
       <div class="header-rigth-container">
34 35
         % if ($api->logined) {
35
-          % unless ($current_user eq 'admin') {
36
+          % unless ($current_user->{id} eq 'admin') {
36 37
             <div class="header-btn-container">
37 38
               <a class="btn btn-small" href="<%= url_for("/_new") %>">Create a new repo</a>
38 39
             </div>
39 40
             <div class="header-btn-container">
40
-              <a class="btn btn-small" href="<%= url_for("/$current_user/_settings") %>">Account Settings</a>
41
+              <a class="btn btn-small" href="<%= url_for("/$current_user->{id}/_settings") %>">Account Settings</a>
41 42
             </div>
42 43
           % }
43 44
           % my $url = url_with->to_abs;
44 45
           <div class="header-btn-container">
45 46
             <a class="btn btn-small" href="<%= url_for("/_logout?from=$url") %>">Sign out</a>
46 47
           </div>
47
-          <!-- Logined as <%= $current_user %> -->
48
+          <!-- Logined as <%= $current_user->{id} %> -->
48 49
           <div class="header-login-container">
49
-            <i class="icon-user"></i><a href="<%= url_for("/$current_user") %>"><%= $current_user %></a>
50
+            <i class="icon-user"></i><a href="<%= url_for("/$current_user->{id}") %>"><%= $current_user->{id} %></a>
50 51
           </div>
51 52
         % } else {
52 53
           <div class="header-btn-container">
... ...
@@ -58,17 +59,17 @@
58 59
   </div>
59 60
 </div>
60 61
 
61
-% if (!$no_project_header && (defined $user || defined $project)) {
62
+% if (!$no_project_header && (defined $user_id || defined $project_id)) {
62 63
   <div class="project-header">
63 64
     <div class="container" style="overflow:hidden">
64 65
       <div class="project-header-left">
65 66
         <ul class="breadcrumb">
66 67
           <li><a href="<%= url_for('/') %>"><i class="icon-home"></i></a></li>
67 68
           /
68
-          <li><a href="<%= url_for("/$user") %>"><%= $user %></a></li>
69
-          % if (defined $project) {
69
+          <li><a href="<%= url_for("/$user_id") %>"><%= $user_id %></a></li>
70
+          % if (defined $project_id) {
70 71
             /
71
-            <li><b><a href="<%= url_for("/$user/$project") %>"><%= $project %></a></b></li>
72
+            <li><b><a href="<%= url_for("/$user_id/$project_id") %>"><%= $project_id %></a></b></li>
72 73
           % }
73 74
           
74 75
           % if ($is_private_project) {
... ...
@@ -79,8 +80,8 @@
79 80
             <small>
80 81
               (
81 82
                 forked from
82
-                <a href="<%= url_for("/$original_user/$original_project") %>">
83
-                  <%= "$original_user/$original_project" %>
83
+                <a href="<%= url_for("/$original_project->{'user.id'}/$original_project->{id}") %>">
84
+                  <%= "$original_project->{'user.id'}/$original_project->{id}" %>
84 85
                 </a>
85 86
               )
86 87
             </small>
... ...
@@ -89,10 +90,10 @@
89 90
       </div>
90 91
       <div class="project-header-right">
91 92
         <div class="project-header-right-container">
92
-          % if (defined $project) {
93
+          % if (defined $project_id) {
93 94
             <div class="project-header-btn-container">
94
-              % if ($logined && $current_user ne $user ) {
95
-                <a href="<%= url_for("/$user/$project/fork") %>" class="btn">Fork</a>
95
+              % if ($logined && $current_user->{id} ne $user_id ) {
96
+                <a href="<%= url_for("/$user_id/$project_id/fork") %>" class="btn">Fork</a>
96 97
               % } else {
97 98
                 <button class="btn disabled" disabled>Fork</button>
98 99
               % }
... ...
@@ -101,7 +102,7 @@
101 102
         </div>
102 103
       </div>
103 104
     </div>
104
-    % if (defined $project) {
105
+    % if (defined $project_id) {
105 106
       <%
106 107
         my $tab = stash('tab') || 'code';
107 108
       %>
... ...
@@ -110,26 +111,26 @@
110 111
           <div class="container">
111 112
             <ul>
112 113
               <li class="<%= $tab eq 'code' ? 'active' :  '' %>">
113
-                <a href="<%= url_for("/$user/$project") %>">
114
+                <a href="<%= url_for("/$user_id/$project_id") %>">
114 115
                   <i class="icon-chevron-right"></i>
115 116
                   Code
116 117
                 </a>
117 118
               </li>
118 119
               <li class="<%= $tab eq 'pulls' ? 'active' :  '' %>">
119
-                <a href="<%= url_for("/$user/$project/pulls") %>">
120
+                <a href="<%= url_for("/$user_id/$project_id/pulls") %>">
120 121
                   <i class="icon-retweet"></i>
121 122
                   Pull request
122 123
                 </a>
123 124
               </li>
124 125
               <li class="<%= $tab eq 'graph' ? 'active' :  '' %>">
125
-                <a href="<%= url_for("/$user/$project/network") %>" >
126
+                <a href="<%= url_for("/$user_id/$project_id/network") %>" >
126 127
                   <i class="icon-align-center"></i>
127 128
                   Graph
128 129
                 </a>
129 130
               </li>
130
-              % if ($logined && $user eq session('user')) {
131
+              % if ($logined && $user_id eq session('user')) {
131 132
                 <li class="<%= $tab eq 'settings' ? 'active' :  '' %>">
132
-                  <a href="<%= url_for("/$user/$project/settings") %>">
133
+                  <a href="<%= url_for("/$user_id/$project_id/settings") %>">
133 134
                     <i class="icon-cog"></i>
134 135
                     Settings
135 136
                   </a>
+2
templates/user.html.ep
... ...
@@ -14,6 +14,8 @@
14 14
     where => {id => $user_id, admin => 0}
15 15
   )->one;
16 16
   
17
+  warn $user_id;
18
+  
17 19
   # Projects
18 20
   unless (app->manager->exists_user($user_id)) {
19 21
     $self->reply->not_found;