summaryrefslogtreecommitdiff
path: root/lib/Travelynx.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Travelynx.pm')
-rwxr-xr-xlib/Travelynx.pm61
1 files changed, 60 insertions, 1 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm
index 6bdc133..25d45d3 100755
--- a/lib/Travelynx.pm
+++ b/lib/Travelynx.pm
@@ -348,6 +348,19 @@ sub startup {
}
);
$self->attr(
+ drop_journey_query => sub {
+ my ($self) = @_;
+
+ return $self->app->dbh->prepare(
+ qq{
+ delete from user_actions
+ where user_id = ?
+ and (id = ? or id = ?)
+ }
+ );
+ }
+ );
+ $self->attr(
get_userid_query => sub {
my ($self) = @_;
@@ -493,7 +506,9 @@ qq{select * from pending_mails where email = ? and num_tries > 1;}
},
);
- $self->helper(sendmail => sub { state $sendmail = Travelynx::Helper::Sendmail->new; });
+ $self->helper(
+ sendmail => sub { state $sendmail = Travelynx::Helper::Sendmail->new; }
+ );
$self->helper(
'get_departures' => sub {
@@ -892,6 +907,50 @@ qq{select * from pending_mails where email = ? and num_tries > 1;}
);
$self->helper(
+ 'delete_journey' => sub {
+ my ( $self, $checkin_id, $checkout_id, $checkin_epoch,
+ $checkout_epoch )
+ = @_;
+ my $uid = $self->current_user->{id};
+
+ my @journeys = $self->get_user_travels(
+ uid => $uid,
+ checkout_id => $checkout_id
+ );
+ if ( @journeys == 0 ) {
+ return 'Journey not found';
+ }
+ my $journey = $journeys[0];
+
+ # Double-check (comparing both ID and action epoch) to make sure we
+ # are really deleting the right journey and the user isn't just
+ # playing around with POST requests.
+ if ( $journey->{ids}[0] != $checkin_id
+ or $journey->{ids}[1] != $checkout_id
+ or $journey->{checkin}->epoch != $checkin_epoch
+ or $journey->{checkout}->epoch != $checkout_epoch )
+ {
+ return 'Invalid journey data';
+ }
+ my $query = $self->app->drop_journey_query;
+ my $success = $query->execute( $uid, $checkin_id, $checkout_id );
+ if ($success) {
+ if ( $query->rows == 2 ) {
+ return undef;
+ }
+ else {
+ return
+ sprintf( 'Deleted %d rows, expected 2', $query->rows );
+ }
+ }
+ my $err = $self->app->drop_journey_query->errstr;
+ $self->app->log->error(
+ "Delete($uid, $checkin_id, $checkout_id): DELETE failed: $err");
+ return 'DELETE failed: ' . $err;
+ }
+ );
+
+ $self->helper(
'get_user_travels' => sub {
my ( $self, %opt ) = @_;