From bce4ed4a42c7cf2734819a53e3477c9b7288d5af Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Sun, 5 Nov 2017 19:48:11 +0800 Subject: [PATCH] Add a option for adding a player after registered --- app/Http/Controllers/AuthController.php | 36 +++++++++++- .../assets/src/js/__tests__/auth.test.js | 25 ++++++++- resources/assets/src/js/auth/register.js | 16 ++++-- resources/lang/en/auth.yml | 3 + resources/lang/zh_CN/auth.yml | 3 + resources/views/auth/register.tpl | 6 ++ tests/AuthControllerTest.php | 56 ++++++++++++++++++- 7 files changed, 131 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index e8e13566..4d6d0f75 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -9,8 +9,10 @@ use Utils; use Cookie; use Option; use Session; +use Validator; use App\Events; use App\Models\User; +use App\Models\Player; use Illuminate\Http\Request; use App\Exceptions\PrettyPageException; use App\Services\Repositories\UserRepository; @@ -141,10 +143,38 @@ class AuthController extends Controller event(new Events\UserRegistered($user)); + $msg = trans('auth.register.success'); + $redirect = true; + + if ($request->input('addPlayer') == 'add') { + if (!Player::where('player_name', $request->nickname)->first()) { + if (!Validator::make( + ['name' => $request->nickname], + ['name' => option('allow_chinese_playername') ? 'pname_chinese' : 'playername'] + )->fails()) { + $player = new Player; + $player->uid = $user->uid; + $player->player_name = $request->input('nickname'); + $player->preference = "default"; + $player->last_modified = Utils::getTimeFormatted(); + $player->save(); + + event(new Events\PlayerWasAdded($player)); + } else { + $msg = trans('auth.register.success-with-chinese-player-name'); + $redirect = false; + } + } else { + $msg = trans('auth.register.success-without-player'); + $redirect = false; + } + } + return json([ - 'errno' => 0, - 'msg' => trans('auth.register.success'), - 'token' => $user->getToken() + 'errno' => 0, + 'msg' => $msg, + 'token' => $user->getToken(), + 'redirect' => $redirect, ]) // set cookies ->withCookie('uid', $user->uid, 60) ->withCookie('token', $user->getToken(), 60); diff --git a/resources/assets/src/js/__tests__/auth.test.js b/resources/assets/src/js/__tests__/auth.test.js index 70e5aeed..a479efc3 100644 --- a/resources/assets/src/js/__tests__/auth.test.js +++ b/resources/assets/src/js/__tests__/auth.test.js @@ -3,6 +3,12 @@ const $ = require('jquery'); window.$ = window.jQuery = $; +jest.useFakeTimers(); + +window.blessing = { + base_url: '/' +}; + describe('tests for "captcha" module', () => { it('refresh captcha', async () => { const url = jest.fn(path => path); @@ -112,14 +118,18 @@ describe('tests for "register" module', () => { const fetch = jest.fn() .mockImplementationOnce(option => { option.beforeSend(); - return Promise.resolve({ errno: 0, msg: 'success' }); + return Promise.resolve({ errno: 0, msg: 'success', redirect: false }); + }) + .mockImplementationOnce(option => { + option.beforeSend(); + return Promise.resolve({ errno: 0, msg: 'success', redirect: true }); }) .mockImplementationOnce(() => Promise.resolve( { errno: 1, msg: 'warning' } )); const trans = jest.fn(key => key); const url = jest.fn(path => path); - const swal = jest.fn(); + const swal = jest.fn().mockImplementation(() => Promise.resolve()); const showMsg = jest.fn(); const refreshCaptcha = jest.fn(); window.fetch = fetch; @@ -136,6 +146,7 @@ describe('tests for "register" module', () => {
+ `; @@ -200,7 +211,8 @@ describe('tests for "register" module', () => { email: 'a@b.c', nickname: 'nickname', password: 'password', - captcha: 'captcha' + captcha: 'captcha', + addPlayer: 'add' } })); expect($('button').html()).toBe( @@ -208,6 +220,13 @@ describe('tests for "register" module', () => { ); expect($('button').prop('disabled')).toBe(true); expect(swal).toBeCalledWith({ type: 'success', html: 'success' }); + url.mockClear(); + expect(url).not.toBeCalled(); + + await $('button').click(); + url.mockClear(); + jest.runAllTimers(); + expect(url).toBeCalledWith('user'); await $('button').click(); expect(refreshCaptcha).toBeCalled(); diff --git a/resources/assets/src/js/auth/register.js b/resources/assets/src/js/auth/register.js index 03a51251..b87b6d10 100644 --- a/resources/assets/src/js/auth/register.js +++ b/resources/assets/src/js/auth/register.js @@ -9,7 +9,8 @@ $('#register-button').click(e => { email: $('#email').val(), password: $('#password').val(), nickname: $('#nickname').val(), - captcha: $('#captcha').val() + captcha: $('#captcha').val(), + addPlayer: $('#add-player').prop('checked') ? 'add' : '', }; (function validate({ email, password, nickname, captcha }, callback) { @@ -53,13 +54,16 @@ $('#register-button').click(e => { ' ' + trans('auth.registering') ).prop('disabled', 'disabled'); } - }).then(({ errno, msg }) => { + }).then(({ errno, msg, redirect }) => { if (errno == 0) { - swal({ type: 'success', html: msg }); + swal({ type: 'success', html: msg }) + .then(() => window.location = url('user')); - window.setTimeout(() => { - window.location = url('user'); - }, 1000); + if (redirect) { + setTimeout(() => { + window.location = url('user'); + }, 1000); + } } else { showMsg(msg, 'warning'); refreshCaptcha(); diff --git a/resources/lang/en/auth.yml b/resources/lang/en/auth.yml index b66259eb..865bf8a0 100644 --- a/resources/lang/en/auth.yml +++ b/resources/lang/en/auth.yml @@ -19,8 +19,11 @@ register: repeat-pwd: Repeat your password close: Well, this site doesn't allow any register. success: Registered successfully. Redirecting... + success-without-player: Registered successfully but you may add your player manually because the player name is duplicated. + success-with-chinese-player-name: Registered successfully but you may add your player manually because player name contains Chinese characters. max: You can't register more than :regs accounts. registered: The email address is already registered. + auto-add-player: Auto add a player with my nickname after registered successfully. forgot: title: Forgot Password diff --git a/resources/lang/zh_CN/auth.yml b/resources/lang/zh_CN/auth.yml index e5e95801..5373183f 100644 --- a/resources/lang/zh_CN/auth.yml +++ b/resources/lang/zh_CN/auth.yml @@ -19,8 +19,11 @@ register: repeat-pwd: 重复密码 close: 残念。。本皮肤站已经关闭注册咯 QAQ success: 注册成功,正在跳转~ + success-without-player: 注册成功。但您需要手动添加角色因为角色名重复。 + success-with-chinese-player-name: 注册成功。但您需要手动添加角色因为角色名中包含中文字符。 max: 你最多只能注册 :regs 个账户哦 registered: 这个邮箱已经注册过啦,换一个吧 + auto-add-player: 注册成功后自动新建同名角色 forgot: title: 忘记密码 diff --git a/resources/views/auth/register.tpl b/resources/views/auth/register.tpl index bb46cba3..81a11406 100644 --- a/resources/views/auth/register.tpl +++ b/resources/views/auth/register.tpl @@ -44,6 +44,12 @@ +
+ +
+
diff --git a/tests/AuthControllerTest.php b/tests/AuthControllerTest.php index f36e4a11..40eab855 100644 --- a/tests/AuthControllerTest.php +++ b/tests/AuthControllerTest.php @@ -347,7 +347,7 @@ class AuthControllerTest extends TestCase 'msg' => trans('auth.register.max', ['regs' => option('regs_per_ip')]) ]); - Option::set('regs_per_ip', 3); + Option::set('regs_per_ip', 100); // Should return a warning if using a duplicated email $existedUser = factory(User::class)->create(); @@ -378,7 +378,8 @@ class AuthControllerTest extends TestCase $response->seeJson([ 'errno' => 0, 'msg' => trans('auth.register.success'), - 'token' => $newUser->getToken() + 'token' => $newUser->getToken(), + 'redirect' => true ])->seeCookie('uid', $newUser->uid) ->seeCookie('token', $newUser->getToken()); $this->assertTrue($newUser->verifyPassword('12345678')); @@ -389,6 +390,57 @@ class AuthControllerTest extends TestCase 'ip' => '127.0.0.1', 'permission' => User::NORMAL ]); + $this->assertNull(\App\Models\Player::where('player_name', 'nickname')->first()); + + // Add a player automatically after success + $this->post( + '/auth/register', + [ + 'email' => 'aa@b.c', + 'password' => '12345678', + 'nickname' => 'new_player', + 'captcha' => 'a', + 'addPlayer' => 'add' + ] + )->seeJson([ + 'errno' => 0, + 'msg' => trans('auth.register.success'), + 'redirect' => true + ]); + $this->assertNotNull(\App\Models\Player::where('player_name', 'new_player')->first()); + + // Register with a duplicated player name + $this->post( + '/auth/register', + [ + 'email' => 'aaa@b.c', + 'password' => '12345678', + 'nickname' => 'new_player', + 'captcha' => 'a', + 'addPlayer' => 'add' + ] + )->seeJson([ + 'errno' => 0, + 'msg' => trans('auth.register.success-without-player'), + 'redirect' => false + ]); + + // Should be warned if player name contains Chinese characters + option(['allow_chinese_playername' => false]); + $this->post( + '/auth/register', + [ + 'email' => 'b@b.c', + 'password' => '12345678', + 'nickname' => '角色player', + 'captcha' => 'a', + 'addPlayer' => 'add' + ] + )->seeJson([ + 'errno' => 0, + 'msg' => trans('auth.register.success-with-chinese-player-name'), + 'redirect' => false + ]); } public function testForgot()