BxInvDb.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. <?php defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup Invites Invites
  7. * @ingroup UnaModules
  8. *
  9. * @{
  10. */
  11. class BxInvDb extends BxDolModuleDb
  12. {
  13. protected $_oConfig;
  14. protected $_sTableInvites;
  15. protected $_sTableRequests;
  16. /*
  17. * Constructor.
  18. */
  19. function __construct(&$oConfig)
  20. {
  21. parent::__construct($oConfig);
  22. $this->_oConfig = $oConfig;
  23. $CNF = $oConfig->CNF;
  24. $this->_sTableInvites = $CNF['TABLE_INVITES'];
  25. $this->_sTableRequests = $CNF['TABLE_REQUESTS'];
  26. }
  27. public function getInvites($aParams, $bReturnCount = false)
  28. {
  29. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  30. $sSelectClause = $sJoinClause = $sWhereClause = $sOrderClause = $sLimitClause = "";
  31. $sSelectClause = "`{$this->_sTableInvites}`.*";
  32. switch($aParams['type']) {
  33. case 'count_by_account':
  34. $aMethod['name'] = 'getOne';
  35. $aMethod['params'][1] = array(
  36. 'account_id' => $aParams['value']
  37. );
  38. $sSelectClause = "COUNT(`{$this->_sTableInvites}`.`id`) AS `count`";
  39. $sWhereClause = "AND `{$this->_sTableInvites}`.`account_id`=:account_id ";
  40. $sLimitClause = "LIMIT 1";
  41. break;
  42. case 'count_by_request':
  43. $aMethod['name'] = 'getOne';
  44. $aMethod['params'][1] = array(
  45. 'request_id' => $aParams['value']
  46. );
  47. $sSelectClause = "COUNT(`{$this->_sTableInvites}`.`id`) AS `count`";
  48. $sWhereClause = "AND `{$this->_sTableInvites}`.`request_id`=:request_id ";
  49. $sLimitClause = "LIMIT 1";
  50. break;
  51. case 'account_by_request':
  52. $aMethod['name'] = 'getOne';
  53. $aMethod['params'][1] = array(
  54. 'request_id' => $aParams['value']
  55. );
  56. $sSelectClause = "MAX(`{$this->_sTableInvites}`.`joined_account_id`)";
  57. $sWhereClause = "AND joined_account_id IS NOT NULL AND `{$this->_sTableInvites}`.`request_id`=:request_id ";
  58. $sLimitClause = "LIMIT 1";
  59. break;
  60. case 'profile_id_by_joined_account_id':
  61. $aMethod['name'] = 'getOne';
  62. $aMethod['params'][1] = array(
  63. 'joined_account_id' => $aParams['value']
  64. );
  65. $sSelectClause = "MAX(`{$this->_sTableInvites}`.`profile_id`)";
  66. $sWhereClause = "AND `{$this->_sTableInvites}`.`joined_account_id`=:joined_account_id ";
  67. $sLimitClause = "LIMIT 1";
  68. break;
  69. case 'date_joined_by_request':
  70. $aMethod['name'] = 'getOne';
  71. $aMethod['params'][1] = array(
  72. 'request_id' => $aParams['value']
  73. );
  74. $sSelectClause = "MAX(`{$this->_sTableInvites}`.`date_joined`)";
  75. $sWhereClause = "AND joined_account_id IS NOT NULL AND `{$this->_sTableInvites}`.`request_id`=:request_id ";
  76. $sLimitClause = "LIMIT 1";
  77. break;
  78. case 'invites_code_by_single':
  79. $aMethod['name'] = 'getOne';
  80. $aMethod['params'][1] = array(
  81. 'keyvalue' => $aParams['value']
  82. );
  83. $sSelectClause = "GROUP_CONCAT(`{$this->_sTableInvites}`.`key` SEPARATOR ',')";
  84. $sWhereClause = "AND `{$this->_sTableInvites}`.`request_id` IN (SELECT `request_id` FROM `{$this->_sTableInvites}` WHERE `key`=:keyvalue ) ";
  85. $sLimitClause = "";
  86. break;
  87. case 'by_key':
  88. $aMethod['name'] = 'getRow';
  89. $aMethod['params'][1] = [
  90. 'key' => $aParams['key']
  91. ];
  92. $sWhereClause = "AND `{$this->_sTableInvites}`.`key`=:key ";
  93. $sLimitClause = "LIMIT 1";
  94. break;
  95. case 'by_joined_account_id':
  96. $aMethod['name'] = 'getRow';
  97. $aMethod['params'][1] = [
  98. 'account_id' => $aParams['account_id']
  99. ];
  100. $sWhereClause = "AND `{$this->_sTableInvites}`.`joined_account_id`=:account_id ";
  101. $sLimitClause = "LIMIT 1";
  102. break;
  103. case 'all':
  104. $aMethod['name'] = 'getAll';
  105. $aMethod['params'][1] = array(
  106. 'request_id' => $aParams['value']
  107. );
  108. $sWhereClause = "AND `{$this->_sTableInvites}`.`request_id`=:request_id ";
  109. break;
  110. }
  111. $sSql = "SELECT {select} FROM `{$this->_sTableInvites}` " . $sJoinClause . " WHERE 1 " . $sWhereClause . " {order} {limit}";
  112. $aMethod['params'][0] = str_replace(array('{select}', '{order}', '{limit}'), array($sSelectClause, $sOrderClause, $sLimitClause), $sSql);
  113. $aEntries = call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  114. if(!$bReturnCount)
  115. return $aEntries;
  116. $aMethod['name'] = 'getOne';
  117. $aMethod['params'][0] = str_replace(array('{select}', '{order}', '{limit}'), array("COUNT(*)", "", ""), $sSql);
  118. return array($aEntries, (int)call_user_func_array(array($this, $aMethod['name']), $aMethod['params']));
  119. }
  120. public function deleteInvites($aParams)
  121. {
  122. $sSql = "DELETE FROM `{$this->_sTableInvites}` WHERE " . $this->arrayToSQL($aParams, " AND ");
  123. return $this->query($sSql);
  124. }
  125. public function deleteInvitesByAccount($aParams)
  126. {
  127. $sSql = "DELETE FROM `{$this->_sTableInvites}` WHERE " . $this->arrayToSQL($aParams, " AND ");
  128. return $this->query($sSql);
  129. }
  130. public function attachInviteToRequest($iReqestId, $iInviteId)
  131. {
  132. $aBindings = array(
  133. 'request_id' => $iReqestId,
  134. 'id' => $iInviteId
  135. );
  136. $this->query("UPDATE `{$this->_sTableInvites}` SET request_id=:request_id WHERE `id`=:id", $aBindings);
  137. $this->updateRequestStatusByRequestId(1, $iReqestId);
  138. }
  139. public function attachAccountIdToInvite($iAccountId, $sKey)
  140. {
  141. $this->query("UPDATE `{$this->_sTableInvites}` SET `joined_account_id`=:joined_account_id, `date_joined`=:date_joined WHERE `key`=:keyvalue", [
  142. 'joined_account_id' => $iAccountId,
  143. 'keyvalue' => $sKey,
  144. 'date_joined' => time(),
  145. ]);
  146. $this->updateRequestStatusByInviteCode(3, $sKey);
  147. }
  148. public function updateDateSeenForInvite($sKey)
  149. {
  150. $this->query("UPDATE `{$this->_sTableInvites}` SET `date_seen`=:date_seen WHERE `key`=:keyvalue", [
  151. 'date_seen' => time(),
  152. 'keyvalue' => $sKey
  153. ]);
  154. $this->updateRequestStatusByInviteCode(2, $sKey);
  155. }
  156. public function insertInvite($aInvite)
  157. {
  158. return $this->query("INSERT INTO `{$this->_sTableInvites}` SET " . $this->arrayToSQL($aInvite)) !== false ? (int)$this->lastId() : false;
  159. }
  160. public function getRequests($aParams, $bReturnCount = false)
  161. {
  162. $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
  163. $sSelectClause = $sWhereClause = $sJoinClause = $sOrderClause = $sLimitClause = "";
  164. $sSelectClause = "`{$this->_sTableRequests}`.* ";
  165. switch($aParams['type']) {
  166. case 'by_id':
  167. $aMethod['name'] = 'getRow';
  168. $aMethod['params'][1] = array(
  169. 'id' => $aParams['value']
  170. );
  171. $sWhereClause = "AND `{$this->_sTableRequests}`.`id`=:id ";
  172. $sLimitClause = "LIMIT 1";
  173. break;
  174. case 'count_all':
  175. $aMethod['name'] = 'getOne';
  176. $sSelectClause = "COUNT(`{$this->_sTableRequests}`.`id`) AS `count`";
  177. break;
  178. case 'count_by_email':
  179. $aMethod['name'] = 'getOne';
  180. $sSelectClause = "COUNT(`{$this->_sTableRequests}`.`id`) AS `count`";
  181. $aMethod['params'][1] = array(
  182. 'email' => $aParams['value']
  183. );
  184. $sWhereClause = "AND `{$this->_sTableRequests}`.`email`=:email ";
  185. break;
  186. }
  187. $sSql = "SELECT {select} FROM `{$this->_sTableRequests}` " . $sJoinClause . " WHERE 1 " . $sWhereClause . " {order} {limit}";
  188. $aMethod['params'][0] = str_replace(array('{select}', '{order}', '{limit}'), array($sSelectClause, $sOrderClause, $sLimitClause), $sSql);
  189. $aEntries = call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
  190. if(!$bReturnCount)
  191. return $aEntries;
  192. $aMethod['name'] = 'getOne';
  193. $aMethod['params'][0] = str_replace(array('{select}', '{order}', '{limit}'), array("COUNT(*)", "", ""), $sSql);
  194. return array($aEntries, (int)call_user_func_array(array($this, $aMethod['name']), $aMethod['params']));
  195. }
  196. public function getDataForCharts($iDateFrom, $iDateTo, $isInvited = false)
  197. {
  198. $aBindings = array(
  199. 'datefrom' => $iDateFrom,
  200. 'dateto' => $iDateTo
  201. );
  202. $sQuery = "SELECT DATE(FROM_UNIXTIME(`date`)) AS `period`, YEAR(FROM_UNIXTIME(`date`)) AS `year`, COUNT(*) AS `count` FROM `" . $this->_sTableInvites . "` WHERE `date` >= :datefrom AND `date` <= :dateto " . $this->getAddSqlForCharts($isInvited) . " GROUP BY `period`, `year` ORDER BY `year`, `period` ASC";
  203. return $this->getAll($sQuery, $aBindings);
  204. }
  205. public function getInitValueForCharts($iDateFrom, $isInvited = false)
  206. {
  207. $aBindings = array(
  208. 'datefrom' => $iDateFrom
  209. );
  210. $sQuery = "SELECT COUNT(*) AS `count` FROM " . $this->_sTableInvites . " WHERE `date` < :datefrom " . $this->getAddSqlForCharts($isInvited);
  211. return $this->getOne($sQuery, $aBindings);
  212. }
  213. private function getAddSqlForCharts($isInvited)
  214. {
  215. $sSqlAdd = "";
  216. if ($isInvited){
  217. $sSqlAdd = " AND `joined_account_id` IS NOT NULL ";
  218. }
  219. return $sSqlAdd;
  220. }
  221. private function updateRequestStatusByRequestId($iStatus, $iReqestId)
  222. {
  223. $aBindings = array(
  224. 'request_id' => $iReqestId,
  225. 'status' => $iStatus
  226. );
  227. $this->query("UPDATE `{$this->_sTableRequests}` SET `status`=:status WHERE `id`=:request_id AND `status` < :status", $aBindings);
  228. }
  229. private function updateRequestStatusByInviteCode($iStatus, $sKey)
  230. {
  231. $iReqestId = $this->getOne("SELECT request_id FROM `{$this->_sTableInvites}` WHERE `key`=:keyvalue", array('keyvalue' => $sKey));
  232. if ($iReqestId != "")
  233. $this->updateRequestStatusByRequestId($iStatus, $iReqestId);
  234. }
  235. }
  236. /** @} */