Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Repository/UserGroupPromotion.php
<?php

namespace XF\Repository;

use
XF\Mvc\Entity\Finder;
use
XF\Mvc\Entity\Repository;

class
UserGroupPromotion extends Repository
{
   
/**
     * @return Finder
     */
   
public function findUserGroupPromotionsForList()
    {
        return
$this->finder('XF:UserGroupPromotion')->order('title');
    }

   
/**
     * @return \XF\Entity\UserGroupPromotion[]
     */
   
public function getActiveUserGroupPromotions()
    {
        return
$this->finder('XF:UserGroupPromotion')->where('active', true)->fetch()->toArray();
    }

   
/**
     * @return Finder
     */
   
public function findUserGroupPromotionLogsForList()
    {
        return
$this->finder('XF:UserGroupPromotionLog')->order(['promotion_date', 'user_id'], 'DESC');
    }

    public function
getUserGroupPromotionLogsForUsers(array $userIds)
    {
        if (!
$userIds)
        {
            return [];
        }

       
$finder = $this->finder('XF:UserGroupPromotionLog')
            ->
where('user_id', $userIds)
            ->
order('promotion_date', 'desc');

       
$logsGrouped = [];
        foreach (
$finder->fetch() AS $log)
        {
           
$logsGrouped[$log->user_id][$log->promotion_id] = $log;
        }

        return
$logsGrouped;
    }

    public function
getUserGroupPromotionLogsForUser($userId)
    {
       
$logs = $this->getUserGroupPromotionLogsForUsers([$userId]);
        return
$logs[$userId] ?? [];
    }

    public function
getUserGroupPromotionTitlePairs()
    {
        return
$this->findUserGroupPromotionsForList()
            ->
fetch()
            ->
pluckNamed('title', 'promotion_id');
    }

   
/**
     * @param \XF\Entity\User $user
     * @param \XF\Entity\UserGroupPromotionLog[] $userGroupPromotionLogs
     * @param \XF\Entity\UserGroupPromotion[] $userGroupPromotions
     * @return int
     */
   
public function updatePromotionsForUser(\XF\Entity\User $user, $userGroupPromotionLogs = null, $userGroupPromotions = null)
    {
        if (
$userGroupPromotionLogs === null)
        {
           
$userGroupPromotionLogs = $this->getUserGroupPromotionLogsForUser($user->user_id);
        }

        if (
$userGroupPromotions === null)
        {
           
$userGroupPromotions = $this->getActiveUserGroupPromotions();
        }

       
$changes = 0;

        foreach (
$userGroupPromotions AS $userGroupPromotion)
        {
            if (isset(
$userGroupPromotionLogs[$userGroupPromotion->promotion_id]))
            {
               
$skip = false;
                switch (
$userGroupPromotionLogs[$userGroupPromotion->promotion_id]->promotion_state)
                {
                    case
'manual': // has it, don't take it away
                   
case 'disabled': // never give it
                       
$skip = true;
                }
                if (
$skip)
                {
                    continue;
                }
               
$hasPromotion = true;
            }
            else
            {
               
$hasPromotion = false;
            }

           
$userCriteria = $this->app()->criteria('XF:User', $userGroupPromotion->user_criteria);
           
$userCriteria->setMatchOnEmpty(false);
            if (
$userCriteria->isMatched($user))
            {
                if (!
$hasPromotion)
                {
                   
$userGroupPromotion->promote($user);
                   
$changes++;
                }
            }
            else if (
$hasPromotion)
            {
               
$userGroupPromotion->demote($user);
               
$changes++;
            }
        }

        return
$changes;
    }
}