6
0
Fork 0
jiqu-library-server/app/Endpoint/Api/Http/Controllers/Auth/RegisterController.php

94 lines
2.4 KiB
PHP

<?php
namespace App\Endpoint\Api\Http\Controllers\Auth;
use App\Constants\Device;
use App\Endpoint\Api\Http\Controllers\Controller;
use App\Endpoint\Api\Http\Requests\RegisterRequest;
use App\Exceptions\BizException;
use App\Helpers\PhoneNumber;
use App\Models\SmsCode;
use App\Models\User;
use App\Services\SmsCodeService;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Throwable;
class RegisterController extends Controller
{
/**
* 注册
*
* @param \App\Endpoint\Api\Http\Requests\RegisterRequest $request
* @param \App\Services\SmsCodeService $smsCodeService
* @return \Illuminate\Http\JsonResponse
*/
public function __invoke(RegisterRequest $request, SmsCodeService $smsCodeService)
{
$input = $request->validated();
$smsCodeService->validate(
$input['phone'],
SmsCode::TYPE_REGISTER,
$input['verify_code']
);
$time = now();
$ip = $request->realIp();
$inviter = $this->findUserByCode((string) Arr::get($input, 'code'));
try {
DB::beginTransaction();
$user = User::create(
array_merge($input, [
'phone_verified_at' => $time,
'register_ip' => $ip,
'last_login_at' => $time,
'last_login_ip' => $ip,
]),
$inviter
);
DB::commit();
} catch (Throwable $e) {
DB::rollBack();
report($e);
throw new BizException(__('Registration failed, please try again'));
}
return response()->json(
$user->createDeviceToken(Device::UNIAPP)
);
}
/**
* 通过邀请码搜索用户
*
* @param string $code
* @return \App\Models\User|null
*
* @throws \App\Exceptions\BizException
*/
protected function findUserByCode(string $code): ?User
{
if ($code === '') {
return null;
}
$user = User::when(PhoneNumber::validate($code), function ($query) use ($code) {
$query->where('phone', $code);
}, function ($query) use ($code) {
$query->whereRelation('userInfo', 'code', $code);
})->first();
if ($user === null) {
throw new BizException(__('Inviter does not exist'));
}
return $user;
}
}