UserMsgsStorageAcl.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. Lib::loadClass('Core_AclSimpleSchemaBase');
  3. Lib::loadClass('ParseOgcFilter');
  4. class Schema_UserMsgsStorageAcl extends Core_AclSimpleSchemaBase {
  5. // select m.*
  6. // `ID` int(11) NOT NULL AUTO_INCREMENT,
  7. // `idReplyTo` int(11) NOT NULL DEFAULT '0',
  8. // `idThread` int(11) NOT NULL DEFAULT '0',
  9. // `app_className` varchar(255) DEFAULT NULL,
  10. // `msg` varchar(1000) NOT NULL,
  11. // `msgType` enum('info','danger','warning','success') NOT NULL DEFAULT 'info',
  12. // `uiTargetType` enum('default_db_table','default_db_table_record','after_login','everywhere') NOT NULL,
  13. // `uiTargetName` varchar(255) NOT NULL DEFAULT '',
  14. // `userTargetType` enum('none','everyone','admin','user','group') NOT NULL DEFAULT 'none',
  15. // `userTargetName` varchar(255) NOT NULL DEFAULT '',
  16. // `actionExecutedTime` datetime DEFAULT NULL,
  17. // `actionNotes` varchar(255) NOT NULL DEFAULT '',
  18. // `A_STATUS` enum('WAITING','NORMAL','OFF_HARD','DELETED') NOT NULL DEFAULT 'WAITING',
  19. // `A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
  20. // `A_RECORD_CREATE_AUTHOR` varchar(40) NOT NULL DEFAULT '',
  21. // `A_RECORD_UPDATE_DATE` datetime DEFAULT NULL,
  22. // `A_RECORD_UPDATE_AUTHOR` varchar(40) NOT NULL DEFAULT '',
  23. // `A_RECORD_DELETE_DATE` datetime DEFAULT NULL,
  24. // `A_RECORD_DELETE_AUTHOR` varchar(40) NOT NULL DEFAULT '',
  25. // PRIMARY KEY (`ID`),
  26. // KEY `app_className` (`app_className`),
  27. // KEY `A_STATUS` (`A_STATUS`),
  28. // KEY `A_RECORD_UPDATE_DATE` (`A_RECORD_UPDATE_DATE`)
  29. // from `CRM_UI_MSGS` m
  30. // where m.`uiTargetType`='default_db_table_record'
  31. // -- and m.`uiTargetName`='.'
  32. // and (
  33. // m.`userTargetType` in('everyone')
  34. // or (m.`userTargetType`='user' and m.`userTargetName`='plabudda')
  35. // or (m.`userTargetType`='group' and m.`userTargetName` in(94,4495,1767,2948,2975,13069,21168,12887,22017,20046,11875,20906,79,22720,26118,26522,26498,26519,26623,26532,26119,26529,26497,27324,289,288,270,13,20540))
  36. // )
  37. // and m.`A_STATUS` in('WAITING', 'NORMAL')
  38. // order by m.`ID` DESC
  39. // limit 21
  40. public $_simpleSchema = [
  41. 'root' => [
  42. '@namespace' => 'default_objects/UserMsgs',
  43. 'ID' => [ '@type' => 'xsd:integer' ],
  44. 'idReplyTo' => [ '@type' => 'xsd:integer' ],
  45. 'idThread' => [ '@type' => 'xsd:integer' ],
  46. 'app_className' => [ '@type' => 'xsd:string' ],
  47. 'msg' => [ '@type' => 'xsd:string' ],
  48. 'msgType' => [ '@type' => 'xsd:string' ], // enum('info','danger','warning','success') NOT NULL DEFAULT 'info',
  49. 'uiTargetType' => [ '@type' => 'xsd:string' ], // enum('default_db_table','default_db_table_record','after_login','everywhere') NOT NULL,
  50. 'uiTargetName' => [ '@type' => 'xsd:string' ],
  51. 'userTargetType' => [ '@type' => 'xsd:string' ], // enum('none','everyone','admin','user','group') NOT NULL DEFAULT 'none',
  52. 'userTargetName' => [ '@type' => 'xsd:string' ],
  53. 'actionExecutedTime' => [ '@type' => 'xsd:date' ],
  54. 'actionNotes' => [ '@type' => 'xsd:string' ],
  55. 'A_STATUS' => [ '@type' => 'xsd:string' ], // enum('WAITING','NORMAL','OFF_HARD','DELETED') NOT NULL DEFAULT 'WAITING',
  56. 'actionNotes' => [ '@type' => 'xsd:string' ],
  57. 'autor' => [ '@type' => 'xsd:string', '@alias' => 'A_RECORD_CREATE_AUTHOR' ],
  58. 'utworzono' => [ '@type' => 'xsd:date', '@alias' => 'A_RECORD_CREATE_DATE' ],
  59. 'zaktualizował' => [ '@type' => 'xsd:string', '@alias' => 'A_RECORD_UPDATE_AUTHOR' ],
  60. 'zaktualizowano' => [ '@type' => 'xsd:date', '@alias' => 'A_RECORD_UPDATE_DATE' ],
  61. 'usunął' => [ '@type' => 'xsd:string', '@alias' => 'A_RECORD_DELETE_AUTHOR' ],
  62. 'usunięto' => [ '@type' => 'xsd:date', '@alias' => 'A_RECORD_DELETE_DATE' ],
  63. // 'custom_field_name' => [ '@type' => 'p5:www_link' ],
  64. ]
  65. ];
  66. public $_rootTableName = 'CRM_UI_MSGS';
  67. public $idUser = null;
  68. public $login = null;
  69. public function __construct($simpleSchema = null) {
  70. parent::__construct($simpleSchema);
  71. $this->idUser = User::getID(); // default - current user
  72. $this->login = User::getLogin();
  73. }
  74. public function setIdUser($idUser) { $this->idUser = intval($idUser); }
  75. public function getIdUser() { return $this->idUser; }
  76. public function getTotal($params = []) {
  77. $sqlWhereAnd = $this->_parseSqlWhere($params);
  78. $idGroupList = $this->_getUserIdGroupList();
  79. if (empty($idGroupList)) throw new Exception("Brak przypisanych grup do użytkownika");
  80. $sqlIdGroupsCsv = implode(",", $idGroupList);
  81. return DB::getPDO()->fetchValue("
  82. select count(1) as total
  83. from `CRM_UI_MSGS` m
  84. where m.`uiTargetType` = 'default_db_table_record'
  85. -- and m.`uiTargetName` = '.'
  86. and (
  87. m.`userTargetType` in('everyone')
  88. or ( m.`userTargetType`='user' and m.`userTargetName` = :login )
  89. or ( m.`userTargetType`='group' and m.`userTargetName` in( {$sqlIdGroupsCsv} ) )
  90. )
  91. and m.`A_STATUS` in('WAITING', 'NORMAL')
  92. {$sqlWhereAnd}
  93. ", [
  94. ':login' => $this->login,
  95. ]);
  96. }
  97. public function _parseSqlWhere($params = []) {
  98. $sqlWhereAnd = "";
  99. // TODO: parse where/ogc, etc.
  100. return $sqlWhereAnd;
  101. }
  102. public function getItems($params = []) {
  103. $sqlOrderBy = "";
  104. $sqlLimitOffset = "";
  105. $sqlWhereAnd = $this->_parseSqlWhere($params);
  106. $currSortCol = V::get('order_by', 'ID', $params);
  107. $currSortFlip = strtolower(V::get('order_dir', 'desc', $params));
  108. // TODO: validate $currSortCol is in field list
  109. // TODO: validate $currSortFlip ('asc' or 'desc')
  110. $aliasMap = array();
  111. foreach ($this->_simpleSchema['root'] as $key => $field) {
  112. if ('@' === substr($key, 0, 1)) continue;
  113. $aliasMap[ $key ] = (!empty($field['@alias'])) ? $field['@alias'] : $key;
  114. }
  115. // TODO: if (!array_key_exists($currSortCol, $aliasMap)) throw new Exception("field name not allowed to sort");
  116. $currSortCol = (array_key_exists($currSortCol, $aliasMap)) ? $aliasMap[$currSortCol] : null;
  117. if (!empty($currSortCol) && ('asc' == $currSortFlip || 'desc' == $currSortFlip)) {
  118. $sqlOrderBy = "order by m.`{$currSortCol}` {$currSortFlip}";
  119. }
  120. $limit = V::get('limit', 0, $params);
  121. $limit = ($limit < 0) ? 0 : $limit;
  122. $offset = V::get('limitstart', 0, $params);
  123. $offset = ($offset < 0) ? 0 : $offset;
  124. if ($limit > 0) $sqlLimitOffset = "limit {$limit} offset {$offset}";
  125. $idGroupList = $this->_getUserIdGroupList();
  126. if (empty($idGroupList)) throw new Exception("Brak przypisanych grup do użytkownika");
  127. $sqlIdGroupsCsv = implode(",", $idGroupList);
  128. $items = DB::getPDO()->fetchAllByKey("
  129. select m.ID
  130. , m.idReplyTo
  131. , m.idThread
  132. , m.app_className
  133. , m.msg
  134. , m.msgType
  135. , m.uiTargetType
  136. , m.uiTargetName
  137. , m.userTargetType
  138. , m.userTargetName
  139. , m.actionExecutedTime
  140. , m.actionNotes
  141. , m.A_STATUS
  142. , m.actionNotes
  143. , m.A_RECORD_CREATE_AUTHOR as `autor`
  144. , m.A_RECORD_CREATE_DATE as `utworzono`
  145. , m.A_RECORD_UPDATE_AUTHOR as `zaktualizował`
  146. , m.A_RECORD_UPDATE_DATE as `zaktualizowano`
  147. , m.A_RECORD_DELETE_AUTHOR as `usunął`
  148. , m.A_RECORD_DELETE_DATE as `usunięto`
  149. from `CRM_UI_MSGS` m
  150. where m.`uiTargetType` = 'default_db_table_record'
  151. -- and m.`uiTargetName` = '.'
  152. and (
  153. m.`userTargetType` in('everyone')
  154. or ( m.`userTargetType`='user' and m.`userTargetName` = :login )
  155. or ( m.`userTargetType`='group' and m.`userTargetName` in( {$sqlIdGroupsCsv} ) )
  156. )
  157. and m.`A_STATUS` in('WAITING', 'NORMAL')
  158. {$sqlWhereAnd}
  159. {$sqlOrderBy}
  160. {$sqlLimitOffset}
  161. ", 'ID', [
  162. ':login' => $this->login,
  163. ]);
  164. // array_walk($items, function (&$item, $key) {
  165. // $item['link_uruchom_filtr_procesu'] = Request::getPathUri() . "index.php?FUNCTION_INIT=MENU_SELECT_PROCES&_action=setPermsByProces&id_proces={$item['ID']}";
  166. // });
  167. return $items;
  168. }
  169. public function _getUserIdGroupList() {
  170. return array_map(
  171. function ($row) {
  172. return $row['ID'];
  173. }
  174. , DB::getPDO()->fetchAll("
  175. select z.ID
  176. from `CRM_AUTH_PROFILE` as up
  177. left join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=up.`ID_ZASOB`)
  178. where
  179. up.`REMOTE_ID`='{$this->idUser}'
  180. and up.`A_STATUS` in('WAITING', 'NORMAL')
  181. and up.`REMOTE_TABLE`='ADMIN_USERS'
  182. and z.`ID` is not null
  183. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  184. ")
  185. );
  186. }
  187. }