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 )