|
@@ -4,6 +4,9 @@ namespace App\Services;
|
|
|
|
|
|
|
|
use App\Models\User;
|
|
use App\Models\User;
|
|
|
use App\Models\PersonalAccessToken;
|
|
use App\Models\PersonalAccessToken;
|
|
|
|
|
+use App\Enums\UserTypeEnum;
|
|
|
|
|
+use App\Enums\ApprovalStatusEnum;
|
|
|
|
|
+use App\Models\Provider;
|
|
|
use Carbon\Carbon;
|
|
use Carbon\Carbon;
|
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\DB;
|
|
@@ -18,22 +21,28 @@ class AuthService
|
|
|
|
|
|
|
|
public function login(string $email, string $password): ?array
|
|
public function login(string $email, string $password): ?array
|
|
|
{
|
|
{
|
|
|
- if (!Auth::attempt(["email" => $email, "password" => $password]) || (User::where("email", $email)->first()->type == 'CLIENT' || User::where("email", $email)->first()->type == 'PROVIDER')) {
|
|
|
|
|
|
|
+ $user = User::where('email', $email)->first();
|
|
|
|
|
+
|
|
|
|
|
+ if (!$user || !in_array($user->type, [UserTypeEnum::ADMIN, UserTypeEnum::USER])) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!Auth::attempt(['email' => $email, 'password' => $password])) {
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- $user = User::where("email", $email)->first();
|
|
|
|
|
|
|
+ // $user = User::where('email', $email)->first();
|
|
|
$deviceId = Str::uuid()->toString();
|
|
$deviceId = Str::uuid()->toString();
|
|
|
|
|
|
|
|
$accessToken = $user->createAccessToken($deviceId);
|
|
$accessToken = $user->createAccessToken($deviceId);
|
|
|
$refreshToken = $user->createRefreshToken($deviceId);
|
|
$refreshToken = $user->createRefreshToken($deviceId);
|
|
|
|
|
|
|
|
return [
|
|
return [
|
|
|
- "payload" => [
|
|
|
|
|
- "access_token" => $accessToken,
|
|
|
|
|
- "user" => $user,
|
|
|
|
|
|
|
+ 'payload' => [
|
|
|
|
|
+ 'access_token' => $accessToken,
|
|
|
|
|
+ 'user' => $user,
|
|
|
],
|
|
],
|
|
|
- "refreshToken" => $refreshToken,
|
|
|
|
|
|
|
+ 'refreshToken' => $refreshToken,
|
|
|
];
|
|
];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -109,7 +118,7 @@ class AuthService
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public function sendCode(array $data): ?bool
|
|
|
|
|
|
|
+ public function clientSendCode(array $data): bool|array|null
|
|
|
{
|
|
{
|
|
|
try {
|
|
try {
|
|
|
DB::beginTransaction();
|
|
DB::beginTransaction();
|
|
@@ -124,9 +133,76 @@ class AuthService
|
|
|
});
|
|
});
|
|
|
})
|
|
})
|
|
|
->first();
|
|
->first();
|
|
|
|
|
+ $isLogin = false;
|
|
|
|
|
+ if ($user) {
|
|
|
|
|
+ if ($user->type->value !== UserTypeEnum::CLIENT->value) {
|
|
|
|
|
+ DB::rollBack();
|
|
|
|
|
+ return ['error' => 'wrong_user_type'];
|
|
|
|
|
+ }
|
|
|
|
|
+ $user->code = $code;
|
|
|
|
|
+ $user->validated_code = false;
|
|
|
|
|
+ $user->save();
|
|
|
|
|
+ $isLogin = true;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ $user = new User();
|
|
|
|
|
+ $user->fill($data);
|
|
|
|
|
+ $user->code = $code;
|
|
|
|
|
+ $user->name = $data['name'] ?? 'Usuário';
|
|
|
|
|
+ $user->type = $data['type'] ?? UserTypeEnum::CLIENT->value;
|
|
|
|
|
+ $user->save();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!empty($data['email'])) {
|
|
|
|
|
+ $this->emailService->sendVerificationCode(
|
|
|
|
|
+ email: $data['email'],
|
|
|
|
|
+ code: $code,
|
|
|
|
|
+ recipientName: $data['name'] ?? '',
|
|
|
|
|
+ );
|
|
|
|
|
+ } elseif (!empty($data['phone'])) {
|
|
|
|
|
+ Log::info('SMS: envio de código por telefone ainda não implementado.', [
|
|
|
|
|
+ 'phone' => $data['phone'],
|
|
|
|
|
+ ]);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ DB::commit();
|
|
|
|
|
+ return $isLogin;
|
|
|
|
|
+ } catch (\Exception $e) {
|
|
|
|
|
+ DB::rollBack();
|
|
|
|
|
+ Log::error('Erro ao enviar código de verificação.', [
|
|
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
|
|
+ 'data' => $data,
|
|
|
|
|
+ ]);
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public function providerSendCode(array $data): bool|array|null
|
|
|
|
|
+ {
|
|
|
|
|
+ try {
|
|
|
|
|
+ DB::beginTransaction();
|
|
|
|
|
+ $code = str_pad((string) random_int(0, 999999), 6, '0', STR_PAD_LEFT);
|
|
|
|
|
|
|
|
|
|
+ $user = User::where(function ($query) use ($data) {
|
|
|
|
|
+ $query->when(!empty($data['email']), function ($q) use ($data) {
|
|
|
|
|
+ $q->where('email', $data['email']);
|
|
|
|
|
+ })
|
|
|
|
|
+ ->when(!empty($data['phone']), function ($q) use ($data) {
|
|
|
|
|
+ $q->where('phone', $data['phone']);
|
|
|
|
|
+ });
|
|
|
|
|
+ })
|
|
|
|
|
+ ->first();
|
|
|
$isLogin = false;
|
|
$isLogin = false;
|
|
|
if ($user) {
|
|
if ($user) {
|
|
|
|
|
+ if ($user->type->value !== UserTypeEnum::PROVIDER->value) {
|
|
|
|
|
+ DB::rollBack();
|
|
|
|
|
+ return ['error' => 'wrong_user_type'];
|
|
|
|
|
+ }
|
|
|
|
|
+ $provider = Provider::where('user_id', $user->id)->first();
|
|
|
|
|
+ if($provider && $provider->approval_status->value !== ApprovalStatusEnum::ACCEPTED->value) {
|
|
|
|
|
+ DB::rollBack();
|
|
|
|
|
+ return ['error' => 'provider_not_accepted'];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
$user->code = $code;
|
|
$user->code = $code;
|
|
|
$user->validated_code = false;
|
|
$user->validated_code = false;
|
|
|
$user->save();
|
|
$user->save();
|
|
@@ -136,7 +212,7 @@ class AuthService
|
|
|
$user->fill($data);
|
|
$user->fill($data);
|
|
|
$user->code = $code;
|
|
$user->code = $code;
|
|
|
$user->name = $data['name'] ?? 'Usuário';
|
|
$user->name = $data['name'] ?? 'Usuário';
|
|
|
- $user->type = $data['type'] ?? 'USER';
|
|
|
|
|
|
|
+ $user->type = $data['type'] ?? UserTypeEnum::PROVIDER->value;
|
|
|
$user->save();
|
|
$user->save();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -164,6 +240,65 @@ class AuthService
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ public function validateCodeClient(array $data, bool $isLogin): bool|array
|
|
|
|
|
+ {
|
|
|
|
|
+ $email = $data['email'] ?? null;
|
|
|
|
|
+ $phone = $data['phone'] ?? null;
|
|
|
|
|
+ $code = $data['code'] ?? '';
|
|
|
|
|
+
|
|
|
|
|
+ $user = User::where(function ($query) use ($email, $phone) {
|
|
|
|
|
+ $query->when($email, fn($q) => $q->where('email', $email))
|
|
|
|
|
+ ->when($phone, fn($q) => $q->where('phone', $phone));
|
|
|
|
|
+ })
|
|
|
|
|
+ ->where('code', $code)
|
|
|
|
|
+ ->first();
|
|
|
|
|
+
|
|
|
|
|
+ if (!$user) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ($isLogin) {
|
|
|
|
|
+ return $this->loginWithEmail($user->email, $code);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public function validateCodeProvider(array $data, bool $isLogin): bool|array
|
|
|
|
|
+ {
|
|
|
|
|
+ $email = $data['email'] ?? null;
|
|
|
|
|
+ $phone = $data['phone'] ?? null;
|
|
|
|
|
+ $code = $data['code'] ?? '';
|
|
|
|
|
+
|
|
|
|
|
+ $user = User::where(function ($query) use ($email, $phone) {
|
|
|
|
|
+ $query->when($email, fn($q) => $q->where('email', $email))
|
|
|
|
|
+ ->when($phone, fn($q) => $q->where('phone', $phone));
|
|
|
|
|
+ })
|
|
|
|
|
+ ->where('code', $code)
|
|
|
|
|
+ ->first();
|
|
|
|
|
+
|
|
|
|
|
+ if (!$user) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ($isLogin) {
|
|
|
|
|
+ $user->load('provider');
|
|
|
|
|
+ $provider = $user->provider ?? null;
|
|
|
|
|
+
|
|
|
|
|
+ if ($provider && $provider->approval_status === ApprovalStatusEnum::PENDING->value) {
|
|
|
|
|
+ return ['error' => 'provider_pending'];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ($provider && $provider->approval_status === ApprovalStatusEnum::REJECTED->value) {
|
|
|
|
|
+ return ['error' => 'provider_rejected'];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return $this->loginWithEmail($user->email, $code);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
public function validateCode(array $data, bool $isLogin): bool|array
|
|
public function validateCode(array $data, bool $isLogin): bool|array
|
|
|
{
|
|
{
|
|
|
$email = $data['email'] ?? null;
|
|
$email = $data['email'] ?? null;
|