Commit f40d11e362d4d3287c3ed35ec1f92a82bf66402b
1 parent
622d0396
Social auth + view history
Showing
3 changed files
with
133 additions
and
7 deletions
Show diff stats
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 | 4 | |
| 5 | 5 | use artbox\catalog\models\Product; |
| 6 | 6 | use artbox\catalog\models\Variant; |
| 7 | + use artbox\core\helpers\UnificatorHelper; | |
| 8 | + use nodge\eauth\ErrorException; | |
| 7 | 9 | use Yii; |
| 8 | 10 | use yii\base\NotSupportedException; |
| 9 | 11 | use yii\behaviors\TimestampBehavior; |
| ... | ... | @@ -31,6 +33,7 @@ |
| 31 | 33 | * @property string $address |
| 32 | 34 | * @property array $wishlist |
| 33 | 35 | * @property Order[] $orders |
| 36 | + * @property string $social_id | |
| 34 | 37 | */ |
| 35 | 38 | class Customer extends ActiveRecord implements IdentityInterface |
| 36 | 39 | { |
| ... | ... | @@ -39,9 +42,18 @@ |
| 39 | 42 | const GENDER_MALE = 1; |
| 40 | 43 | const GENDER_FEMALE = 2; |
| 41 | 44 | |
| 45 | + const SCENARIO_SOCIAL = 'social'; | |
| 46 | + | |
| 42 | 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 | 57 | * @return array|\yii\db\ActiveRecord[] |
| 46 | 58 | */ |
| 47 | 59 | public function getWishlist() |
| ... | ... | @@ -100,7 +112,6 @@ |
| 100 | 112 | [ |
| 101 | 113 | [ |
| 102 | 114 | 'username', |
| 103 | - 'email', | |
| 104 | 115 | ], |
| 105 | 116 | 'required', |
| 106 | 117 | ], |
| ... | ... | @@ -152,6 +163,13 @@ |
| 152 | 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 | 239 | */ |
| 222 | 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 | 389 | { |
| 363 | 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 | } | ... | ... |