Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Service/User/Follow.php
<?php

namespace XF\Service\User;

use
XF\Service\AbstractService;

class
Follow extends AbstractService
{
   
/**
     * @var \XF\Entity\User
     */
   
protected $followedBy;

   
/**
     * @var \XF\Entity\User
     */
   
protected $followUser;

    protected
$silent = false;

    public function
__construct(\XF\App $app, \XF\Entity\User $followUser, \XF\Entity\User $followedBy = null)
    {
       
parent::__construct($app);

       
$this->followUser = $followUser;
       
$this->followedBy = $followedBy ?: \XF::visitor();
    }

    public function
setSilent($silent)
    {
       
$this->silent = (bool)$silent;
    }

    public function
follow()
    {
       
$userFollow = $this->em()->create('XF:UserFollow');
       
$userFollow->user_id = $this->followedBy->user_id;
       
$userFollow->follow_user_id = $this->followUser->user_id;

        try
        {
           
$saved = $userFollow->save(false);
        }
        catch (\
XF\Db\DuplicateKeyException $e)
        {
           
$saved = false;

           
$dupe = $this->em()->findOne('XF:UserFollow', [
               
'user_id' => $this->followedBy->user_id,
               
'follow_user_id' => $this->followUser->user_id
           
]);
            if (
$dupe)
            {
               
$userFollow = $dupe;
            }
        }

        if (
$saved)
        {
           
$this->sendFollowingAlert();
        }

        return
$userFollow;
    }

    protected function
sendFollowingAlert()
    {
        if (
$this->silent)
        {
            return;
        }

       
$followedBy = $this->followedBy;
       
$followUser = $this->followUser;

        if (!
$followUser->isIgnoring($followedBy->user_id)
            &&
$followUser->Option->doesReceiveAlert('user', 'following')
        )
        {
           
/** @var \XF\Repository\UserAlert $alertRepo */
           
$alertRepo = $this->repository('XF:UserAlert');
           
$alertRepo->alert(
               
$followUser,
               
$followedBy->user_id,
               
$followedBy->username,
               
'user',
               
$followUser->user_id,
               
'following',
                []
            );
        }
    }

    public function
unfollow()
    {
       
$userFollow = $this->em()->findOne('XF:UserFollow', [
           
'user_id' => $this->followedBy->user_id,
           
'follow_user_id' => $this->followUser->user_id
       
]);

        if (
$userFollow && $userFollow->delete())
        {
           
$this->deleteFollowingAlert();
        }

        return
$userFollow;
    }

    protected function
deleteFollowingAlert()
    {
       
$alertRepo = $this->repository('XF:UserAlert');
       
$alertRepo->fastDeleteAlertsFromUser(
           
$this->followedBy->user_id, 'user', $this->followUser->user_id, 'following'
       
);
    }
}