20 private array $sonetLogGroups = [];
21 private array|
null $userAccessCodes =
null;
23 private static array $instances = [];
27 if (!array_key_exists($userId, self::$instances))
29 self::$instances[$userId] =
new self($userId);
32 return self::$instances[$userId];
35 private function __construct(
int $userId)
47 if (empty($sonetLogIds))
52 $sonetLogIds = array_unique($sonetLogIds);
60 $counters = $this->recountPosts($sonetLogIds);
63 $counters = $this->recountComments($sonetLogIds);
79 if (empty($sonetLogIds))
84 $sonetLogIds = array_unique($sonetLogIds);
95 $counters = $this->addComment($sonetLogIds);
104 private function recountPosts(
array $sonetLogIds):
array
108 foreach ($sonetLogIds as $logId)
110 $logItem = Log::getById($logId);
116 $logItemFields = $logItem->getFields();
118 if ((
int)($logItemFields[
'USER_ID'] ?? 0) === $this->userId)
123 if (!in_array($logItemFields[
'ENTITY_TYPE'] ??
null, \CSocNetAllowed::GetAllowedEntityTypes(),
true))
128 if (!$this->isItemForEveryOne($logId) && !$this->userHasAccess($logId))
133 if (!$this->isItemSeenByUser($logItemFields))
135 foreach ($this->findGroupsByLogIdAndUser($logId) as $groupId)
139 'SONET_LOG_ID' => $logId,
140 'GROUP_ID' => $groupId,
151 private function recountComments(
array $sonetLogIds):
array
155 foreach ($sonetLogIds as $logId)
157 $logItem = Log::getById($logId);
163 $logItemFields = $logItem->getFields();
164 if (!in_array($logItemFields[
'ENTITY_TYPE'] ??
null, \CSocNetAllowed::GetAllowedEntityTypes(),
true))
169 if (!$this->isItemForEveryOne($logId) && !$this->userHasAccess($logId))
174 $commentsCount = $this->isItemSeenByUser($logItemFields)
175 ? $this->getCountCommentsByLogItemAndLastDateSeen($logId, $logItemFields)
176 : $this->getCountCommentsByLogItem($logId);
178 if ($commentsCount > 0)
180 foreach ($this->findGroupsByLogIdAndUser($logId) as $groupId)
184 'SONET_LOG_ID' => $logId,
185 'GROUP_ID' => $groupId,
187 'VALUE' => $commentsCount
196 private function addPost(
array $sonetLogIds):
array
200 foreach ($sonetLogIds as $logId)
202 $logItem = Log::getById($logId);
208 $logItemFields = $logItem->getFields();
210 if ((
int)($logItemFields[
'USER_ID'] ?? 0) === $this->userId)
215 foreach ($this->findGroupsByLogIdAndUser($logId) as $groupId)
217 if ($this->isFeedSeenByUser($groupId,
new DateTime($logItemFields[
'LOG_DATE'])))
224 'SONET_LOG_ID' => $logId,
225 'GROUP_ID' => $groupId,
235 private function addComment(
array $sonetLogIds):
array
239 foreach ($sonetLogIds as $logId)
241 foreach ($this->findGroupsByLogIdAndUser($logId) as $groupId)
243 $lastTimeFeedSeen = $this->getLastTimeFeedSeen($groupId);
245 ? [
'=LOG_ID' => $logId,
'!USER_ID' =>
$this->userId,
'>LOG_DATE' => $lastTimeFeedSeen]
254 'SONET_LOG_ID' => $logId,
255 'GROUP_ID' => $groupId,
257 'VALUE' => $commentsCount
265 private function getCountCommentsByLogItemAndLastDateSeen(
int $logId,
array $logItemFields): int
267 $lastTimeSeen = $this->getContentViewByItem($logItemFields);
268 if (!isset($lastTimeSeen[
'DATE_VIEW']))
277 '!USER_ID' => $this->userId,
278 '>LOG_DATE' => $lastTimeSeen[
'DATE_VIEW']
281 new ExpressionField(
'CNT',
'COUNT(*)'),
285 return $res[
'CNT'] ?? 0;
288 private function getCountCommentsByLogItem(
int $logId): int
294 '!USER_ID' => $this->userId,
297 new ExpressionField(
'CNT',
'COUNT(*)'),
301 return $res[
'CNT'] ?? 0;
304 private function isItemSeenByUser(
array $logItemFields): bool
306 return (
bool)$this->getContentViewByItem($logItemFields);
309 private function getContentViewByItem(
array $logItemFields):
array|
false
311 $ratingTypeId =
null;
312 $ratingEntityId =
null;
314 if (!empty($logItemFields[
'RATING_ENTITY_ID']) && !empty($logItemFields[
'RATING_TYPE_ID']))
316 $ratingTypeId = $logItemFields[
'RATING_TYPE_ID'];
317 $ratingEntityId = $logItemFields[
'RATING_ENTITY_ID'];
321 $logItemFields[
'LOG_ID'] = $logItemFields[
'ID'];
322 $content = Provider::getContentId($logItemFields);
323 $ratingTypeId =
$content[
'ENTITY_TYPE'] ??
null;
324 $ratingEntityId =
$content[
'ENTITY_ID'] ??
null;
327 return UserContentViewTable::getList([
328 'select' => [
'DATE_VIEW'],
330 '=USER_ID' => $this->userId,
331 '=RATING_ENTITY_ID' => $ratingEntityId,
332 '=RATING_TYPE_ID' => $ratingTypeId
337 private function isItemForEveryOne(
int $logItemId): bool
339 foreach (LogRight::get($logItemId) as $logAccessRight)
341 if (in_array($logAccessRight, self::PUBLIC_ACCESS_CODES,
true))
350 private function userHasAccess(
int $logItemId): bool
352 $rights = LogRight::get($logItemId);
354 if ($this->userAccessCodes ===
null &&
$rights)
356 $this->userAccessCodes = [];
357 $res = UserAccessTable::getList([
358 'select' => [
'ACCESS_CODE'],
360 '=USER_ID' => $this->userId,
367 if (isset(
$access[
'ACCESS_CODE']))
369 $this->userAccessCodes[] =
$access[
'ACCESS_CODE'];
376 if (in_array($logRight, $this->userAccessCodes,
true))
385 private function findGroupsByLogIdAndUser(
int $sonetLogId):
array
387 if (!empty($this->sonetLogGroups[$sonetLogId]))
389 return $this->sonetLogGroups[$sonetLogId];
392 $this->sonetLogGroups[$sonetLogId] = [];
393 $sonetLogRights = LogRight::get($sonetLogId);
394 $userAccessCodes = array_merge(self::PUBLIC_ACCESS_CODES, [
'U' . $this->userId]);
395 foreach ($sonetLogRights as $logRight)
397 if (in_array($logRight, $userAccessCodes))
401 $this->sonetLogGroups[$sonetLogId][$commonGroupId] = $commonGroupId;
406 $query = UserAccessTable::query()
411 ->where(
'USER_ID',
'=', $this->userId)
412 ->where(
'PROVIDER_ID',
'=',
'socnetgroup')
413 ->whereIn(
'ACCESS_CODE', $sonetLogRights)
416 foreach (
$query->fetchAll() as $group)
419 preg_match(
'/SG([0-9]+)/m', $group[
'ACCESS_CODE'],
$matches);
423 $this->sonetLogGroups[$sonetLogId][$groupId] = $groupId;
427 return $this->sonetLogGroups[$sonetLogId];
430 private function isFeedSeenByUser(
int $groupId, DateTime $logDate): bool
432 $lastTimeSeen = $this->getLastTimeFeedSeen($groupId);
433 if ($lastTimeSeen && $lastTimeSeen > $logDate)
441 private function getLastTimeFeedSeen(
int $groupId): DateTime|null
443 $contentSeen = UserContentViewTable::getList([
444 'select' => [
'DATE_VIEW',
'USER_ID',
'RATING_ENTITY_ID',
'RATING_TYPE_ID'],
446 '=USER_ID' => $this->userId,
447 '=RATING_ENTITY_ID' => $groupId,
448 '=RATING_TYPE_ID' => Provider::DATA_ENTITY_TYPE_LIVE_FEED_VIEW,
452 return isset($contentSeen[
'DATE_VIEW'])
453 ?
new DateTime($contentSeen[
'DATE_VIEW'])
static getList(array $parameters=array())
static getCount($filter=array(), array $cache=array())
if(!is_array($deviceNotifyCodes)) $access