LoginController.php 3.02 KB
<?php

namespace App\Http\Container\ProviderSection\Controllers;

use App\Enums\UserStatusEnum;
use App\Helpers\PasswordHelper;
use App\Http\Container\ProviderSection\Requests\LoginMailRequest;
use App\Http\Container\ProviderSection\Requests\LoginPhoneRequest;
use App\Models\User;
use App\Support\BusinessCode;
use Hikoon\LaravelApi\Facades\Response;
use Hikoon\LaravelApi\Support\ApiController;
use Hikoon\LaravelJwt\Support\Service as JwtService;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;

class LoginController extends ApiController
{
    /**
     * @param \Illuminate\Http\Request $request
     * @return mixed
     */
    public function __invoke(Request $request): mixed
    {
        $request->validate(['type' => 'required|in:email,phone'], ['type.required' => '请选择登录方式', 'type.in' => '登录方式暂未开发,敬请期待']);
        return App::call(__CLASS__ . '@' . $request->offsetGet('type'));
    }

    /**
     * @param \App\Http\Container\ProviderSection\Requests\LoginPhoneRequest $request
     * @return \Hikoon\LaravelApi\Facades\Response
     * @throws \RedisException
     */
    public function phone(LoginPhoneRequest $request): Response
    {
        if (!$request->checkPhoneExist()) {
            return $this->fail(BusinessCode::ACCOUNT_NOT_EXISTS);
        }

        if (!$request->checkPhoneStatus(UserStatusEnum::ACTIVATE)) {
            return $this->fail(BusinessCode::ACCOUNT_STATUS_ERROR);
        }

        if (!$request->checkSmsKey()) {
            return $this->fail(BusinessCode::SMS_CODE_ERROR);
        }

        return $this->login($request->offsetGet('platform'), User::phoneNumber($request->phoneNumber)->firstOrFail(['id', 'nick_name']));
    }

    /**
     * @param \App\Http\Container\ProviderSection\Requests\LoginMailRequest $request
     * @return \Hikoon\LaravelApi\Facades\Response
     */
    public function email(LoginMailRequest $request): Response
    {
        $user = User::query()->where('email', $request->offsetGet('email'))->first(['id', 'nick_name', 'status', 'password']);

        if (!$user) {
            return $this->fail(BusinessCode::ACCOUNT_NOT_EXISTS);
        }

        if ($user->getAttribute('status') !== UserStatusEnum::ACTIVATE) {
            return $this->fail(BusinessCode::ACCOUNT_STATUS_ERROR);
        }

        if (!PasswordHelper::verify($request->offsetGet('password'), $user->getAuthPassword())) {
            return $this->fail(BusinessCode::ACCOUNT_OR_PASSWORD_ERROR);
        }

        return $this->login($request->offsetGet('platform'), $user);
    }


    /**
     * @param string                                               $guard
     * @param \Illuminate\Database\Eloquent\Model|\App\Models\User $user
     * @return \Hikoon\LaravelApi\Facades\Response
     */
    protected function login(string $guard, Model|User $user): Response
    {
        $token = (new JwtService($guard, request()))->generateToken($user);

        return $this->successWithData([...$user->only(['nick_name']), ...$token]);
    }
}