PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/app/modules/chat/common/models/ChatMessage.php

https://bitbucket.org/lasalut/dating
PHP | 245 lines | 187 code | 20 blank | 38 comment | 9 complexity | 5c6d746e2c6540263acb48e134288802 MD5 | raw file
Possible License(s): BSD-3-Clause, MIT, 0BSD
  1. <?php
  2. namespace modules\chat\common\models;
  3. use modules\profiles\common\models\Profile;
  4. use Yii;
  5. use yii\behaviors\TimestampBehavior;
  6. use yii\db\Expression;
  7. use yii\db\Query;
  8. use yz\interfaces\ModelInfoInterface;
  9. /**
  10. * This is the model class for table "yz_chat_messages".
  11. *
  12. * @property integer $id
  13. * @property string $message
  14. * @property integer $from_id
  15. * @property integer $to_id
  16. * @property string $created_at
  17. * @property string $updated_at
  18. * @property string $model
  19. * @property integer $removed
  20. * @property boolean $readed
  21. * @property boolean $winked
  22. */
  23. class ChatMessage extends \yii\db\ActiveRecord implements ModelInfoInterface
  24. {
  25. /**
  26. * @inheritdoc
  27. */
  28. public static function tableName()
  29. {
  30. return '{{%chat_messages}}';
  31. }
  32. /**
  33. * Returns model title, ex.: 'Person', 'Book'
  34. *
  35. * @return string
  36. */
  37. public static function modelTitle()
  38. {
  39. return 'Сообщение чата';
  40. }
  41. /**
  42. * Returns plural form of the model title, ex.: 'Persons', 'Books'
  43. *
  44. * @return string
  45. */
  46. public static function modelTitlePlural()
  47. {
  48. return 'Сообщения чата';
  49. }
  50. public function behaviors()
  51. {
  52. return [
  53. 'timestamp' => [
  54. 'class' => TimestampBehavior::className(),
  55. 'value' => new Expression('NOW()'),
  56. ],
  57. ];
  58. }
  59. /**
  60. * @inheritdoc
  61. */
  62. public function rules()
  63. {
  64. return [
  65. ['message', 'string'],
  66. ['from_id', 'integer'],
  67. ['to_id', 'integer'],
  68. ['created_at', 'safe'],
  69. ['updated_at', 'safe'],
  70. ['model', 'string', 'max' => 10],
  71. ['removed', 'safe'],
  72. ['readed', 'safe'],
  73. ['winked', 'safe'],
  74. ];
  75. }
  76. /**
  77. * @inheritdoc
  78. */
  79. public function attributeLabels()
  80. {
  81. return [
  82. 'id' => 'ID',
  83. 'message' => 'Сообщение',
  84. 'from_id' => 'От',
  85. 'to_id' => 'Кому',
  86. 'created_at' => 'Отправлено',
  87. 'updated_at' => 'Обновлено',
  88. 'model' => 'Модель',
  89. 'removed' => 'Удалено',
  90. 'readed' => 'Прочитано',
  91. 'winked' => 'Подмигнул',
  92. ];
  93. }
  94. public function fields()
  95. {
  96. /** @var Profile $userFrom */
  97. $userFrom = Profile::findOne($this->from_id);
  98. /** @var Profile $userTo */
  99. $userTo = Profile::findOne($this->to_id);
  100. return [
  101. 'id',
  102. 'message',
  103. 'readed',
  104. 'winked',
  105. 'userFromId' => function (ChatMessage $model) use ($userFrom, $userTo) {
  106. return $userFrom->id;
  107. },
  108. 'userFromName' => function (ChatMessage $model) use ($userFrom, $userTo) {
  109. return $userFrom->name;
  110. },
  111. 'userFromAvatar' => function (ChatMessage $model) use ($userFrom, $userTo) {
  112. return $userFrom->avatar_path;
  113. },
  114. 'userFromAge' => function (ChatMessage $model) use ($userFrom, $userTo) {
  115. $now = new \DateTime('now');
  116. $birthday = new \DateTime($userFrom->birthday_on);
  117. $diff = $birthday->diff($now);
  118. return intval($diff->y);
  119. },
  120. 'userFromGender' => function (ChatMessage $model) use ($userFrom, $userTo) {
  121. return $userFrom->my_gender;
  122. },
  123. 'userToId' => function (ChatMessage $model) use ($userFrom, $userTo) {
  124. return $userTo->id;
  125. },
  126. 'userToName' => function (ChatMessage $model) use ($userFrom, $userTo) {
  127. return $userTo->name;
  128. },
  129. 'userToAvatar' => function (ChatMessage $model) use ($userFrom, $userTo) {
  130. return $userTo->avatar_path;
  131. },
  132. 'userToAge' => function (ChatMessage $model) use ($userFrom, $userTo) {
  133. $now = new \DateTime('now');
  134. $birthday = new \DateTime($userTo->birthday_on);
  135. $diff = $birthday->diff($now);
  136. return intval($diff->y);
  137. },
  138. 'userToGender' => function (ChatMessage $model) use ($userFrom, $userTo) {
  139. return $userTo->my_gender;
  140. },
  141. 'created' => 'created_at',
  142. ];
  143. }
  144. public static function findConversations($profile_id)
  145. {
  146. $conversations = [];
  147. # находим счетчик новых сообщений переписки
  148. $counters = ChatCounter::find()->where(['to_id' => $profile_id])
  149. ->indexBy('from_id')->select('counter, from_id')->column();
  150. # находим все сообщения переписки для участника
  151. $rows = (new Query())
  152. ->select('m.message, m.created_at as created, m.id, m.readed, m.winked,
  153. userFrom.id userFromId, userFrom.name userFromName, userFrom.avatar userFromAvatar,
  154. userFrom.my_gender userFromGender, userFrom.birthday_on userFromBirthday,
  155. userTo.id userToId, userTo.name userToName, userTo.avatar userToAvatar,
  156. userTo.my_gender userToGender, userTo.birthday_on userToBirthday
  157. ')
  158. ->from(['m' => ChatMessage::tableName()])
  159. ->innerJoin(['userFrom' => Profile::tableName()], 'userFrom.id = m.from_id')
  160. ->innerJoin(['userTo' => Profile::tableName()], 'userTo.id = m.to_id')
  161. ->where('userFrom.id = :userId OR userTo.id = :userId', ['userId' => $profile_id])
  162. ->orderBy(['m.created_at' => SORT_DESC])
  163. ->all();
  164. foreach ($rows as $row) {
  165. $key = ($row['userToId'] == $profile_id) ? $row['userFromId'] : $row['userToId'];
  166. if (!isset($conversations[$key])) {
  167. if ($row['userToId'] == $profile_id) {
  168. $now = new \DateTime('now');
  169. $birthday = new \DateTime($row['userFromBirthday']);
  170. $diff = $birthday->diff($now);
  171. $age = intval($diff->y);
  172. $with = [
  173. 'id' => $row['userFromId'],
  174. 'name' => $row['userFromName'],
  175. 'age' => $age,
  176. 'gender' => $row['userFromGender'],
  177. 'avatar' => empty($row['userFromAvatar'])
  178. ? ($row['userFromGender'] == 'male' ? '/images/icon_male.jpg' : '/images/icon_female.jpg')
  179. : '/data/photos/' . $row['userFromAvatar']
  180. ];
  181. }
  182. else {
  183. $now = new \DateTime('now');
  184. $birthday = new \DateTime($row['userToBirthday']);
  185. $diff = $birthday->diff($now);
  186. $age = intval($diff->y);
  187. $with = [
  188. 'id' => $row['userToId'],
  189. 'name' => $row['userToName'],
  190. 'age' => $age,
  191. 'gender' => $row['userToGender'],
  192. 'avatar' => empty($row['userToAvatar'])
  193. ? ($row['userToGender'] == 'male' ? '/images/icon_male.jpg' : '/images/icon_female.jpg')
  194. : '/data/photos/' . $row['userToAvatar']
  195. ];
  196. }
  197. $conversations[$key] = [
  198. 'w' => $with,
  199. 'lastMessage' => null,
  200. 'messages' => [],
  201. 'newMessages' => 0,
  202. ];
  203. }
  204. $conversations[$key]['messages'][] = $row;
  205. }
  206. foreach ($conversations as $userId => &$data) {
  207. $data['lastMessage'] = $data['messages'][0];
  208. $data['messages'] = array_reverse($data['messages']);
  209. }
  210. # находим счетчик новых сообщений переписки
  211. if (!empty($counters)) {
  212. foreach ($counters as $userFromId => $counter) {
  213. if (isset($conversations[$userFromId])) {
  214. $conversations[$userFromId]['newMessages'] = $counter;
  215. }
  216. }
  217. }
  218. return array_values($conversations);
  219. }
  220. public static function countByProfile(Profile $profile)
  221. {
  222. $count = self::find()->where(['readed' => false, 'to_id' => $profile->id])->count();
  223. return intval($count);
  224. }
  225. }