Lemonldap-NG-Manager

 view release on metacpan or  search on metacpan

lib/Lemonldap/NG/Manager/Notifications.pm  view on Meta::CPAN

    my $dDate = strftime( "%Y-%m-%d", localtime() );
    if ( $json->{date} ) {
        $self->logger->debug(
"Posted data : uid = $json->{uid} - Ref = $json->{reference} - Date = $json->{date}"
        );
    }
    else {
        $self->logger->debug(
"Posted data : uid = $json->{uid} - Ref = $json->{reference} - Date = ???"
        );
        $json->{date} = $dDate;
    }

    # Check if posted date > today
    unless ( $json->{date} ge $dDate ) {
        $self->logger->debug("Posted Date < today");
        $json->{date} = $dDate;
    }
    $self->logger->debug("Notification Date = $json->{date}");

    unless ( $json->{date} =~ /^\d{4}-\d{2}-\d{2}$/ ) {
        $self->logger->error("Malformed date");
        return $self->sendError( $req, "Malformed date", 200 );
    }

    my $newNotif;
    if ( $self->notifFormat eq 'XML' ) {
        utf8::decode( $json->{xml} );
        $newNotif = qq#<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<root><notification #
          . join(
            ' ',
            map {
                if ( my $t = $json->{$_} ) { $t =~ s/"/'/g; qq#$_="$t"# }
                else                       { () }
            } (qw(uid date reference condition))
          ) . ">$json->{xml}</notification></root>";
    }
    else {
        eval {
            my $tmp = from_json( $json->{xml}, { allow_nonref => 1 } );
            $json->{$_} = $tmp->{$_} foreach ( keys %$tmp );
            delete $json->{xml};
        };
        if ($@) {
            $self->logger->error("Malformed notification $@");
            return $self->sendError( $req, "Malformed notification: $@", 200 );
        }
        $newNotif = to_json($json);
    }

    unless ( eval { $self->notifAccess->newNotification($newNotif) } ) {
        $self->logger->error("Notification not created: $@");
        return $self->sendError( $req, "Notification not created: $@", 200 );
    }
    else {
        return $self->sendJSONresponse( $req, { result => 1 } );
    }
}

sub updateNotification {
    my ( $self, $req ) = @_;

    my $json = $req->jsonBodyToObj;
    unless ( defined($json) ) {
        return $self->sendError( $req, undef, 200 );
    }

    # For now, only "mark as done" is proposed
    unless ( $json->{done} ) {
        return $self->sendError( $req, 'Only "done=1" is accepted for now',
            200 );
    }
    my $id = $req->params('notificationId') or die;
    my ( $uid, $ref ) = ( $id =~ /([^_]+?)_(.+)/ );
    my ( $n, $res );
    unless ( $n = $self->notifAccess->get( $uid, $ref ) ) {
        $self->logger->notice("Notification $ref not found for user $uid");
        return $self->sendError( $req,
            "Notification $ref not found for user $uid" );
    }

    # Delete notifications
    my $status = 1;
    foreach ( keys %$n ) {
        $status = 0 unless ( $self->notifAccess->delete($_) );
    }

    unless ($status) {
        $self->logger->error("Notification $ref for user $uid not deleted");
        return $self->sendError( $req,
            "Notification $ref for user $uid not deleted" );
    }

    else {
        $self->logger->info("Notification $ref deleted for user $uid");
        return $self->sendJSONresponse( $req, { result => 1 } );
    }
}

sub deleteDoneNotification {
    my ( $self, $req ) = @_;
    my $res;

    # Purge notification
    my $id = $req->params('notificationId') or die;
    my ( $uid, $ref, $date ) = ( $id =~ /([^_]+?)_([^_]+?)_(.+)/ );
    my $identifier = $self->notifAccess->getIdentifier( $uid, $ref, $date );
    unless ( eval { $self->notifAccess->purge($identifier) } ) {
        $self->logger->warn("Notification $identifier not purged ($@)");
        return $self->sendError( $req,
            "Notification $identifier not purged ($@)", 400 );
    }

    $self->logger->info("Notification $identifier purged");
    return $self->sendJSONresponse( $req, { result => 1 } );
}

1;



( run in 1.261 second using v1.01-cache-2.11-cpan-39bf76dae61 )