From 7eb5f967f2d85ea3a7846353fbaf666e3a0e2bc5 Mon Sep 17 00:00:00 2001
From: Daniel Friesel <derf@finalrewind.org>
Date: Fri, 4 Sep 2020 18:38:35 +0200
Subject: [PATCH] profile: limit history to four weeks by default

---
 lib/Travelynx/Controller/Account.pm   |  9 +++
 lib/Travelynx/Controller/Traveling.pm | 34 ++++++++++-
 templates/account.html.ep             | 20 ++++---
 templates/privacy.html.ep             | 83 ++++++++++++++-------------
 templates/profile.html.ep             |  2 +-
 5 files changed, 99 insertions(+), 49 deletions(-)

diff --git a/lib/Travelynx/Controller/Account.pm b/lib/Travelynx/Controller/Account.pm
index 10200a69..c68a22c5 100644
--- a/lib/Travelynx/Controller/Account.pm
+++ b/lib/Travelynx/Controller/Account.pm
@@ -261,6 +261,13 @@ sub privacy {
 			$public_level &= ~0x30;
 		}
 
+		if ( $self->param('history_age') eq 'infinite' ) {
+			$public_level |= 0x40;
+		}
+		else {
+			$public_level &= ~0x40;
+		}
+
 		$self->users->set_privacy(
 			uid   => $user->{id},
 			level => $public_level
@@ -281,6 +288,8 @@ sub privacy {
 			: $public_level & 0x20 ? 'extern'
 			:                        'private'
 		);
+		$self->param(
+			history_age => $public_level & 0x40 ? 'infinite' : 'month' );
 		$self->render( 'privacy', name => $user->{name} );
 	}
 }
diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm
index 33b31182..24edaa37 100755
--- a/lib/Travelynx/Controller/Traveling.pm
+++ b/lib/Travelynx/Controller/Traveling.pm
@@ -160,12 +160,32 @@ sub public_profile {
 	  )
 	{
 		my $status = $self->get_user_status( $user->{id} );
+		my @journeys;
+		if ( $user->{public_level} & 0x40 ) {
+			@journeys = $self->journeys->get(
+				uid           => $user->{id},
+				limit         => 10,
+				with_datetime => 1
+			);
+		}
+		else {
+			my $now       = DateTime->now( time_zone => 'Europe/Berlin' );
+			my $month_ago = $now->clone->subtract( weeks => 4 );
+			@journeys = $self->journeys->get(
+				uid           => $user->{id},
+				limit         => 10,
+				with_datetime => 1,
+				after         => $month_ago,
+				before        => $now
+			);
+		}
 		$self->render(
 			'profile',
 			name         => $name,
 			uid          => $user->{id},
 			public_level => $user->{public_level},
 			journey      => $status,
+			journeys     => [@journeys],
 			version      => $self->app->config->{version} // 'UNKNOWN',
 		);
 	}
@@ -207,12 +227,22 @@ sub public_journey_details {
 			with_polyline => 1,
 		);
 
+		if ( not( $user->{public_level} & 0x40 ) ) {
+			my $month_ago = DateTime->now( time_zone => 'Europe/Berlin' )
+			  ->subtract( weeks => 4 )->epoch;
+			if ( $journey and $journey->{rt_dep_ts} < $month_ago ) {
+				$journey = undef;
+			}
+		}
+
 		if ($journey) {
 			my $map_data = $self->journeys_to_map_data(
 				journeys       => [$journey],
 				include_manual => 1,
 			);
-			if ( $journey->{user_data}{comment} ) {
+			if ( $journey->{user_data}{comment}
+				and not $user->{public_level} & 0x04 )
+			{
 				delete $journey->{user_data}{comment};
 			}
 			$self->render(
@@ -226,7 +256,7 @@ sub public_journey_details {
 			);
 		}
 		else {
-			$self->render( 'not_found', );
+			$self->render('not_found');
 		}
 	}
 	else {
diff --git a/templates/account.html.ep b/templates/account.html.ep
index 7bc725fa..9b049a39 100644
--- a/templates/account.html.ep
+++ b/templates/account.html.ep
@@ -72,17 +72,23 @@
 					% elsif ($acc->{is_public} & 0x02) {
 						Aktueller Status
 					% }
-					% if ($acc->{is_public} & 0x04) {
-						mit Kommentar
-					% }
 					% if ($acc->{is_public} & 0x0f and $acc->{is_public} & 0xf0) {
 						<br/>
 					% }
-					% if ($acc->{is_public} & 0x10) {
-						Vergangene Fahrten (nur mit Anmeldung)
+					% if ($acc->{is_public} & 0x30) {
+						% if ($acc->{is_public} & 0x40) {
+							Vergangene Fahrten
+						% }
+						% else {
+							Fahrten der letzten vier Wochen
+						% }
+						% if ($acc->{is_public} & 0x10) {
+							(nur mit Anmeldung)
+						% }
 					% }
-					% elsif ($acc->{is_public} & 0x20) {
-						Vergangene Fahrten
+					% if ($acc->{is_public} & 0x04) {
+						<br/>
+						Kommentare
 					% }
 				</td>
 			</tr>
diff --git a/templates/privacy.html.ep b/templates/privacy.html.ep
index 98dc0684..b5f3bb39 100644
--- a/templates/privacy.html.ep
+++ b/templates/privacy.html.ep
@@ -12,26 +12,22 @@
 <h2>Aktueller Status</h2>
 	<div class="row">
 		<div class="input-field col s12">
+			<div>
 			<label>
 				%= radio_button status_level => 'private'
 				<span>Nicht sichtbar</span>
 			</label>
-		</div>
-	</div>
-	<div class="row">
-		<div class="input-field col s12">
+			</div><div>
 			<label>
 				%= radio_button status_level => 'intern'
 				<span>Nur mit Anmeldung</span>
 			</label>
-		</div>
-	</div>
-	<div class="row">
-		<div class="input-field col s12">
+			</div><div>
 			<label>
 				%= radio_button status_level => 'extern'
 				<span>Öffentlich</span>
 			</label>
+			</div>
 		</div>
 	</div>
 	<div class="row">
@@ -39,63 +35,72 @@
 			Hier kannst du auswählen, ob dein aktueller Status unter <a
 			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
+			Wenn du eingecheckt bist, werden dort Zug, Start- und Zielstation
+			sowie Abfahrts- und Ankunftszeit gezeigt, andernfalls lediglich der
 			Zielbahnhof der letzten Reise.  Wann die letzte Reise beendet wurde,
 			wird nur angegeben, wenn deine vergangenen Zugfahrten sichtbar sind
 			(siehe unten).
 		</div>
 	</div>
-	<div class="row">
-		<div class="input-field col s12">
-			<label>
-				%= check_box public_comment => 1
-				<span>Mit Kommentar</span>
-			</label>
-		</div>
-	</div>
-	<div class="row">
-		<div class="col s12">
-			Wenn aktiv, wird in deinem aktuellen Status auch der optionale
-			Freitext-Kommentar der Zugfahrt gezeigt. Wenn du gerade nicht
-			eingecheckt bist oder dein aktueller Status nicht öffentlich ist,
-			hat dieses Feld keine Auswirkungen.
-		</div>
-	</div>
 <h2>Vergangene Zugfahrten</h2>
 	<div class="row">
-		<div class="input-field col s12">
+		<div class="input-field col s12 m6 l6">
+			<div>
 			<label>
 				%= radio_button history_level => 'private'
 				<span>Nicht sichtbar</span>
 			</label>
-		</div>
-	</div>
-	<div class="row">
-		<div class="input-field col s12">
+			</div><div>
 			<label>
 				%= radio_button history_level => 'intern'
 				<span>Nur mit Anmeldung</span>
 			</label>
-		</div>
-	</div>
-	<div class="row">
-		<div class="input-field col s12">
+			</div><div>
 			<label>
 				%= radio_button history_level => 'extern'
 				<span>Öffentlich</span>
 			</label>
+			</div>
+		</div>
+		<div class="input-field col s12 m6 l6">
+			<div>
+			<label>
+				%= radio_button history_age => 'month'
+				<span>Letzte vier Wochen</span>
+			</label>
+			</div><div>
+			<label>
+				%= radio_button history_age => 'infinite'
+				<span>Alle Fahrten</span>
+			</label>
+			</div>
 		</div>
 	</div>
 	<div class="row">
 		<div class="col s12">
 			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
+			Wagenreihung u.a.).  Bis zu zehn deiner 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.
+			dort nicht eingetragene 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 (oder alle Fahrten
+			der letzten vier Wochen) öffentlich.
+		</div>
+	</div>
+<h2>Sonstiges</h2>
+	<div class="row">
+		<div class="input-field col s12">
+			<label>
+				%= check_box public_comment => 1
+				<span>Kommentare anzeigen</span>
+			</label>
+		</div>
+	</div>
+	<div class="row">
+		<div class="col s12">
+			Wenn aktiv, sind von dir eingetragene Freitext-Kommentare in deinem
+			aktuellen Status sowie bei deinen vergangenen Zugfahrten sichtbar.
 		</div>
 	</div>
 	<div class="row">
diff --git a/templates/profile.html.ep b/templates/profile.html.ep
index 1755303a..6a8d67d5 100644
--- a/templates/profile.html.ep
+++ b/templates/profile.html.ep
@@ -23,7 +23,7 @@
 			<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 '_history_trains', date_format => '%d.%m.%Y', link_prefix => "/p/${name}/j/", journeys => $journeys;
 % }
 
 %= include '_footer', version => stash('version')
-- 
GitLab