Commit f40d11e362d4d3287c3ed35ec1f92a82bf66402b

Authored by Yarik
1 parent 622d0396

Social auth + view history

migrations/m170607_100409_customer_add_social_id_column.php 0 → 100644
  1 +<?php
  2 +
  3 + use yii\db\Migration;
  4 +
  5 + class m170607_100409_customer_add_social_id_column extends Migration
  6 + {
  7 + public function safeUp()
  8 + {
  9 + $this->addColumn('customer', 'social_id', $this->string());
  10 + }
  11 +
  12 + public function safeDown()
  13 + {
  14 + $this->dropColumn('customer', 'social_id');
  15 + }
  16 + }
migrations/m170607_102520_social_customer_modification.php 0 → 100644
  1 +<?php
  2 +
  3 + use yii\db\Migration;
  4 +
  5 + class m170607_102520_social_customer_modification extends Migration
  6 + {
  7 + public function safeUp()
  8 + {
  9 + $this->alterColumn('customer', 'email', 'DROP NOT NULL');
  10 + }
  11 +
  12 + public function safeDown()
  13 + {
  14 + $this->alterColumn('customer', 'email', 'SET NOT NULL');
  15 + }
  16 + }
models/Customer.php
@@ -4,6 +4,8 @@ @@ -4,6 +4,8 @@
4 4
5 use artbox\catalog\models\Product; 5 use artbox\catalog\models\Product;
6 use artbox\catalog\models\Variant; 6 use artbox\catalog\models\Variant;
  7 + use artbox\core\helpers\UnificatorHelper;
  8 + use nodge\eauth\ErrorException;
7 use Yii; 9 use Yii;
8 use yii\base\NotSupportedException; 10 use yii\base\NotSupportedException;
9 use yii\behaviors\TimestampBehavior; 11 use yii\behaviors\TimestampBehavior;
@@ -31,6 +33,7 @@ @@ -31,6 +33,7 @@
31 * @property string $address 33 * @property string $address
32 * @property array $wishlist 34 * @property array $wishlist
33 * @property Order[] $orders 35 * @property Order[] $orders
  36 + * @property string $social_id
34 */ 37 */
35 class Customer extends ActiveRecord implements IdentityInterface 38 class Customer extends ActiveRecord implements IdentityInterface
36 { 39 {
@@ -39,9 +42,18 @@ @@ -39,9 +42,18 @@
39 const GENDER_MALE = 1; 42 const GENDER_MALE = 1;
40 const GENDER_FEMALE = 2; 43 const GENDER_FEMALE = 2;
41 44
  45 + const SCENARIO_SOCIAL = 'social';
  46 +
42 protected $wishlist = null; 47 protected $wishlist = null;
43 48
44 /** 49 /**
  50 + * @var array EAuth attributes
  51 + */
  52 + public $profile;
  53 +
  54 + public static $users;
  55 +
  56 + /**
45 * @return array|\yii\db\ActiveRecord[] 57 * @return array|\yii\db\ActiveRecord[]
46 */ 58 */
47 public function getWishlist() 59 public function getWishlist()
@@ -100,7 +112,6 @@ @@ -100,7 +112,6 @@
100 [ 112 [
101 [ 113 [
102 'username', 114 'username',
103 - 'email',  
104 ], 115 ],
105 'required', 116 'required',
106 ], 117 ],
@@ -152,6 +163,13 @@ @@ -152,6 +163,13 @@
152 self::GENDER_FEMALE, 163 self::GENDER_FEMALE,
153 ], 164 ],
154 ], 165 ],
  166 + [
  167 + [ 'email,' ],
  168 + 'required',
  169 + 'except' => [
  170 + self::SCENARIO_SOCIAL,
  171 + ],
  172 + ],
155 ]; 173 ];
156 } 174 }
157 175
@@ -221,12 +239,21 @@ @@ -221,12 +239,21 @@
221 */ 239 */
222 public static function findIdentity($id) 240 public static function findIdentity($id)
223 { 241 {
224 - return static::findOne(  
225 - [  
226 - 'id' => $id,  
227 - 'status' => self::STATUS_ACTIVE,  
228 - ]  
229 - ); 242 + if (\Yii::$app->getSession()
  243 + ->has('user-' . $id)
  244 + ) {
  245 + return new self(
  246 + \Yii::$app->getSession()
  247 + ->get('user-' . $id)
  248 + );
  249 + } else {
  250 + return static::findOne(
  251 + [
  252 + 'id' => $id,
  253 + 'status' => self::STATUS_ACTIVE,
  254 + ]
  255 + );
  256 + }
230 } 257 }
231 258
232 /** 259 /**
@@ -362,4 +389,71 @@ @@ -362,4 +389,71 @@
362 { 389 {
363 $this->password_reset_token = null; 390 $this->password_reset_token = null;
364 } 391 }
  392 +
  393 + /**
  394 + * @param \nodge\eauth\ServiceBase $service
  395 + *
  396 + * @return \artbox\order\models\Customer
  397 + * @throws \nodge\eauth\ErrorException
  398 + */
  399 + public static function findByEAuth($service)
  400 + {
  401 + if (!$service->getIsAuthenticated()) {
  402 + throw new ErrorException('EAuth user should be authenticated before creating identity.');
  403 + }
  404 + $id = $service->getServiceName() . '-' . $service->getId();
  405 + $attributes = [
  406 + 'id' => $id,
  407 + 'username' => $service->getAttribute('name') ? : $service->getAttribute('username'),
  408 + 'authKey' => md5($id),
  409 + 'profile' => $service->getAttributes(),
  410 + ];
  411 + $attributes[ 'profile' ][ 'service' ] = $service->getServiceName();
  412 + $identity = self::find()
  413 + ->where(
  414 + [
  415 + 'social_id' => $id,
  416 + ]
  417 + )
  418 + ->one();
  419 + if (!$identity) {
  420 + $identityAttrs = $attributes;
  421 + unset($identityAttrs[ 'id' ]);
  422 + $identityAttrs[ 'social_id' ] = $id;
  423 + $identity = self::register($identityAttrs);
  424 + }
  425 + \Yii::$app->getSession()
  426 + ->set('user-' . $id, $attributes);
  427 + return $identity;
  428 + }
  429 +
  430 + public function setAuthKey($key)
  431 + {
  432 + $this->auth_key = $key;
  433 + }
  434 +
  435 + /**
  436 + * @param array $attributes
  437 + *
  438 + * @return \artbox\order\models\Customer
  439 + */
  440 + protected function register(array $attributes)
  441 + {
  442 + $identity = new self($attributes);
  443 + $identity->scenario = self::SCENARIO_SOCIAL;
  444 + $identity->username = UnificatorHelper::unify(
  445 + $identity->username,
  446 + function ($name) {
  447 + if (Customer::findByUsername($name)) {
  448 + return false;
  449 + } else {
  450 + return true;
  451 + }
  452 + }
  453 + );
  454 + $identity->setPassword($attributes[ 'social_id' ]);
  455 + $identity->save();
  456 + return $identity;
  457 + }
  458 +
365 } 459 }