summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2020-09-03 22:27:50 +0200
committerDaniel Friesel <derf@finalrewind.org>2020-09-03 22:27:50 +0200
commit482fa975b5f50064deb57b651019908c17b71f47 (patch)
tree118e0247f29c058f61e53db5716df1c1d848d898
parentea0fe3ea3e72eb690dd5a92eb4831523be740d08 (diff)
add public profile page and public journey details
-rwxr-xr-xlib/Travelynx.pm2
-rwxr-xr-xlib/Travelynx/Controller/Traveling.pm88
-rw-r--r--templates/_history_trains.html.ep3
-rw-r--r--templates/account.html.ep6
-rw-r--r--templates/journey.html.ep3
-rw-r--r--templates/privacy.html.ep22
-rw-r--r--templates/profile.html.ep29
7 files changed, 139 insertions, 14 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm
index 232cb46..613fbc3 100755
--- a/lib/Travelynx.pm
+++ b/lib/Travelynx.pm
@@ -2685,6 +2685,8 @@ sub startup {
$r->get('/status/:name/:ts')->to('traveling#user_status');
$r->get('/ajax/status/:name')->to('traveling#public_status_card');
$r->get('/ajax/status/:name/:ts')->to('traveling#public_status_card');
+ $r->get('/p/:name')->to('traveling#public_profile');
+ $r->get('/p/:name/j/:id')->to('traveling#public_journey_details');
$r->post('/api/v1/import')->to('api#import_v1');
$r->post('/api/v1/travel')->to('api#travel_v1');
$r->post('/action')->to('traveling#log_action');
diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm
index 59bad45..33b3118 100755
--- a/lib/Travelynx/Controller/Traveling.pm
+++ b/lib/Travelynx/Controller/Traveling.pm
@@ -146,6 +146,94 @@ sub user_status {
}
}
+sub public_profile {
+ my ($self) = @_;
+
+ my $name = $self->stash('name');
+ my $user = $self->users->get_privacy_by_name( name => $name );
+
+ if (
+ $user
+ and ( $user->{public_level} & 0x22
+ or
+ ( $user->{public_level} & 0x11 and $self->is_user_authenticated ) )
+ )
+ {
+ my $status = $self->get_user_status( $user->{id} );
+ $self->render(
+ 'profile',
+ name => $name,
+ uid => $user->{id},
+ public_level => $user->{public_level},
+ journey => $status,
+ version => $self->app->config->{version} // 'UNKNOWN',
+ );
+ }
+ else {
+ $self->render('not_found');
+ }
+}
+
+sub public_journey_details {
+ my ($self) = @_;
+ my $name = $self->stash('name');
+ my $journey_id = $self->stash('id');
+ my $user = $self->users->get_privacy_by_name( name => $name );
+
+ $self->param( journey_id => $journey_id );
+
+ if ( not( $journey_id and $journey_id =~ m{ ^ \d+ $ }x ) ) {
+ $self->render(
+ 'journey',
+ status => 404,
+ error => 'notfound',
+ journey => {}
+ );
+ return;
+ }
+
+ if (
+ $user
+ and ( $user->{public_level} & 0x20
+ or
+ ( $user->{public_level} & 0x10 and $self->is_user_authenticated ) )
+ )
+ {
+ my $journey = $self->journeys->get_single(
+ uid => $user->{id},
+ journey_id => $journey_id,
+ verbose => 1,
+ with_datetime => 1,
+ with_polyline => 1,
+ );
+
+ if ($journey) {
+ my $map_data = $self->journeys_to_map_data(
+ journeys => [$journey],
+ include_manual => 1,
+ );
+ if ( $journey->{user_data}{comment} ) {
+ delete $journey->{user_data}{comment};
+ }
+ $self->render(
+ 'journey',
+ error => undef,
+ journey => $journey,
+ with_map => 1,
+ username => $name,
+ readonly => 1,
+ %{$map_data},
+ );
+ }
+ else {
+ $self->render( 'not_found', );
+ }
+ }
+ else {
+ $self->render('not_found');
+ }
+}
+
sub public_status_card {
my ($self) = @_;
diff --git a/templates/_history_trains.html.ep b/templates/_history_trains.html.ep
index d422165..74dfe9e 100644
--- a/templates/_history_trains.html.ep
+++ b/templates/_history_trains.html.ep
@@ -12,6 +12,9 @@
<tbody>
% for my $travel (@{$journeys}) {
% my $detail_link = '/journey/' . $travel->{id};
+ % if (my $prefix = stash('link_prefix')) {
+ % $detail_link = $prefix . $travel->{id};
+ % }
<tr>
<td><%= $travel->{sched_departure}->strftime($date_format) %></td>
<td><a href="<%= $detail_link %>"><%= $travel->{type} %> <%= $travel->{line} // $travel->{no} %></a></td>
diff --git a/templates/account.html.ep b/templates/account.html.ep
index 8df5008..7bc725f 100644
--- a/templates/account.html.ep
+++ b/templates/account.html.ep
@@ -67,7 +67,7 @@
<span style="color: #999999;">Keine</span>
% }
% if ($acc->{is_public} & 0x01) {
- Aktueller Status (nur für angemeldete Accounts)
+ Aktueller Status (nur mit Anmeldung)
% }
% elsif ($acc->{is_public} & 0x02) {
Aktueller Status
@@ -79,10 +79,10 @@
<br/>
% }
% if ($acc->{is_public} & 0x10) {
- Letzte zehn Fahrten (nur für angemeldete Accounts)
+ Vergangene Fahrten (nur mit Anmeldung)
% }
% elsif ($acc->{is_public} & 0x20) {
- Letzte zehn Fahrten
+ Vergangene Fahrten
% }
</td>
</tr>
diff --git a/templates/journey.html.ep b/templates/journey.html.ep
index 0979f49..a5e04a0 100644
--- a/templates/journey.html.ep
+++ b/templates/journey.html.ep
@@ -14,6 +14,9 @@
<div class="row">
<div class="col s12">
<p>
+ % if (my $name = stash('username')) {
+ <b><a href="/p/<%= $name %>"><%= $name %></a></b>s
+ % }
% if ($journey->{cancelled}) {
Ausgefallene Fahrt
% }
diff --git a/templates/privacy.html.ep b/templates/privacy.html.ep
index 7b78770..98dc068 100644
--- a/templates/privacy.html.ep
+++ b/templates/privacy.html.ep
@@ -22,7 +22,7 @@
<div class="input-field col s12">
<label>
%= radio_button status_level => 'intern'
- <span>Nur für angemeldete Accounts</span>
+ <span>Nur mit Anmeldung</span>
</label>
</div>
</div>
@@ -37,7 +37,8 @@
<div class="row">
<div class="col s12">
Hier kannst du auswählen, ob dein aktueller Status unter <a
- href="/status/<%= $name %>">/status/<%= $name %></a> abrufbar ist.
+ href="/status/<%= $name %>">/status/<%= $name %></a> sowie <a
+ href="/p/<%= $name %>">/p/<%= $name %></a> abrufbar ist.
Wenn du eingecheckt bist, werden dort Zug, Start- und Zielstation,
Abfahrts- und Ankunftszeit gezeigt; andernfalls lediglich der
Zielbahnhof der letzten Reise. Wann die letzte Reise beendet wurde,
@@ -74,7 +75,7 @@
<div class="input-field col s12">
<label>
%= radio_button history_level => 'intern'
- <span>Nur für angemeldete Accounts</span>
+ <span>Nur mit Anmeldung</span>
</label>
</div>
</div>
@@ -88,14 +89,13 @@
</div>
<div class="row">
<div class="col s12">
- Diese Einstellung bestimmt die Sichtbarkeit deiner letzten
- zehn Zugfahrten mit allen dazu bekannten Details (Abfahrt, Ankunft,
- Wagenreihung u.a.). Derzeit sind diese nur mit einem von dir
- geteilten (oder korrekt erratenen) Link zu
- <a href="/status/<%= $name %>">/status/<%= $name %>/ID</a> abrufbar.
- In Zukunft kann eine auf deiner Statusseite eingebundene Liste
- deiner letzten Zugfahrten folgen, deren Sichtbarkeit ebenfalls von
- dieser Einstellung bestimmt wird.
+ Diese Einstellung bestimmt die Sichtbarkeit deiner vergangenen
+ Zugfahrten mit allen dazu bekannten Details (Abfahrt, Ankunft,
+ Wagenreihung u.a.). Die letzten zehn Fahrten werden unter <a
+ href="/p/<%= $name %>">/p/<%= $name %></a> aufgelistet und verlinkt,
+ ältere Fahrten sind jedoch weiterhin über /p/<%= $name %>/j/ID
+ zugänglich. Da die ID (mit Lücken) aufsteigend vergeben wird, sind
+ effektiv alle deiner vergangenen Fahrten öffentlich.
</div>
</div>
<div class="row">
diff --git a/templates/profile.html.ep b/templates/profile.html.ep
new file mode 100644
index 0000000..1755303
--- /dev/null
+++ b/templates/profile.html.ep
@@ -0,0 +1,29 @@
+% if (stash('error')) {
+ <div class="row">
+ <div class="col s12">
+ <div class="card caution-color">
+ <div class="card-content white-text">
+ <span class="card-title">Fehler</span>
+ <p><%= stash('error') %></p>
+ </div>
+ </div>
+ </div>
+ </div>
+% }
+% if ($public_level & 0x02 or ($public_level & 0x01 and is_user_authenticated())) {
+ <div class="row">
+ <div class="col s12 publicstatuscol" data-user="<%= $name %>">
+ %= include '_public_status_card', name => $name, public_level => $public_level, journey => $journey
+ </div>
+ </div>
+% }
+% if ($public_level & 0x20 or ($public_level & 0x10 and is_user_authenticated())) {
+ <div class="row">
+ <div class="col s12">
+ <h2>Letzte Fahrten von <%= $name %></h1>
+ </div>
+ </div>
+ %= include '_history_trains', date_format => '%d.%m.%Y', link_prefix => "/p/${name}/j/", journeys => [journeys->get(uid => $uid, limit => 10, with_datetime => 1)];
+% }
+
+%= include '_footer', version => stash('version')