Skip to content
Commits on Source (2)
......@@ -6,6 +6,7 @@ use Minds\Interfaces;
use Minds\Helpers;
use Minds\Core\Security;
use Minds\Core\Session;
use Minds\Core\Di\Di;
/**
* API Factory
......
......@@ -13,6 +13,7 @@ use Minds\Interfaces;
use Minds\Entities;
use Minds\Api\Factory;
use Minds\Common\ChannelMode;
use Minds\Core\Di\Di;
use ElggFile;
use Minds\Core\Di\Di;
......@@ -47,6 +48,10 @@ class channel implements Interfaces\Api
return Factory::response(['status'=>'error', 'message'=>'The user is banned']);
}
Di::_()->get('Referrals\Cookie')
->setEntity($user)
->create();
$user->fullExport = true; //get counts
$user->exportCounts = true;
$return = Factory::exportable([$user]);
......
......@@ -113,6 +113,10 @@ class views implements Interfaces\Api
error_log($e);
}
Di::_()->get('Referrals\Cookie')
->setEntity($activity)
->create();
break;
}
......
......@@ -14,5 +14,8 @@ class Provider extends DiProvider
$this->di->bind('Referrals\Manager', function ($di) {
return new Manager();
}, [ 'useFactory'=>false ]);
$this->di->bind('Referrals\Cookie', function ($di) {
return new ReferralCookie();
}, [ 'useFactory'=>true ]);
}
}
<?php
/**
* Referral Cookie
*/
namespace Minds\Core\Referrals;
use Minds\Entities\User;
use Minds\Common\Cookie;
use Zend\Diactoros\ServerRequest;
class ReferralCookie
{
/** @var Request */
private $request;
/** @var Entity */
private $entity;
/**
* Set the router request
* @param Request $request
* @param Response $response
* @return $this
*/
public function withRouterRequest(ServerRequest $request): ReferralCookie
{
$this->request = $request;
return $this;
}
/**
* Set Entity
* @param Entity|User $entity
* @return $this
*/
public function setEntity($entity): ReferralCookie
{
$this->entity = $entity;
return $this;
}
/**
* Set the referral cookie
* @return void
*/
public function create(): void
{
if (!$this->request) {
return;
}
$cookies = $this->request->getCookieParams();
$params = $this->request->getQueryParams();
if (isset($cookies['referrer'])) {
return; // Do not override previosuly set cookie
}
$referrerGuid = null;
if (isset($params['referrer'])) { // Is a referrer param set in the request?
$referrerGuid = $params['referrer'];
} elseif ($this->entity) { // Was an entity set?
switch (get_class($this->entity)) {
case User::class:
$referrerGuid = $this->entity->getGuid();
break;
default:
$referrerGuid = $this->entity->getOwnerGuid();
}
}
if ($referrerGuid) {
$cookie = new Cookie();
$cookie
->setName('referrer')
->setValue($referrerGuid)
->setExpire(time() + (60 * 60 * 24)) //valid for 24 hours
->setPath('/')
->create();
$_COOKIE['referrer'] = $referrerGuid; // TODO: replace with Response object later
}
}
}
......@@ -109,9 +109,10 @@ class Router
Di::_()->get('Email\RouterHooks')
->withRouterRequest($request);
if (isset($_GET['referrer'])) {
Helpers\Campaigns\Referrals::register($_GET['referrer']);
}
Di::_()->get('Referrals\Cookie')
->withRouterRequest($request)
->create();
$loop = count($segments);
while ($loop >= 0) {
$offset = $loop - 1;
......
<?php
namespace Minds\Helpers\Campaigns;
use Minds\Core;
use Minds\Core\Guid;
use Minds\Common\Cookie;
use Minds\Core\Di\Di;
class Referrals
{
/**
* Registers a cookie for the referral step
* @param string $username
* @return null
* @return void
*/
public static function register($username)
public static function register($username): void
{
if (!isset($_COOKIE['referrer'])) {
$cookie = new Cookie();
$cookie
->setName('referrer')
->setValue($username)
->setExpire(time() + (60 * 60 * 24)) //valid for 24 hours
->setPath('/')
->create();
$_COOKIE['referrer'] = $username;
}
Di::_()->get('Referrals\Cookie')->create();
}
}
<?php
namespace Spec\Minds\Core\Referrals;
use Minds\Core\Referrals\ReferralCookie;
use Minds\Entities\User;
use Minds\Entities\Activity;
use Zend\Diactoros\ServerRequest;
use Zend\Diactoros\ServerRequestFactory;
use Zend\Diactoros\Uri;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
class ReferralCookieSpec extends ObjectBehavior
{
public function it_is_initializable()
{
$this->shouldHaveType(ReferralCookie::class);
}
public function it_should_set_a_referral_cookie_from_a_referral_param()
{
$request = (new ServerRequest())->withQueryParams(['referrer' => 'mark']);
$this->withRouterRequest($request);
$this->create();
expect($_COOKIE['referrer'])
->toBe('mark');
}
public function it_should_not_set_cookie_if_already_present()
{
$_COOKIE['referrer'] = 'bill';
$request = (new ServerRequest())
->withCookieParams(['referrer' => 'bill'])
->withQueryParams(['referrer' => 'mark']);
$this->withRouterRequest($request);
$this->create();
expect($_COOKIE['referrer'])
->toBe('bill');
}
public function it_should_set_cookie_from_user_entity()
{
$user = new User();
$user->guid = 123;
$request = (new ServerRequest());
$this->withRouterRequest($request);
$this->setEntity($user);
$this->create();
expect($_COOKIE['referrer'])
->toBe(123);
}
public function it_should_set_cookie_from_activity()
{
$activity = new Activity();
$activity->guid = 123;
$activity->owner_guid = 456;
$request = (new ServerRequest());
$this->withRouterRequest($request);
$this->setEntity($activity);
$this->create();
expect($_COOKIE['referrer'])
->toBe(456);
}
public function it_should_not_allow_entity_to_override_param()
{
$activity = new Activity();
$activity->guid = 123;
$activity->owner_guid = 456;
$request = (new ServerRequest())
->withQueryParams(['referrer' => 'mark']);
;
$this->withRouterRequest($request);
$this->setEntity($activity);
$this->create();
expect($_COOKIE['referrer'])
->toBe('mark');
}
public function it_should_not_allow_entity_to_override_cookie()
{
$activity = new Activity();
$activity->guid = 123;
$activity->owner_guid = 456;
$request = (new ServerRequest())
->withCookieParams(['referrer' => 'mark']);
;
$this->withRouterRequest($request);
$this->setEntity($activity);
$this->create();
expect($_COOKIE['referrer'])
->toBe('mark');
}
}