Files
voltcerto/app/Services/UserService.php
Luis Medon e488ae3342 Add feature tests, unit tests, and configuration for Laravel application
- Created ExampleTest and RoutesTest for basic application response and route testing.
- Implemented IsolatedDatabaseTestCase for isolated database testing.
- Added unit tests for various models and services including Contract, CPE, and LeadDetail.
- Developed request validation tests for CreateClientRequest, UpdateClientRequest, and ContractRequest.
- Introduced Vite configuration for asset management in the Laravel application.
2026-10-29 11:30:06 +00:00

140 lines
3.5 KiB
PHP

<?php
namespace App\Services;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use App\Mail\NewUserWelcome;
use Illuminate\Support\Facades\Cache;
use Spatie\Permission\Models\Role;
class UserService
{
public function __construct(private AuthService $authentication)
{
}
public function index()
{
$users = User::with('roles')->paginate(20);
return compact('users');
}
public function create()
{
$roles = Role::where('id', '!=', 1)->get();
return compact('roles');
}
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email',
'roles' => 'array|nullable',
'roles.*' => 'exists:roles,name',
]);
$validator->validate();
$canLogin = $request->boolean('can_login');
$password = Str::random(12);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($password),
'can_login' => $canLogin,
]);
if ($request->filled('roles')) {
$user->syncRoles($request->roles);
}
if ($canLogin) {
Mail::to($user->email)->send(new NewUserWelcome($user, $password));
}
Cache::forget('sellers');
return $user;
}
public function edit(User $user)
{
$roles = Role::where('id', '!=', 1)->get();
return compact('user', 'roles');
}
public function update(Request $request, User $user)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email,' . $user->id,
'roles' => 'array|nullable',
'roles.*' => 'exists:roles,name',
]);
$validator->validate();
$user->update([
'name' => $request->name,
'email' => $request->email,
'can_login' => $request->boolean('can_login'),
]);
if ($request->has('roles')) {
$user->syncRoles($request->input('roles', []));
}
Cache::forget('sellers');
return $user;
}
public function sendPasswordResetLink(User $user)
{
$status = $this->authentication->sendResetLink(['email' => $user->email]);
return $status;
}
public function savePin(Request $request)
{
$request->validate([
'pin' => ['required', 'digits:4'],
]);
$user = $request->user();
/** @var User $user */
$user->pin = Hash::make($request->pin);
$user->save();
return ['message' => 'PIN saved successfully.'];
}
public function checkPin(Request $request)
{
$request->validate([
'pin' => ['required', 'digits:4']
]);
$user = $request->user();
if ($user->pin && Hash::check($request->pin, $user->pin)) {
return ['message' => 'PIN valid'];
}
throw \Illuminate\Validation\ValidationException::withMessages(['pin' => 'Invalid PIN']);
}
public function destroy(User $user): void
{
$user->tokens()->delete();
$user->delete();
Cache::forget('sellers');
}
}