class WebService::Intercom types WebService::Intercom::Types {
has
'ua'
=> (
is
=>
'ro'
,
default
=>
sub
{
return
LWP::UserAgent->new() } );
has
'app_id'
=> (
is
=>
'ro'
);
has
'api_key'
=> (
is
=>
'ro'
);
Hide Show 16 lines of Pod
method user_get(Maybe[Str] :
$user_id
?,
Maybe[Str] :
$email
?,
Maybe[Str] :
$id
?) {
if
(!(
defined
(
$user_id
) xor
defined
(
$email
) xor
defined
(
$id
))) {
WebService::Intercom::Exception->throw({
message
=>
"One and only one of user_id, email or id must be defined"
});
}
my
$request
;
if
(
defined
(
$id
)) {
$request
= GET(
$self
->api_base .
'/users/'
.
$id
);
}
elsif
(
defined
(
$user_id
)) {
$request
= GET(
$self
->api_base .
'/users?user_id='
. URI::Escape::uri_escape(
$user_id
));
}
elsif
(
defined
(
$email
)) {
$request
= GET(
$self
->api_base .
'/users?email='
. URI::Escape::uri_escape(
$email
));
}
$self
->_request(
$request
);
}
Hide Show 27 lines of Pod
multi method user_create_or_update(WebService::Intercom::User
$user
) {
return
$self
->user_create_or_update(
user_id
=>
$user
->user_id,
email
=>
$user
->email,
id
=>
$user
->id,
name
=>
$user
->name,
last_seen_ip
=>
$user
->last_seen_ip,
custom_attributes
=>
$user
->custom_attributes,
last_seen_user_agent
=>
$user
->user_agent_data,
last_request_at
=>
$user
->last_request_at,
unsubscribed_from_emails
=>
$user
->unsubscribed_from_emails,
);
}
multi method user_create_or_update(Maybe[Str] :
$user_id
?,
Maybe[Str] :
$email
?,
Maybe[Str] :
$id
?,
Maybe[Int] :
$signed_up_at
?,
Str :
$name
?,
Maybe[IPAddressType] :
$last_seen_ip
?,
CustomAttributesType :
$custom_attributes
?,
Maybe[Str] :
$last_seen_user_agent
?,
HashRef :
$companies
?,
Maybe[Int] :
$last_request_at
?,
Maybe[Bool] :
$unsubscribed_from_emails
?,
Maybe[Bool] :
$update_last_request_at
?,
Maybe[Bool] :
$new_session
?) {
my
$json_content
= {
signed_up_at
=>
$signed_up_at
,
name
=>
$name
,
last_seen_ip
=>
$last_seen_ip
,
custom_attributes
=>
$custom_attributes
,
last_seen_user_agent
=>
$last_seen_user_agent
,
companies
=>
$companies
,
last_request_at
=>
$last_request_at
,
unsubscribed_from_emails
=>
$unsubscribed_from_emails
,
update_last_request_at
=>
$update_last_request_at
,
new_session
=>
$new_session
};
if
(
defined
(
$user_id
)) {
$json_content
->{user_id} =
$user_id
;
}
if
(
defined
(
$email
)) {
$json_content
->{email} =
$email
;
}
if
(
defined
(
$id
)) {
$json_content
->{id} =
$id
;
}
my
$json
= JSON::XS::encode_json(
$json_content
);
my
$request
= POST(
$self
->api_base .
'/users'
,
'Content-Type'
=>
'application/json'
,
Content
=>
$json
);
$self
->_request(
$request
);
}
Hide Show 19 lines of Pod
multi method user_delete(WebService::Intercom::User
$user
) {
return
$self
->user_delete(
user_id
=>
$user
->user_id,
id
=>
$user
->id,
email
=>
$user
->email);
}
multi method user_delete(Str :
$user_id
?,
Str :
$id
?,
Str :
$email
?) {
my
$request
;
if
(
defined
(
$id
)) {
$request
= DELETE(
$self
->api_base .
'/users/'
.
$id
);
}
elsif
(
defined
(
$user_id
)) {
$request
= DELETE(
$self
->api_base .
'/users?user_id='
. URI::Escape::uri_escape(
$user_id
));
}
elsif
(
defined
(
$email
)) {
$request
= DELETE(
$self
->api_base .
'/users?email='
. URI::Escape::uri_escape(
$email
));
}
$self
->_request(
$request
);
}
Hide Show 16 lines of Pod
multi method tag_create_or_update(WebService::Intercom::Tag
$tag
) {
return
$self
->tag_create_or_update(
name
=>
$tag
->name,
id
=>
$tag
->id);
}
multi method tag_create_or_update(Str :
$name
,
Maybe[Str] :
$id
?) {
my
$json_content
= {
name
=>
$name
,
};
if
(
defined
(
$id
)) {
$json_content
->{id} =
$id
;
}
my
$request
= POST(
$self
->api_base .
'/tags'
,
'Content-Type'
=>
'application/json'
,
Content
=> JSON::XS::encode_json(
$json_content
)
);
return
$self
->_request(
$request
);
}
Hide Show 11 lines of Pod
method tag_items(Str :
$name
,
ArrayRef[TagUserIdentifierType] :
$users
?,
ArrayRef[TagCompanyIdentifierType] :
$companies
?) {
my
$json_content
= {
name
=>
$name
,
};
if
(!(
defined
(
$users
) xor
defined
(
$companies
))) {
WebService::Intercom::Exception->throw({
message
=>
"Either users or companies must be defined as a parameter, not both and not neither"
});
}
if
(
defined
(
$users
)) {
$json_content
->{users} =
$users
;
}
elsif
(
defined
(
$companies
)) {
$json_content
->{companies} =
$companies
;
}
my
$request
= POST(
$self
->api_base .
'/tags'
,
'Content-Type'
=>
'application/json'
,
Content
=> JSON::XS::encode_json(
$json_content
)
);
return
$self
->_request(
$request
);
}
Hide Show 15 lines of Pod
multi method tag_delete(Str :
$id
) {
$self
->_request(DELETE(
$self
->api_base .
'/tags/'
.
$id
),
no_content
=> 1);
}
multi method tag_delete(WebService::Intercom::Tag
$tag
) {
return
$self
->tag_delete(
id
=>
$tag
->id);
}
Hide Show 15 lines of Pod
method note_create(Maybe[Str] :
$user_id
?,
Maybe[Str] :
$email
?,
Maybe[Str] :
$id
?,
Maybe[Str] :
$admin_id
?,
Str :
$body
) {
if
(!(
defined
(
$user_id
) xor
defined
(
$email
) xor
defined
(
$id
))) {
WebService::Intercom::Exception->throw({
message
=>
"One and only one of user_id, email or id must be defined"
});
}
my
$json_content
= {
body
=>
$body
,
};
if
(
defined
(
$user_id
)) {
$json_content
->{user}->{user_id} =
$user_id
;
}
elsif
(
defined
(
$email
)) {
$json_content
->{user}->{email} =
$email
;
}
elsif
(
defined
(
$id
)) {
$json_content
->{user}->{id} =
$id
;
}
my
$request
= POST(
$self
->api_base .
'/notes'
,
'Content-Type'
=>
'application/json'
,
Content
=> JSON::XS::encode_json(
$json_content
)
);
return
$self
->_request(
$request
);
}
Hide Show 15 lines of Pod
method event_create(Maybe[Str] :
$user_id
?,
Maybe[Str] :
$email
?,
EventNameType :
$event_name
,
Maybe[Int] :
$created_at
?,
Maybe[EventMetadataType] :
$metadata
? where { !
defined
(
$_
) ||
scalar
(
keys
%$_
) <= 5 }) {
if
(!(
defined
(
$user_id
) ||
defined
(
$email
))) {
WebService::Intercom::Exception->throw({
message
=>
"One of user_id or email must be defined"
});
}
my
$json_content
= {
event_name
=>
$event_name
,
created_at
=>
$created_at
,
};
if
(
defined
(
$user_id
)) {
$json_content
->{user_id} =
$user_id
;
}
elsif
(
defined
(
$email
)) {
$json_content
->{email} =
$email
;
}
if
(
defined
(
$metadata
)) {
$json_content
->{metadata} =
$metadata
;
}
my
$request
= POST(
$self
->api_base .
'/events'
,
'Content-Type'
=>
'application/json'
,
Content
=> JSON::XS::encode_json(
$json_content
)
);
return
$self
->_request(
$request
,
no_content
=> 1);
}
method _request(HTTP::Request
$request
, Bool :
$no_content
?) {
$request
->header(
'Accept'
,
'application/json'
);
$request
->header(
'Authorization'
=>
"Basic "
. MIME::Base64::encode_base64(
$self
->app_id .
":"
.
$self
->api_key,
''
));
my
$response
=
$self
->ua->request(
$request
);
if
(
$response
->is_success()) {
if
(!
$no_content
) {
my
$data
;
eval
{
$data
= JSON::XS::decode_json(
$response
->content());
};
if
($@) {
WebService::Intercom::Exception->throw({
message
=>
"Failed to decode JSON result for request "
.
$request
->as_string() .
"\nResult was: "
.
$response
->as_string()});
}
if
(
$data
->{type} =~ /^(user|tag|note)$/) {
return
(
"WebService::Intercom::"
.
ucfirst
($1))->new({
%$data
,
intercom
=>
$self
,
});
}
elsif
(
$data
->{type} eq
'error.list'
) {
WebService::Intercom::Exception->throw(
request_id
=>
$data
->{request_id},
message
=>
$data
->{errors}->[0]->{message},
code
=>
$data
->{errors}->[0]->{code}
);
}
else
{
WebService::Intercom::Exception->throw({
message
=>
"Unknown object type returned: $data->{type}"
});
}
}
return
;
}
else
{
if
(
$response
->header(
'Content-Type'
) =~ /json/) {
my
$data
;
eval
{
$data
= JSON::XS::decode_json(
$response
->content());
};
if
($@) {
WebService::Intercom::Exception->throw({
message
=>
"Failed to decode JSON result for request "
.
$request
->as_string() .
"\nResult was: "
.
$response
->as_string()});
}
WebService::Intercom::Exception->throw(
request_id
=>
$data
->{request_id},
message
=>
$data
->{errors}->[0]->{message},
code
=>
$data
->{errors}->[0]->{code}
);
}
}
WebService::Intercom::Exception->throw({
message
=>
"Got a bad response from request:\n"
.
$request
->as_string() .
"\nResult was: "
.
$response
->as_string()});
}
}
1;
Hide Show 86 lines of Pod