HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux Bradford-Sitios 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: www-data (33)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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;
    }
}