PageRenderTime 25ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/archive/api-examples-v2/php/VolunteerMatchAPI.php

https://github.com/volunteermatch/vm-contrib
PHP | 258 lines | 191 code | 34 blank | 33 comment | 24 complexity | 75ad26332dc817bc8bc5e9065e7b6660 MD5 | raw file
  1. <?php
  2. /**
  3. * Defines a static class for managing communication through VM API v2
  4. * @author Sharon Paisner
  5. */
  6. class VolunteerMatchAPI {
  7. private static $path;
  8. private static $key;
  9. private static $username;
  10. private static $lastHeaders;
  11. private static $lastResponse;
  12. public function init($vmPath, $vmKey, $vmUsername) {
  13. self::$path = $vmPath;
  14. self::$key = $vmKey;
  15. self::$username = $vmUsername;
  16. }
  17. private function sendRequest($action, $query = NULL, $type = 'GET') {
  18. $headers_string = $_COOKIE['vmapi_session_headers'];
  19. if (!empty($headers_string))
  20. self::$lastHeaders = json_decode($headers_string);
  21. if (empty(self::$lastHeaders)) {
  22. // need to recreate our headers
  23. $timestamp = time();
  24. $nonce = hash('sha1', openssl_random_pseudo_bytes(20));
  25. $date = date('Y-m-d\TH:i:sO', $timestamp);
  26. $digest = base64_encode(hash('sha256', $nonce . $date . self::$key, TRUE));
  27. $header_array = array(
  28. 'Content-Type' => 'application/json',
  29. 'Authorization' => 'WSSE profile="UsernameToken"',
  30. 'X-WSSE' =>
  31. 'UsernameToken Username="' . self::$username .
  32. '", PasswordDigest="' . $digest .
  33. '", Nonce="' . $nonce .
  34. '", Created="' . $date .
  35. '"');
  36. self::$lastHeaders = $header_array;
  37. // by default, expire headers in 10 minutes
  38. setcookie('vmapi_session_headers', json_encode(self::$lastHeaders), $timestamp + 600, '/');
  39. }
  40. $json_query = json_encode($query);
  41. //print_r($json_query);
  42. $url = self::$path;
  43. $url .= '?action=' . $action;
  44. if ($query != NULL)
  45. $url .= '&query=' . urlencode($json_query);
  46. // upon reviewing the code for this class, drupal_http_request() is the only method
  47. // dependant upon drupal. in order to make the entire class drupal-independant
  48. // we would have to use a native PHP method for sending HTTP requests.
  49. self::$lastResponse = drupal_http_request($url, self::$lastHeaders, $type);
  50. if (self::$lastResponse->code > 200)
  51. print_r(self::$lastResponse);
  52. }
  53. private function displayResponse($type = 'none') {
  54. if (self::$lastResponse->code != '200')
  55. return 'last response from VolunteerMatch had code: ' . self::$lastResponse->code;
  56. $formattedData = json_decode(self::$lastResponse->data, TRUE);
  57. switch ($type) {
  58. case 'methods':
  59. return $formattedData['methods'];
  60. case 'member detail':
  61. case 'member summary':
  62. case 'reviews detail':
  63. return self::displayArrayAsHTML($formattedData);
  64. case 'opp detail':
  65. case 'opp summary':
  66. case 'org detail':
  67. case 'org summary':
  68. default:
  69. return $formattedData;
  70. }
  71. }
  72. private function displayArrayAsHTML($arrayname,$tab="&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp",$indent=0) {
  73. $curtab ="";
  74. $returnvalues = "";
  75. while(list($key, $value) = each($arrayname)) {
  76. for($i=0; $i<$indent; $i++) {
  77. $curtab .= $tab;
  78. }
  79. if (is_array($value)) {
  80. $returnvalues .= "$curtab $key : Array: <br />$curtab{<br />\n";
  81. $returnvalues .= self::displayArrayAsHTML($value,$tab,$indent+1)."$curtab}<br />\n";
  82. }
  83. else $returnvalues .= "$curtab $key => $value<br />\n";
  84. $curtab = NULL;
  85. }
  86. return $returnvalues;
  87. }
  88. public function createOrUpdateMembers($data) {
  89. $members = array('members' => $data);
  90. self::sendRequest('createOrUpdateMembers', $members, 'POST');
  91. return self::displayResponse('member detail');
  92. }
  93. public function createOrUpdateReferrals($oppId, $data, $waitList = NULL, $invitedBy = NULL) {
  94. $referrals = array(
  95. 'oppId' => $oppId,
  96. //'waitList' => TRUE,
  97. 'referrals' => $data,
  98. );
  99. if ($waitList != NULL)
  100. $referrals['waitList'] = $waitList;
  101. if ($invitedBy != NULL)
  102. $referrals['invitedBy'] = $invitedBy;
  103. self::sendRequest('createOrUpdateReferrals', $referrals, 'POST');
  104. return self::displayResponse();
  105. }
  106. // $data should be in the form:
  107. // array(pk, pk, ... )
  108. public function getMembersDetails($data) {
  109. $members = array('members' => $data);
  110. self::sendRequest('getMembersDetails', $members);
  111. return self::displayResponse('member detail');
  112. }
  113. // $data should be in the form:
  114. // array(pk, pk, ... )
  115. public function getMembersReferrals($data) {
  116. $members = array('members' => $data);
  117. self::sendRequest('getMembersReferrals', $members);
  118. return self::displayResponse();
  119. }
  120. // $data should be in the form:
  121. // array(oppId, oppId, ...)
  122. public function getOpportunitiesReferrals($data) {
  123. $opportunities = array('opportunities' => $data);
  124. self::sendRequest('getOpportunitiesReferrals', $opportunities);
  125. return self::displayResponse();
  126. }
  127. // can display the result set in detail, or as summaries
  128. public function searchOpportunities($data, $display = 'opp summary') {
  129. $data['fieldsToDisplay'] = array();
  130. $data['fieldsToDisplay'][] = 'id';
  131. $data['fieldsToDisplay'][] = 'title';
  132. $data['fieldsToDisplay'][] = 'greatFor';
  133. $data['fieldsToDisplay'][] = 'categoryIds';
  134. $data['fieldsToDisplay'][] = 'parentOrg';
  135. $data['fieldsToDisplay'][] = 'created';
  136. $data['fieldsToDisplay'][] = 'location';
  137. if ($display != 'opp summary') {
  138. $data['fieldsToDisplay'][] = 'minimumAge';
  139. $data['fieldsToDisplay'][] = 'hasWaitList';
  140. $data['fieldsToDisplay'][] = 'volunteersNeeded';
  141. $data['fieldsToDisplay'][] = 'skillsNeeded';
  142. $data['fieldsToDisplay'][] = 'requirements';
  143. $data['fieldsToDisplay'][] = 'availability';
  144. $data['fieldsToDisplay'][] = 'referralFields';
  145. $data['fieldsToDisplay'][] = 'description';
  146. } else {
  147. $data['fieldsToDisplay'][] = 'plaintextDescription';
  148. }
  149. self::sendRequest('searchOpportunities', $data);
  150. return self::displayResponse($display);
  151. }
  152. // can display the result set in detail, or as summaries
  153. public function searchOrganizations($data, $display = 'org summary') {
  154. $data['fieldsToDisplay'] = array();
  155. $data['fieldsToDisplay'][] = 'id';
  156. $data['fieldsToDisplay'][] = 'name';
  157. $data['fieldsToDisplay'][] = 'description';
  158. $data['fieldsToDisplay'][] = 'categoryIds';
  159. $data['fieldsToDisplay'][] = 'type';
  160. $data['fieldsToDisplay'][] = 'created';
  161. $data['fieldsToDisplay'][] = 'avgRating';
  162. $data['fieldsToDisplay'][] = 'numReviews';
  163. $data['fieldsToDisplay'][] = 'location';
  164. if ($display != 'org summary') {
  165. $data['fieldsToDisplay'][] = 'imageUrl';
  166. $data['fieldsToDisplay'][] = 'mission';
  167. $data['fieldsToDisplay'][] = 'url';
  168. $data['fieldsToDisplay'][] = 'contact';
  169. } else {
  170. $data['fieldsToDisplay'][] = 'plaintextDescription';
  171. }
  172. self::sendRequest('searchOrganizations', $data);
  173. return self::displayResponse($display);
  174. }
  175. public function getOrganizationReviewsSummary($orgId) {
  176. $data = array('ids' => array($orgId),
  177. 'fieldsToDisplay' => array('avgRating', 'numReviews'));
  178. self::sendRequest('searchOrganizations', $data);
  179. return self::displayResponse('reviews summary');
  180. }
  181. public function getOrganizationReviews($orgId) {
  182. $data = array('organization' => $orgId);
  183. self::sendRequest('getOrganizationReviews', $data);
  184. return self::displayResponse('reviews detail');
  185. }
  186. // this method should be called rarely and cached! results change infrequently
  187. public function getMetaData($version = NULL) {
  188. if ($version == NULL)
  189. self::sendRequest('getMetaData');
  190. else {
  191. $query = array('version' => $version);
  192. self::sendRequest('getMetaData', $query);
  193. }
  194. return self::displayResponse();
  195. }
  196. public function getKeyStatus() {
  197. self::sendRequest('getKeyStatus');
  198. return self::displayResponse();
  199. }
  200. // API testing method - not useful to real VM data
  201. public function testing() {
  202. self::sendRequest('helloWorld', array('name' => 'sharon'));
  203. return self::displayResponse();
  204. }
  205. // returns an array of the methods available to self::$key
  206. public function getMethods() {
  207. self::getKeyStatus();
  208. return self::displayResponse('methods');
  209. }
  210. // get the last response from VM
  211. public function getLastResponse($display = 'opp summary') {
  212. return self::displayResponse($display);
  213. }
  214. }
  215. /**
  216. * example use:
  217. VolunteerMatchAPI::init('http://www.volunteermatch.org/api/call',
  218. 'abcdefghijklmnopqrstuvwxyz',
  219. 'username');
  220. $data = VolunteerMatchAPI::testing();
  221. */
  222. //?>