File: /var/www/api_matriculas/app/Services/MyProfileService.php
<?php
namespace App\Services;
use App\Http\Resources\MyProfileResource;
use App\Repositories\UserRepository;
use Exception;
use Illuminate\Support\Facades\Hash;
class MyProfileService
{
protected $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
/**
* Obtiene el perfil del usuario autenticado
*/
public function show()
{
$user = auth()->user();
if (!$user) {
throw new Exception("Usuario no autenticado", 401);
}
return new MyProfileResource($user->load('profile'));
}
/**
* Actualiza el perfil del usuario autenticado
*/
public function update(array $data)
{
$user = auth()->user();
if (!$user) {
throw new Exception("Usuario no autenticado", 401);
}
// Validar email único (excluyendo el usuario actual)
$email = strLower($data['email'] ?? $user->email);
$existingUser = $this->userRepository->getByEmail($email, $user->id);
if ($existingUser) {
throw new Exception("El correo electrónico ya está en uso", 409);
}
// Actualizar campos permitidos
$user->name = $data['name'] ?? $user->name;
$user->email = $email;
$user->rut = $data['rut'] ?? $user->rut;
$user->updated_at = now();
$user->user_updated = $user->id;
if (!$user->save()) {
throw new Exception("Ocurrió un problema al actualizar el perfil", 500);
}
return new MyProfileResource($user->load('profile'));
}
/**
* Actualiza la contraseña del usuario autenticado
*/
public function updatePassword(array $data)
{
$user = auth()->user();
if (!$user) {
throw new Exception("Usuario no autenticado", 401);
}
// Verificar contraseña actual
if (!Hash::check($data['password_current'], $user->password)) {
throw new Exception("La contraseña actual es incorrecta", 400);
}
// Verificar que las contraseñas nuevas coincidan
if ($data['password'] !== $data['password_confirm']) {
throw new Exception("Las contraseñas nuevas no coinciden", 400);
}
// Validar requisitos de contraseña
$passwordRegex = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/';
if (!preg_match($passwordRegex, $data['password'])) {
throw new Exception("La contraseña debe tener al menos 8 caracteres, incluyendo mayúsculas, minúsculas, números y caracteres especiales", 400);
}
// Actualizar contraseña
$user->password = Hash::make($data['password']);
$user->updated_at = now();
$user->user_updated = $user->id;
if (!$user->save()) {
throw new Exception("Ocurrió un problema al actualizar la contraseña", 500);
}
return true;
}
}