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

namespace XF\Repository;

use
XF\ConnectedAccount\ProviderData\AbstractProviderData;
use
XF\Mvc\Entity\Finder;
use
XF\Mvc\Entity\Repository;

use function
strval;

class
ConnectedAccount extends Repository
{
   
/**
     * @return Finder
     */
   
public function findProvidersForList()
    {
       
$finder = $this->finder('XF:ConnectedAccountProvider')
            ->
order('display_order');

        return
$finder;
    }
   
    public function
getConnectedAccountProviderTitlePairs()
    {
       
$providers = $this->findProvidersForList();
        return
$providers->fetch()->pluckNamed('title', 'provider_id');
    }

    public function
getUsableProviders($forRegistration = false)
    {
       
$providers = $this->findProvidersForList()->fetch();
       
$providers = $providers->filter(function(\XF\Entity\ConnectedAccountProvider $provider) use($forRegistration)
        {
            if (!
$provider->isUsable())
            {
                return
false;
            }

            if (
$forRegistration && !$provider->isValidForRegistration())
            {
                return
false;
            }

            return
true;
        });
        return
$providers;
    }

    public function
getConnectedAccountProviderCount()
    {
       
$providers = $this->finder('XF:ConnectedAccountProvider')
            ->
fetch();

       
$providers = $providers->filter(function(\XF\Entity\ConnectedAccountProvider $provider)
        {
            return
$provider->isUsable();
        });

        return
$providers->count();
    }

    public function
rebuildProviderCount()
    {
       
$cache = $this->getConnectedAccountProviderCount();
        \
XF::registry()->set('connectedAccountCount', $cache);
        return
$cache;
    }

    public function
rebuildUserConnectedAccountCache(\XF\Entity\User $user)
    {
       
$cache = [];
       
$connectedAccounts = $user->ConnectedAccounts;

        foreach (
$connectedAccounts AS $providerId => $provider)
        {
           
$cache[$providerId] = $provider->provider_key;
        }

       
$user->Profile->connected_accounts = $cache;
       
$user->Profile->save();
    }

    public function
getUserConnectedAccountFromProviderData(AbstractProviderData $providerData)
    {
        return
$this->em->findOne('XF:UserConnectedAccount', [
           
'provider_key' => strval($providerData->provider_key),
           
'provider' => $providerData->getProviderId()
        ], [
'User']);
    }

    public function
associateConnectedAccountWithUser(\XF\Entity\User $user, AbstractProviderData $providerData)
    {
       
$providerId = $providerData->getProviderId();
       
$providerKey = strval($providerData->provider_key);

       
// The provider+key combination is unique to a single user, so if we're trying to associate this
        // account with a user, we need to remove any other association first.
       
$connectedAccount = $this->em->findOne('XF:UserConnectedAccount', [
           
'provider' => $providerId,
           
'provider_key' => $providerKey
       
]);
        if (
$connectedAccount && $connectedAccount->user_id != $user->user_id)
        {
           
$connectedAccount->delete();
           
$connectedAccount = null;
        }

        if (!
$connectedAccount)
        {
           
$connectedAccount = $this->em->findOne('XF:UserConnectedAccount', [
               
'user_id' => $user->user_id,
               
'provider' => $providerId
           
]);
        }

        if (!
$connectedAccount)
        {
           
$connectedAccount = $this->em->create('XF:UserConnectedAccount');
           
$connectedAccount->user_id = $user->user_id;
           
$connectedAccount->provider = $providerId;
        }

       
$connectedAccount->provider_key = $providerKey;
       
$connectedAccount->extra_data = $providerData->extra_data;
       
$connectedAccount->save();

        return
$connectedAccount;
    }
}