UserMsgsStorageAcl.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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. 'A_RECORD_CREATE_AUTHOR' => [ '@type' => 'xsd:string' ], // label: "autor"
  58. 'A_RECORD_CREATE_DATE' => [ '@type' => 'xsd:date' ], // label: "utworzono"
  59. 'A_RECORD_UPDATE_AUTHOR' => [ '@type' => 'xsd:string' ], // label: "zaktualizował"
  60. 'A_RECORD_UPDATE_DATE' => [ '@type' => 'xsd:date' ], // label: "zaktualizowano"
  61. 'A_RECORD_DELETE_AUTHOR' => [ '@type' => 'xsd:string' ], // label: "usunął"
  62. 'A_RECORD_DELETE_DATE' => [ '@type' => 'xsd:date' ], // label: "usunięto"
  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. function __construct($simpleSchema = null) {
  70. parent::__construct($simpleSchema);
  71. $this->idUser = User::getID(); // default - current user
  72. $this->login = User::getLogin();
  73. }
  74. function setIdUser($idUser) { $this->idUser = intval($idUser); }
  75. function getIdUser() { return $this->idUser; }
  76. function getTotal($params = []) {
  77. $sqlWhere = $this->_parseSqlWhere($params);
  78. return DB::getPDO()->fetchValue("
  79. select count(1) as total
  80. from `CRM_UI_MSGS` m
  81. where {$sqlWhere}
  82. ");
  83. }
  84. function _parseSqlWhere($params = []) {
  85. $sqlWhereAnd = [];
  86. $sqlWhereAnd[] = " m.`uiTargetType` = 'default_db_table_record' ";
  87. $sqlUserLogin = DB::getPDO()->quote($this->login);
  88. $idGroupList = $this->_getUserIdGroupList();
  89. if (empty($idGroupList)) throw new Exception("Brak przypisanych grup do użytkownika");
  90. $sqlIdGroupsCsv = implode(",", $idGroupList);
  91. $sqlWhereAnd[] = "
  92. (
  93. m.`userTargetType` in('everyone')
  94. or ( m.`userTargetType`='user' and m.`userTargetName` = {$sqlUserLogin} )
  95. or ( m.`userTargetType`='group' and m.`userTargetName` in( {$sqlIdGroupsCsv} ) )
  96. )
  97. ";
  98. $sqlWhereAnd[] = " m.`A_STATUS` in('WAITING', 'NORMAL') ";
  99. // TODO: parse where/ogc, etc.
  100. return implode(" and ", $sqlWhereAnd);
  101. }
  102. function getItems($params = []) {
  103. $sqlOrderBy = "";
  104. $sqlLimitOffset = "";
  105. $sqlWhere = $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. $items = DB::getPDO()->fetchAllByKey("
  126. select m.ID
  127. , m.idReplyTo
  128. , m.idThread
  129. , m.app_className
  130. , m.msg
  131. , m.msgType
  132. , m.uiTargetType
  133. , m.uiTargetName
  134. , m.userTargetType
  135. , m.userTargetName
  136. , m.actionExecutedTime
  137. , m.actionNotes
  138. , m.A_STATUS
  139. , m.actionNotes
  140. , m.A_RECORD_CREATE_AUTHOR
  141. , m.A_RECORD_CREATE_DATE
  142. , m.A_RECORD_UPDATE_AUTHOR
  143. , m.A_RECORD_UPDATE_DATE
  144. , m.A_RECORD_DELETE_AUTHOR
  145. , m.A_RECORD_DELETE_DATE
  146. from `CRM_UI_MSGS` m
  147. where {$sqlWhere}
  148. {$sqlOrderBy}
  149. {$sqlLimitOffset}
  150. ", 'ID');
  151. // array_walk($items, function (&$item, $key) {
  152. // $item['link_uruchom_filtr_procesu'] = Request::getPathUri() . "index.php?FUNCTION_INIT=MENU_SELECT_PROCES&_action=setPermsByProces&id_proces={$item['ID']}";
  153. // });
  154. return $items;
  155. }
  156. function _getUserIdGroupList() {
  157. return DB::getPDO()->fetchValuesList("
  158. select z.ID
  159. from `CRM_AUTH_PROFILE` as up
  160. left join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=up.`ID_ZASOB`)
  161. where
  162. up.`REMOTE_ID` = :id_user
  163. and up.`A_STATUS` in('WAITING', 'NORMAL')
  164. and up.`REMOTE_TABLE`='ADMIN_USERS'
  165. and z.`ID` is not null
  166. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  167. ", [
  168. ':id_user' => $this->idUser,
  169. ]);
  170. }
  171. }