diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm index b04526a..8760135 100755 --- a/lib/Travelynx.pm +++ b/lib/Travelynx.pm @@ -774,6 +774,38 @@ sub startup { } ); + $self->helper( + 'get_privacy_by_name' => sub { + my ( $self, $name ) = @_; + + my $res = $self->pg->db->select( + 'users', + [ 'id', 'public_level' ], + { + name => $name, + status => 1 + } + ); + + if ( my $user = $res->hash ) { + return $user; + } + return; + } + ); + + $self->helper( + 'set_privacy' => sub { + my ( $self, $uid, $public_level ) = @_; + + $self->pg->db->update( + 'users', + { public_level => $public_level }, + { id => $uid } + ); + } + ); + $self->helper( 'mark_for_password_reset' => sub { my ( $self, $db, $uid, $token ) = @_; @@ -1696,6 +1728,7 @@ sub startup { $r->get('/recover/:id/:token')->to('account#recover_password'); $r->get('/register')->to('account#registration_form'); $r->get('/reg/:id/:token')->to('account#verify'); + $r->get('/status/:name')->to('traveling#user_status'); $r->post('/action')->to('traveling#log_action'); $r->post('/geolocation')->to('traveling#geolocation'); $r->post('/list_departures')->to('traveling#redirect_to_station'); @@ -1715,6 +1748,7 @@ sub startup { ); $authed_r->get('/account')->to('account#account'); + $authed_r->get('/account/privacy')->to('account#privacy'); $authed_r->get('/ajax/status_card.html')->to('traveling#status_card'); $authed_r->get('/cancelled')->to('traveling#cancelled'); $authed_r->get('/change_password')->to('account#password_form'); @@ -1728,6 +1762,7 @@ sub startup { $authed_r->get('/journey/:id')->to('traveling#journey_details'); $authed_r->get('/s/*station')->to('traveling#station'); $authed_r->get('/confirm_mail/:token')->to('account#confirm_mail'); + $authed_r->post('/account/privacy')->to('account#privacy'); $authed_r->post('/journey/add')->to('traveling#add_journey_form'); $authed_r->post('/journey/edit')->to('traveling#edit_journey'); $authed_r->post('/change_password')->to('account#change_password'); diff --git a/lib/Travelynx/Controller/Account.pm b/lib/Travelynx/Controller/Account.pm index e4b385c..44babfa 100644 --- a/lib/Travelynx/Controller/Account.pm +++ b/lib/Travelynx/Controller/Account.pm @@ -208,6 +208,28 @@ sub do_logout { $self->redirect_to('/login'); } +sub privacy { + my ($self) = @_; + + my $user = $self->current_user; + my $public_level = $user->{is_public}; + + if ( $self->param('action') and $self->param('action') eq 'save' ) { + if ( $self->param('public_status') ) { + $public_level |= 0x02; + } + else { + $public_level &= ~0x02; + } + $self->set_privacy( $user->{id}, $public_level ); + } + else { + $self->param( public_status => $public_level & 0x02 ? 1 : 0 ); + } + + $self->render( 'privacy', name => $user->{name} ); +} + sub change_mail { my ($self) = @_; diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm index 81b3a70..cf704ec 100755 --- a/lib/Travelynx/Controller/Traveling.pm +++ b/lib/Travelynx/Controller/Traveling.pm @@ -25,6 +25,44 @@ sub homepage { } } +sub user_status { + my ($self) = @_; + + my $name = $self->stash('name'); + my $user = $self->get_privacy_by_name($name); + + if ( $user and ( $user->{public_level} & 0x02 ) ) { + my $status = $self->get_user_status( $user->{id} ); + $self->render( + 'user_status', + name => $name, + journey => $status + ); + } + else { + $self->render('not_found'); + } +} + +sub public_status_card { + my ($self) = @_; + + my $name = $self->stash('name'); + my $user = $self->get_privacy_by_name($name); + + if ( $user and ( $user->{public_level} & 0x02 ) ) { + my $status = $self->get_user_status( $user->{id} ); + $self->render( + '_public_status_card', + name => $name, + journey => $status + ); + } + else { + $self->render('not_found'); + } +} + sub status_card { my ($self) = @_; my $status = $self->get_user_status; diff --git a/templates/_public_status_card.html.ep b/templates/_public_status_card.html.ep new file mode 100644 index 0000000..1b33c18 --- /dev/null +++ b/templates/_public_status_card.html.ep @@ -0,0 +1,87 @@ +% if ($journey->{checked_in}) { +
+ In <%= $journey->{train_type} %> <%= $journey->{train_no} %> + % if ($journey->{arr_name}) { + von <%= $journey->{dep_name} %> nach <%= $journey->{arr_name} %>. + % } + % else { + ab <%= $journey->{dep_name} %>. + % } +
++ <%= $journey->{real_departure}->strftime('%H:%M') %> + % if ($journey->{real_departure}->epoch != $journey->{sched_departure}->epoch) { + (<%= sprintf('%+d', ($journey->{real_departure}->epoch - $journey->{sched_departure}->epoch)/60) %>) + % } + → + % if ($journey->{real_arrival}->epoch) { + <%= $journey->{real_arrival}->strftime('%H:%M') %> + % if ($journey->{real_arrival}->epoch != $journey->{sched_arrival}->epoch) { + (<%= sprintf('%+d', ($journey->{real_arrival}->epoch - $journey->{sched_arrival}->epoch)/60) %>) + % } + % } + % elsif ($journey->{arr_name}) { + noch nicht bekannt + % } + % else { + unbekannt + % } +
++
+
+ Zuletzt gesehen in <%= $journey->{arr_name} %>. +
+