App-wsgetmail

 view release on metacpan or  search on metacpan

lib/App/wsgetmail/MS365.pm  view on Meta::CPAN

    unless ($response->is_success) {
        if ($self->_check_matrix('get_folder_details', $response->code) eq 'ignore') {
            return { totalItemCount => 0 };
        }

        warn "failed to fetch folder detail " . $response->status_line;
        warn "response from server : " . $response->content if $self->debug;
        return undef;
    }

    my $folders = decode_json( $response->content );
    return $folders->{value}[0];
}


##############

sub _check_matrix {
    my ($self, $label, $code) = @_;

    my $matrix = $self->response_matrix;

    my $code_category = $code;
    $code_category =~ s/^(\d)\d\d$/${1}xx/;

    if (exists $matrix->{$label} and exists $matrix->{$label}{$code}) {
        return $matrix->{$label}{$code};
    }
    elsif (exists $matrix->{default} and exists $matrix->{default}{$code}) {
        return $matrix->{default}{$code};
    }
    elsif (exists $matrix->{$label} and exists $matrix->{$label}{$code_category}) {
        return $matrix->{$label}{$code_category};
    }
    elsif (exists $matrix->{default} and exists $matrix->{default}{$code_category}) {
        return $matrix->{default}{$code_category};
    }

    return 'log';
}

sub _fetch_messages {
    my ($self, $filter) = @_;
    my $messages = [ ];
    my $fetched_count = 0;
    # check if expecting to fetch more using result paging
    my ($decoded_response);
    if ($self->_next_fetch_url) {
        my $response = $self->_client->get_request_by_url($self->_next_fetch_url);
        unless ($response->is_success) {
            if ($self->_check_matrix('_fetch_messages', $response->code) ne 'ignore') {
                warn "failed to fetch messages " . $response->status_line;
                warn "response from server : " . $response->content if $self->debug;
            }

            $self->_have_messages_to_fetch(0);
            return 0;
        }
        $decoded_response = decode_json( $response->content );
    } else {
        my $fields = [qw(id subject sender isRead sentDateTime toRecipients parentFolderId categories)];
        $decoded_response = $self->_get_message_list($fields, $filter);
    }

    $messages = $decoded_response->{value};
    if ($decoded_response->{'@odata.nextLink'}) {
        $self->_next_fetch_url($decoded_response->{'@odata.nextLink'});
        $self->_have_messages_to_fetch(1);
    } else {
        $self->_have_messages_to_fetch(0);
    }
    $self->_fetched_messages($messages);
    return $fetched_count;
}

sub _get_message_list {
    my ($self, $fields, $filter) = @_;

    my $folder = $self->get_folder_details;
    unless ($folder) {
        die "unable to fetch messages, can't find folder " . $self->folder;
    }

    # don't request list if folder has no items
    unless ($folder->{totalItemCount} > 0) {
        return { '@odata.count' => 0, value => [ ] };
    }
    $filter ||= $self->_get_message_filters;

    #TODO: handle filtering multiple folders using filters
    my @path_parts = ($self->global_access) ? ( 'users', $self->username, 'mailFolders', $folder->{id}, 'messages' ) : ( 'me', 'mailFolders', $folder->{id}, 'messages' );

    # get oldest first, filter (i.e. unread) if filter provided
    my $response = $self->_client->get_request(
        [@path_parts],
        {
            '$count' => 'true', '$orderby' => 'sentDateTime',
            ( $fields ? ('$select' => join(',',@$fields)  ) : ( )),
            ( $filter ? ('$filter' => $filter ) : ( ))
        }
    );

    unless ($response->is_success) {
        if ($self->_check_matrix('_get_message_list', $response->code) ne 'ignore') {
            warn "failed to fetch messages " . $response->status_line;
            warn "response from server : " . $response->content if $self->debug;
        }
        return { value => [ ] };
    }

    return decode_json( $response->content );
}

sub _get_message_filters {
    my $self = shift;
    #TODO: handle filtering multiple folders
    my $filters = [ ];
    if ( $self->post_fetch_action && ($self->post_fetch_action eq 'mark_message_as_read')) {
        push(@$filters, 'isRead eq false');
    }

    my $filter = join(' ', @$filters);
    return $filter;
 }

sub _build_client {
    my $self = shift;
    my $client = App::wsgetmail::MS365::Client->new( {
        client_id => $self->client_id,
        username => $self->username,
        user_password => $self->user_password,
        secret => $self->secret,
        tenant_id => $self->tenant_id,
        global_access => $self->global_access,
        debug => $self->debug,
        ( defined $self->resource_url       ? ( resource_url   => $self->resource_url )   : () ),
        ( defined $self->login_base_url ? ( login_base_url => $self->login_base_url ) : () ),
    } );
    return $client;

}

=head1 AUTHOR

Best Practical Solutions, LLC <modules@bestpractical.com>

=head1 LICENSE AND COPYRIGHT

This software is Copyright (c) 2020 by Best Practical Solutions, LLC.

This is free software, licensed under:

The GNU General Public License, Version 2, June 1991

=cut

1;



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