/src/api-v2/models/TalkMapper.php

https://github.com/rickogden/joind.in · PHP · 145 lines · 131 code · 12 blank · 2 comment · 9 complexity · 763821986a1471fbddb98d7cb94fb5ce MD5 · raw file

  1. <?php
  2. class TalkMapper extends ApiMapper {
  3. public function getDefaultFields() {
  4. $fields = array(
  5. 'talk_title' => 'talk_title',
  6. 'talk_description' => 'talk_desc',
  7. 'start_date' => 'date_given',
  8. 'average_rating' => 'avg_rating',
  9. 'comments_enabled' => 'comments_enabled',
  10. 'comment_count' => 'comment_count'
  11. );
  12. return $fields;
  13. }
  14. public function getVerboseFields() {
  15. $fields = array(
  16. 'talk_title' => 'talk_title',
  17. 'talk_description' => 'talk_desc',
  18. 'slides_link' => 'slides_link',
  19. 'language' => 'lang_name',
  20. 'start_date' => 'date_given',
  21. 'average_rating' => 'avg_rating',
  22. 'comments_enabled' => 'comments_enabled',
  23. 'comment_count' => 'comment_count'
  24. );
  25. return $fields;
  26. }
  27. public function getTalksByEventId($event_id, $resultsperpage, $start, $verbose = false) {
  28. $sql = $this->getBasicSQL();
  29. $sql .= ' and t.event_id = :event_id';
  30. $sql .= $this->buildLimit($resultsperpage, $start);
  31. $stmt = $this->_db->prepare($sql);
  32. $response = $stmt->execute(array(
  33. ':event_id' => $event_id
  34. ));
  35. if($response) {
  36. $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
  37. $retval = $this->transformResults($results, $verbose);
  38. return $retval;
  39. }
  40. return false;
  41. }
  42. public function transformResults($results, $verbose) {
  43. $list = parent::transformResults($results, $verbose);
  44. $host = $this->_request->host;
  45. // loop again and add links specific to this item
  46. if(is_array($list) && count($list)) {
  47. foreach($results as $key => $row) {
  48. // add speakers
  49. $list[$key]['speakers'] = $this->getSpeakers($row['ID']);
  50. $list[$key]['tracks'] = $this->getTracks($row['ID']);
  51. $list[$key]['uri'] = 'http://' . $host . '/v2/talks/' . $row['ID'];
  52. $list[$key]['verbose_uri'] = 'http://' . $host . '/v2/talks/' . $row['ID'] . '?verbose=yes';
  53. $list[$key]['website_uri'] = 'http://joind.in/talk/view/' . $row['ID'];
  54. $list[$key]['comments_uri'] = 'http://' . $host . '/v2/talks/' . $row['ID'] . '/comments';
  55. $list[$key]['verbose_comments_uri'] = 'http://' . $host . '/v2/talks/' . $row['ID'] . '/comments?verbose=yes';
  56. $list[$key]['event_uri'] = 'http://' . $host . '/v2/events/' . $row['event_id'];
  57. }
  58. if(count($list) > 1) {
  59. $list = $this->addPaginationLinks($list);
  60. }
  61. }
  62. return $list;
  63. }
  64. public function getTalkById($talk_id, $verbose = false) {
  65. $sql = $this->getBasicSQL();
  66. $sql .= ' and t.ID = :talk_id';
  67. $stmt = $this->_db->prepare($sql);
  68. $response = $stmt->execute(array("talk_id" => $talk_id));
  69. if($response) {
  70. $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
  71. $retval = $this->transformResults($results, $verbose);
  72. return $retval;
  73. }
  74. return false;
  75. }
  76. public function getBasicSQL() {
  77. $sql = 'select t.*, l.lang_name, '
  78. . '(select COUNT(ID) from talk_comments tc where tc.talk_id = t.ID) as comment_count, '
  79. . '(select ROUND(AVG(rating)) from talk_comments tc where tc.talk_id = t.ID) as avg_rating, '
  80. . 'CASE
  81. WHEN (((t.date_given - 3600*24) < '.mktime(0,0,0).') and (t.date_given + (3*30*3600*24)) > '.mktime(0,0,0).') THEN 1
  82. ELSE 0
  83. END as comments_enabled '
  84. . 'from talks t '
  85. . 'inner join events e on e.ID = t.event_id '
  86. . 'inner join lang l on l.ID = t.lang '
  87. . 'where t.active = 1 and '
  88. . 'e.active = 1 and '
  89. . '(e.pending = 0 or e.pending is NULL) and '
  90. . '(e.private <> "y" or e.private is NULL)';
  91. return $sql;
  92. }
  93. protected function getSpeakers($talk_id) {
  94. $host = $this->_request->host;
  95. $speaker_sql = 'select ts.*, user.full_name from talk_speaker ts '
  96. . 'left join user on user.ID = ts.speaker_id '
  97. . 'where ts.talk_id = :talk_id and ts.status IS NULL';
  98. $speaker_stmt = $this->_db->prepare($speaker_sql);
  99. $speaker_stmt->execute(array("talk_id" => $talk_id));
  100. $speakers = $speaker_stmt->fetchAll(PDO::FETCH_ASSOC);
  101. $retval = array();
  102. if(is_array($speakers)) {
  103. foreach($speakers as $person) {
  104. $entry = array();
  105. if($person['full_name']) {
  106. $entry['speaker_name'] = $person['full_name'];
  107. $entry['speaker_uri'] = 'http://' . $host . '/v2/users/' . $person['speaker_id'];
  108. } else {
  109. $entry['speaker_name'] = $person['speaker_name'];
  110. }
  111. $retval[] = $entry;
  112. }
  113. }
  114. return $retval;
  115. }
  116. protected function getTracks($talk_id) {
  117. $host = $this->_request->host;
  118. $track_sql = 'select et.track_name '
  119. . 'from talk_track tt '
  120. . 'inner join event_track et on et.ID = tt.track_id '
  121. . 'where tt.talk_id = :talk_id';
  122. $track_stmt = $this->_db->prepare($track_sql);
  123. $track_stmt->execute(array("talk_id" => $talk_id));
  124. $tracks = $track_stmt->fetchAll(PDO::FETCH_ASSOC);
  125. $retval = array();
  126. if(is_array($tracks)) {
  127. foreach($tracks as $track) {
  128. $retval[] = $track;
  129. }
  130. }
  131. return $retval;
  132. }
  133. }