mirror of
https://github.com/elyby/accounts.git
synced 2024-12-23 13:50:06 +05:30
Добавлено поле версии принятых правил
This commit is contained in:
parent
9330041b4c
commit
cf6c7bc88e
@ -37,9 +37,10 @@ class AccountsController extends Controller {
|
|||||||
'allow' => true,
|
'allow' => true,
|
||||||
'roles' => ['@'],
|
'roles' => ['@'],
|
||||||
'matchCallback' => function() {
|
'matchCallback' => function() {
|
||||||
/** @var Account $account */
|
|
||||||
$account = Yii::$app->user->identity;
|
$account = Yii::$app->user->identity;
|
||||||
return $account->status > Account::STATUS_REGISTERED;
|
|
||||||
|
return $account->status > Account::STATUS_REGISTERED
|
||||||
|
&& $account->isAgreedWithActualRules();
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
@ -72,6 +73,7 @@ class AccountsController extends Controller {
|
|||||||
'isActive' => $account->status === Account::STATUS_ACTIVE,
|
'isActive' => $account->status === Account::STATUS_ACTIVE,
|
||||||
'passwordChangedAt' => $account->password_changed_at,
|
'passwordChangedAt' => $account->password_changed_at,
|
||||||
'hasMojangUsernameCollision' => $account->hasMojangUsernameCollision(),
|
'hasMojangUsernameCollision' => $account->hasMojangUsernameCollision(),
|
||||||
|
'shouldAcceptRules' => !$account->isAgreedWithActualRules(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ use Ramsey\Uuid\Uuid;
|
|||||||
use Yii;
|
use Yii;
|
||||||
use yii\base\ErrorException;
|
use yii\base\ErrorException;
|
||||||
use yii\base\InvalidConfigException;
|
use yii\base\InvalidConfigException;
|
||||||
|
use const common\LATEST_RULES_VERSION;
|
||||||
|
|
||||||
class RegistrationForm extends ApiForm {
|
class RegistrationForm extends ApiForm {
|
||||||
|
|
||||||
@ -92,6 +93,7 @@ class RegistrationForm extends ApiForm {
|
|||||||
$account->password = $this->password;
|
$account->password = $this->password;
|
||||||
$account->lang = $this->lang;
|
$account->lang = $this->lang;
|
||||||
$account->status = Account::STATUS_REGISTERED;
|
$account->status = Account::STATUS_REGISTERED;
|
||||||
|
$account->rules_agreement_version = LATEST_RULES_VERSION;
|
||||||
if (!$account->save()) {
|
if (!$account->save()) {
|
||||||
throw new ErrorException('Account not created.');
|
throw new ErrorException('Account not created.');
|
||||||
}
|
}
|
||||||
|
5
common/consts.php
Normal file
5
common/consts.php
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
namespace common;
|
||||||
|
|
||||||
|
const LATEST_RULES_VERSION = 1;
|
||||||
|
const RULES_APPLY_FROM = '2016-08-06T18:00:00+03:00';
|
@ -9,6 +9,7 @@ use Yii;
|
|||||||
use yii\base\InvalidConfigException;
|
use yii\base\InvalidConfigException;
|
||||||
use yii\behaviors\TimestampBehavior;
|
use yii\behaviors\TimestampBehavior;
|
||||||
use yii\db\ActiveRecord;
|
use yii\db\ActiveRecord;
|
||||||
|
use const common\LATEST_RULES_VERSION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Поля модели:
|
* Поля модели:
|
||||||
@ -20,6 +21,7 @@ use yii\db\ActiveRecord;
|
|||||||
* @property integer $password_hash_strategy
|
* @property integer $password_hash_strategy
|
||||||
* @property string $lang
|
* @property string $lang
|
||||||
* @property integer $status
|
* @property integer $status
|
||||||
|
* @property integer $rules_agreement_version
|
||||||
* @property integer $created_at
|
* @property integer $created_at
|
||||||
* @property integer $updated_at
|
* @property integer $updated_at
|
||||||
* @property integer $password_changed_at
|
* @property integer $password_changed_at
|
||||||
@ -164,6 +166,7 @@ class Account extends ActiveRecord {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Выполняет проверку, принадлежит ли этому нику аккаунт у Mojang
|
* Выполняет проверку, принадлежит ли этому нику аккаунт у Mojang
|
||||||
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function hasMojangUsernameCollision() : bool {
|
public function hasMojangUsernameCollision() : bool {
|
||||||
@ -172,8 +175,27 @@ class Account extends ActiveRecord {
|
|||||||
->exists();
|
->exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Т.к. у нас нет инфы по static_url пользователя, то пока генерируем самый простой вариант
|
||||||
|
* с ссылкой на профиль по id. На Ely он всё равно редиректнется на static, а мы так или
|
||||||
|
* иначе обеспечим отдачу этой инфы.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
public function getProfileLink() : string {
|
public function getProfileLink() : string {
|
||||||
return 'http://ely.by/u' . $this->id;
|
return 'http://ely.by/u' . $this->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* При создании структуры БД все аккаунты получают null значение в это поле, однако оно
|
||||||
|
* обязательно для заполнения. Все мигрировавшие с Ely аккаунты будут иметь null значение,
|
||||||
|
* а актуальной версией будет 1 версия правил сайта (т.к. раньше их просто не было). Ну а
|
||||||
|
* дальше уже будем инкрементить.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isAgreedWithActualRules() : bool {
|
||||||
|
return $this->rules_agreement_version === LATEST_RULES_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -51,5 +51,10 @@
|
|||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"phploc" : "phploc ./api ./common ./console"
|
"phploc" : "phploc ./api ./common ./console"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"common/consts.php"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use console\db\Migration;
|
||||||
|
|
||||||
|
class m160806_144759_account_rules_agreement_version extends Migration {
|
||||||
|
|
||||||
|
public function safeUp() {
|
||||||
|
$this->addColumn('{{%accounts}}', 'rules_agreement_version', $this->smallInteger()->unsigned()->after('status'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function safeDown() {
|
||||||
|
$this->dropColumn('{{%accounts}}', 'rules_agreement_version');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,7 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace tests\codeception\api\functional;
|
namespace tests\codeception\api\functional;
|
||||||
|
|
||||||
use Codeception\Specify;
|
|
||||||
use tests\codeception\api\_pages\AccountsRoute;
|
use tests\codeception\api\_pages\AccountsRoute;
|
||||||
use tests\codeception\api\FunctionalTester;
|
use tests\codeception\api\FunctionalTester;
|
||||||
|
|
||||||
@ -30,6 +29,7 @@ class AccountsCurrentCest {
|
|||||||
'shouldChangePassword' => false,
|
'shouldChangePassword' => false,
|
||||||
'isActive' => true,
|
'isActive' => true,
|
||||||
'hasMojangUsernameCollision' => false,
|
'hasMojangUsernameCollision' => false,
|
||||||
|
'shouldAcceptRules' => false,
|
||||||
]);
|
]);
|
||||||
$I->canSeeResponseJsonMatchesJsonPath('$.passwordChangedAt');
|
$I->canSeeResponseJsonMatchesJsonPath('$.passwordChangedAt');
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ use common\models\EmailActivation;
|
|||||||
use tests\codeception\api\unit\DbTestCase;
|
use tests\codeception\api\unit\DbTestCase;
|
||||||
use tests\codeception\common\fixtures\AccountFixture;
|
use tests\codeception\common\fixtures\AccountFixture;
|
||||||
use Yii;
|
use Yii;
|
||||||
|
use const common\LATEST_RULES_VERSION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @property array $accounts
|
* @property array $accounts
|
||||||
@ -99,6 +100,7 @@ class RegistrationFormTest extends DbTestCase {
|
|||||||
expect('user should be valid', $account)->isInstanceOf(Account::class);
|
expect('user should be valid', $account)->isInstanceOf(Account::class);
|
||||||
expect('password should be correct', $account->validatePassword('some_password'))->true();
|
expect('password should be correct', $account->validatePassword('some_password'))->true();
|
||||||
expect('uuid is set', $account->uuid)->notEmpty();
|
expect('uuid is set', $account->uuid)->notEmpty();
|
||||||
|
expect('actual rules version is set', $account->rules_agreement_version)->equals(LATEST_RULES_VERSION);
|
||||||
expect('user model exists in database', Account::find()->andWhere([
|
expect('user model exists in database', Account::find()->andWhere([
|
||||||
'username' => 'some_username',
|
'username' => 'some_username',
|
||||||
'email' => 'some_email@example.com',
|
'email' => 'some_email@example.com',
|
||||||
|
@ -9,6 +9,7 @@ return [
|
|||||||
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
||||||
'lang' => 'en',
|
'lang' => 'en',
|
||||||
'status' => \common\models\Account::STATUS_ACTIVE,
|
'status' => \common\models\Account::STATUS_ACTIVE,
|
||||||
|
'rules_agreement_version' => \common\LATEST_RULES_VERSION,
|
||||||
'created_at' => 1451775316,
|
'created_at' => 1451775316,
|
||||||
'updated_at' => 1451775316,
|
'updated_at' => 1451775316,
|
||||||
'password_changed_at' => 1451775316,
|
'password_changed_at' => 1451775316,
|
||||||
@ -22,6 +23,7 @@ return [
|
|||||||
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_OLD_ELY,
|
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_OLD_ELY,
|
||||||
'lang' => 'en',
|
'lang' => 'en',
|
||||||
'status' => \common\models\Account::STATUS_ACTIVE,
|
'status' => \common\models\Account::STATUS_ACTIVE,
|
||||||
|
'rules_agreement_version' => \common\LATEST_RULES_VERSION,
|
||||||
'created_at' => 1385225069,
|
'created_at' => 1385225069,
|
||||||
'updated_at' => 1385225069,
|
'updated_at' => 1385225069,
|
||||||
'password_changed_at' => 1385225069,
|
'password_changed_at' => 1385225069,
|
||||||
@ -35,6 +37,7 @@ return [
|
|||||||
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
||||||
'lang' => 'en',
|
'lang' => 'en',
|
||||||
'status' => \common\models\Account::STATUS_REGISTERED,
|
'status' => \common\models\Account::STATUS_REGISTERED,
|
||||||
|
'rules_agreement_version' => \common\LATEST_RULES_VERSION,
|
||||||
'created_at' => 1453146616,
|
'created_at' => 1453146616,
|
||||||
'updated_at' => 1453146616,
|
'updated_at' => 1453146616,
|
||||||
'password_changed_at' => 1453146616,
|
'password_changed_at' => 1453146616,
|
||||||
@ -48,6 +51,7 @@ return [
|
|||||||
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
||||||
'lang' => 'en',
|
'lang' => 'en',
|
||||||
'status' => \common\models\Account::STATUS_REGISTERED,
|
'status' => \common\models\Account::STATUS_REGISTERED,
|
||||||
|
'rules_agreement_version' => \common\LATEST_RULES_VERSION,
|
||||||
'created_at' => 1457890086,
|
'created_at' => 1457890086,
|
||||||
'updated_at' => 1457890086,
|
'updated_at' => 1457890086,
|
||||||
],
|
],
|
||||||
@ -60,6 +64,7 @@ return [
|
|||||||
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
||||||
'lang' => 'en',
|
'lang' => 'en',
|
||||||
'status' => \common\models\Account::STATUS_ACTIVE,
|
'status' => \common\models\Account::STATUS_ACTIVE,
|
||||||
|
'rules_agreement_version' => \common\LATEST_RULES_VERSION,
|
||||||
'created_at' => 1462891432,
|
'created_at' => 1462891432,
|
||||||
'updated_at' => 1462891432,
|
'updated_at' => 1462891432,
|
||||||
],
|
],
|
||||||
@ -72,6 +77,7 @@ return [
|
|||||||
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
||||||
'lang' => 'en',
|
'lang' => 'en',
|
||||||
'status' => \common\models\Account::STATUS_ACTIVE,
|
'status' => \common\models\Account::STATUS_ACTIVE,
|
||||||
|
'rules_agreement_version' => \common\LATEST_RULES_VERSION,
|
||||||
'created_at' => 1462891612,
|
'created_at' => 1462891612,
|
||||||
'updated_at' => 1462891612,
|
'updated_at' => 1462891612,
|
||||||
],
|
],
|
||||||
@ -84,6 +90,7 @@ return [
|
|||||||
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
||||||
'lang' => 'en',
|
'lang' => 'en',
|
||||||
'status' => \common\models\Account::STATUS_ACTIVE,
|
'status' => \common\models\Account::STATUS_ACTIVE,
|
||||||
|
'rules_agreement_version' => \common\LATEST_RULES_VERSION,
|
||||||
'created_at' => 1463427287,
|
'created_at' => 1463427287,
|
||||||
'updated_at' => 1463427287,
|
'updated_at' => 1463427287,
|
||||||
],
|
],
|
||||||
@ -96,6 +103,7 @@ return [
|
|||||||
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
'password_hash_strategy' => \common\models\Account::PASS_HASH_STRATEGY_YII2,
|
||||||
'lang' => 'en',
|
'lang' => 'en',
|
||||||
'status' => \common\models\Account::STATUS_ACTIVE,
|
'status' => \common\models\Account::STATUS_ACTIVE,
|
||||||
|
'rules_agreement_version' => \common\LATEST_RULES_VERSION,
|
||||||
'created_at' => 1463349615,
|
'created_at' => 1463349615,
|
||||||
'updated_at' => 1463349615,
|
'updated_at' => 1463349615,
|
||||||
],
|
],
|
||||||
|
@ -8,6 +8,7 @@ use tests\codeception\common\fixtures\AccountFixture;
|
|||||||
use tests\codeception\common\fixtures\MojangUsernameFixture;
|
use tests\codeception\common\fixtures\MojangUsernameFixture;
|
||||||
use tests\codeception\common\unit\DbTestCase;
|
use tests\codeception\common\unit\DbTestCase;
|
||||||
use Yii;
|
use Yii;
|
||||||
|
use const common\LATEST_RULES_VERSION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @property array $accounts
|
* @property array $accounts
|
||||||
@ -176,4 +177,29 @@ class AccountTest extends DbTestCase {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetProfileLink() {
|
||||||
|
$model = new Account();
|
||||||
|
$model->id = '123';
|
||||||
|
$this->assertEquals('http://ely.by/u123', $model->getProfileLink());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testIsAgreedWithActualRules() {
|
||||||
|
$this->specify('get false, if rules field set in null', function() {
|
||||||
|
$model = new Account();
|
||||||
|
expect($model->isAgreedWithActualRules())->false();
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->specify('get false, if rules field have version less, then actual', function() {
|
||||||
|
$model = new Account();
|
||||||
|
$model->rules_agreement_version = 0;
|
||||||
|
expect($model->isAgreedWithActualRules())->false();
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->specify('get true, if rules field have equals rules version', function() {
|
||||||
|
$model = new Account();
|
||||||
|
$model->rules_agreement_version = LATEST_RULES_VERSION;
|
||||||
|
expect($model->isAgreedWithActualRules())->true();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user