Merge pull request #103 from g-plane/dev

Add a option for adding a player after registered
This commit is contained in:
printempw 2017-11-05 21:16:12 +08:00 committed by GitHub
commit c345b4dab3
7 changed files with 131 additions and 14 deletions

View File

@ -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);

View File

@ -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', () => {
<input id="confirm-pwd" />
<div id="captcha-form"></div>
<input id="captcha" />
<input id="add-player" type="checkbox" checked />
<button id="register-button"></button>
`;
@ -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();

View File

@ -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 => {
'<i class="fa fa-spinner fa-spin"></i> ' + 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();

View File

@ -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

View File

@ -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: 忘记密码

View File

@ -44,6 +44,12 @@
<!-- /.col -->
</div>
<div class="checkbox icheck" style="margin-top: 0;">
<label for="keep">
<input id="add-player" type="checkbox"> {{ trans('auth.register.auto-add-player') }}
</label>
</div>
<div id="msg" class="callout hide"></div>
<div class="row">

View File

@ -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()