Showing 4 changed files with 103 additions and 3 deletions
+3
lib/Gitprep.pm
... ...
@@ -205,6 +205,9 @@ sub startup {
205 205
       
206 206
       # Fork
207 207
       $r->any('/fork')->name('fork');
208
+
209
+      # Fork
210
+      $r->get('/network')->name('network');
208 211
     }
209 212
   }
210 213
 
+66 -1
lib/Gitprep/RepManager.pm
... ...
@@ -9,6 +9,61 @@ use File::Temp ();
9 9
 
10 10
 has 'app';
11 11
 
12
+sub create_tab_index {
13
+  my ($self, $tab_index_values) = @_;
14
+
15
+  my $tab_index = "\t";
16
+  
17
+  # Check config
18
+  for my $key (keys %$tab_index_values) {
19
+    my $value = $tab_index_values->{$key};
20
+    croak "Can't contain tab string in tab_index"
21
+      if $key =~ /\t/;
22
+    $tab_index .= "$key:$value\t";
23
+  }
24
+  
25
+  return $tab_index;
26
+}
27
+
28
+sub members {
29
+  my ($self, $user, $project) = @_;
30
+  
31
+  # DBI
32
+  my $dbi = $self->app->dbi;
33
+  
34
+  # Where
35
+  my $where = $dbi->where;
36
+  $where->clause(['and', (':tab_index{like}') x 2]);
37
+  $where->param({
38
+    tab_index => ["%\toriginal_user:$user%", "%\toriginal_project:$project%"]
39
+  });
40
+  
41
+  # Rows
42
+  my $members = $self->app->dbi
43
+    ->model('project')
44
+    ->select('user_id as id', where => $where)
45
+    ->all;
46
+  
47
+  return $members;
48
+}
49
+
50
+sub parse_tab_index {
51
+  my ($self, $tab_index) = @_;
52
+  
53
+  my $tab_index_values = {};
54
+  
55
+  $tab_index =~ s/^\t//;
56
+  $tab_index =~ s/\t$//;
57
+  
58
+  my @kvs = split /\t/, $tab_index;
59
+  for my $kv (@kvs) {
60
+    my ($key, $value) = split /:/, $kv, 2;
61
+    $tab_index_values->{$key} = $value;
62
+  }
63
+  
64
+  return $tab_index_values;
65
+}
66
+
12 67
 sub create_project {
13 68
   my ($self, $user, $project, $opts) = @_;
14 69
   
... ...
@@ -307,9 +362,19 @@ sub _create_project {
307 362
   $config = {%$config, %$new_config};
308 363
   my $config_json = Mojo::JSON->new->encode($config);
309 364
   
365
+  my $tab_index_values = {};
366
+  $tab_index_values->{original_user} = $config->{original_user}
367
+    if defined $config->{original_user};
368
+  $tab_index_values->{original_project} = $config->{original_project}
369
+    if defined $config->{original_project};
370
+  my $tab_index = $self->create_tab_index($tab_index_values) || '';
371
+  
310 372
   # Create project
311 373
   $self->app->dbi->model('project')->insert(
312
-    {config => $config_json},
374
+    {
375
+      config => $config_json,
376
+      tab_index => $tab_index
377
+    },
313 378
     id => [$user, $project]
314 379
   );
315 380
 }
+3 -2
templates/include/project_header.html.ep
... ...
@@ -8,7 +8,7 @@
8 8
 %>
9 9
 
10 10
 <div class="row">
11
-  <div class="span11">
11
+  <div class="span10">
12 12
     <ul class="breadcrumb">
13 13
       <li><a href="<%= url_for('/') %>">Home</a></li>
14 14
       /
... ...
@@ -26,7 +26,8 @@
26 26
       % }
27 27
     </ul>
28 28
   </div>
29
-  <div class="span1">
29
+  <div class="span2">
30
+    <a class="btn" href="<%= url_for("/$user/$project/network") %>" >Network</a>
30 31
     % if ($logined && $current_user ne $user ) {
31 32
       <a href="<%= url_for("/$user/$project/fork") %>" class="btn">Fork</a>
32 33
     % } else {
+31
templates/network.html.ep
... ...
@@ -0,0 +1,31 @@
1
+<%
2
+  my $state;
3
+
4
+  # API
5
+  my $api = gitprep_api;
6
+  
7
+  # Members
8
+  my $members = app->manager->members($user, $project);
9
+%>
10
+
11
+% layout 'common';
12
+
13
+  %= include '/include/header';
14
+  
15
+  <div class="container" style="min-heigth:500px">
16
+    <h3>Members of the <%= $project %> Network</h3>
17
+    <ul class="unstyled">
18
+      % for my $member (@$members) {
19
+        <li>
20
+          <a href="<%= url_for("/$member->{id}") %>">
21
+            <%= $member->{id} %>
22
+          </a>
23
+          /
24
+          <a href="<%= url_for("/$member->{id}/$project") %>">
25
+            <%= $project %>
26
+          </a>
27
+        </li>
28
+      % }
29
+    </ul>
30
+  </div>
31
+  %= include '/include/footer';