[//lasso /** * Super-simple, minimum abstraction MailChimp API v3 wrapper for Lasso 8.x. * Based heavily on Drew McLellan's original version for PHP: * https://github.com/drewm/mailchimp-api * MailChimp API v3: http://developer.mailchimp.com * * :NOTE: Batch operations and webhooks are not implemented. * * @author Jason Huck * @version 1.0 */ define_type( 'mailchimp', -prototype, -description='Wraps v3 of the Mailchimp API.' ); local( 'api_key' = string, 'api_endpoint' = 'https://us1.api.mailchimp.com/', 'version' = 3.0, 'verifypeer' = true, 'request_successful' = false, 'last_error' = map( 'code' = integer, 'message' = string ), 'last_response' = map( 'headers' = null, 'body' = null ), 'last_request' = map( 'headers' = null, 'body' = null ) ); define_tag( 'oncreate', -req='key', -type='string', -opt='version', -type='decimal', -opt='verifypeer', -type='boolean' ); self->'api_key' = #key; local('data_center') = string(self->'api_key')->split('-')->second; self->'api_endpoint' = (self->'api_endpoint')->replace('us1', #data_center)&; local_defined('version') ? self->'version' = #version; local_defined('verifypeer') ? self->'verifypeer' = #verifypeer; /define_tag; // use this to generate a subscriber hash when editing a list member define_tag('subscriberHash', -req='email'); return(encrypt_md5(string(#email)->lowercase&)); /define_tag; define_tag('success'); return(self->'request_successful'); /define_tag; define_tag('getLastError'); return(self->'last_error'); /define_tag; define_tag('getLastResponse'); return(self->'last_response'); /define_tag; define_tag('getLastRequest'); return(self->'last_request'); /define_tag; define_tag( 'delete', -req='method', -type='string', -opt='args', -type='map', -opt='timeout', -type='integer' ); !local_defined('args') ? local('args') = map; !local_defined('timeout') ? local('timeout') = 10; return(self->makeRequest('DELETE', #method, #args, #timeout)); /define_tag; define_tag( 'get', -req='method', -type='string', -opt='args', -type='map', -opt='timeout', -type='integer' ); !local_defined('args') ? local('args') = map; !local_defined('timeout') ? local('timeout') = 10; return(self->makeRequest('GET', #method, #args, #timeout)); /define_tag; define_tag( 'patch', -req='method', -type='string', -opt='args', -type='map', -opt='timeout', -type='integer' ); !local_defined('args') ? local('args') = map; !local_defined('timeout') ? local('timeout') = 10; return(self->makeRequest('PATCH', #method, #args, #timeout)); /define_tag; define_tag( 'post', -req='method', -type='string', -opt='args', -type='map', -opt='timeout', -type='integer' ); !local_defined('args') ? local('args') = map; !local_defined('timeout') ? local('timeout') = 10; return(self->makeRequest('POST', #method, #args, #timeout)); /define_tag; define_tag( 'put', -req='method', -type='string', -opt='args', -type='map', -opt='timeout', -type='integer' ); !local_defined('args') ? local('args') = map; !local_defined('timeout') ? local('timeout') = 10; return(self->makeRequest('PUT', #method, #args, #timeout)); /define_tag; define_tag( 'makeRequest', -req='http_verb', -type='string', -req='method', -type='string', -opt='args', -type='map', -opt='timeout', -type='integer' ); !local_defined('args') ? local('args') = map; !local_defined('timeout') ? local('timeout') = 10; local('url') = self->'api_endpoint' + self->'version' + (!#method->beginswith('/') ? '/') + #method; self->'last_error' = map( 'code' = integer, 'message' = string ); self->'request_successful' = false; self->'last_response' = map('headers' = null, 'body' = null); local('headers') = array( 'Accept' = 'application/vnd.api+json', 'Content-Type' = 'application/vnd.api+json', 'Authorization' = 'apikey ' + self->'api_key', 'User-Agent' = 'Lasso ' + lasso_version ); #http_verb != 'GET' ? #headers->insert('X-HTTP-Method-Override' = #http_verb); self->'last_request' = map( 'method' = #http_verb, 'path' = #method, 'url' = #url, 'headers' = #headers, 'body' = '', 'timeout' = #timeout ); protect; handle_error; self->'request_successful' = false; if(local_defined('result') && #result->find('status')); local('msg') = #result->find('status'); #result->find('detail') ? #msg += ': ' + #result->find('detail'); self->'last_error' = map( 'code' = error_code, 'message' = #msg ); else; self->'last_error' = map( 'code' = error_code, 'message' = error_msg ); local('result') = false; /if; /handle_error; if(#http_verb == 'GET'); local('body') = #args; local('request_params') = array( #url, -getparams=#args, -sendmimeheaders=#headers, -retrievemimeheaders='response_headers', -timeout=#timeout, -connecttimeout=#timeout ); else; local('body') = encode_json(#args); local('request_params') = array( #url, -postparams=#body, -sendmimeheaders=#headers, -retrievemimeheaders='response_headers', -timeout=#timeout, -connecttimeout=#timeout ); /if; self->'verifypeer' ? #request_params->insert( -verifypeer); local('request') = \include_url->run( -params=#request_params); self->'last_error' = map( 'code' = error_code, 'message' = error_msg ); local('result') = decode_json(#request); self->'request_successful' = true; /protect; self->'last_request'->find('body') = #body; self->'last_response'->find('headers') = $response_headers; self->'last_response'->find('body') = #result; return(#result); /define_tag; /define_type; ]