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/UserService.php
<?php

namespace App\Services;

use App\Http\Resources\UserResource;
use App\Repositories\ProfileRepository;
use App\Repositories\ResetPasswordRepository;
use App\Repositories\UserRepository;
use Exception;

class UserService
{

    protected $userRepository;
    protected $profileRepository;
    protected $resetPasswordRepository;

    public function __construct(
        UserRepository $userRepository,
        ProfileRepository   $profileRepository,
        ResetPasswordRepository $resetPasswordRepository
    ) {
        $this->userRepository = $userRepository;
        $this->profileRepository = $profileRepository;
        $this->resetPasswordRepository = $resetPasswordRepository;
    }


    public function list()
    {
        $profile = $this->profileRepository->getByCode('parent');
        $users = $this->userRepository->getAll(($profile ? $profile->id : ''),  "!=");
        if ($users->count() < 1) {
            return [];
        }

        return UserResource::collection($users);
    }


    public function store($request)
    {
        $email = strLower($request['email']);
        $rut = formatterRut($request['rut'], false);

        $validateField = $this->userRepository->getByUsername($rut);
        if ($validateField) {
            throw new Exception("RUT ya existe en la base de datos", 409);
        }

        $validateField = $this->userRepository->getByEmail($email);
        if ($validateField) {
            throw new Exception("Correo electrónico ya existe en la base de datos", 409);
        }


        $profileData = $this->validateProfile($request->profile);
        $request->profile_id = $profileData->id;

        $request->password = generateSecurePassword();
        $request->activation_token = getToken();

        $register = $this->userRepository->create((object)$request);
        if (!$register) {
            throw new Exception("Ocurrió un problema al registrar usuario", 500);
        }

        $request->profile = $profileData->profile;
        $mailService = new MailService();
        $mailService->registerUser($request);

        $register = $this->show($register->id, false);
        return $register;
    }

    public function update($request, $id)
    {
        $register = $this->show($id, true);

        if (auth()->user()->profile->code != 'super_admin') {
            $request->company = auth()->user()->company_id;
        }

        $email = strLower($request['email']);
        $rut = formatterRut($request['rut'], false);

        $validateField = $this->userRepository->getByUsername($rut, $id);
        if ($validateField) {
            throw new Exception("RUT ya existe en la base de datos", 409);
        }

        $validateField = $this->userRepository->getByEmail($email, $id);
        if ($validateField) {
            throw new Exception("Correo electrónico ya existe en la base de datos", 409);
        }

        $profileData = $this->validateProfile($request->profile);
        $request->profile_id = $profileData->id;

        $update = $this->userRepository->update($register, $request);
        if (!$update) {
            throw new Exception("Ocurrió un problema al actualizar registro", 500);
        }
        return $update;
    }

    public function show($id, $allData = false)
    {
        $register = $this->userRepository->getById($id);

        if (!$register) {
            throw new Exception("Usuario no existe o fue eliminado", 400);
        }
        if ($allData) {
            return $register;
        }
        $resource = (new UserResource($register))->resolve();
        $resource['company_id'] = $register->company_id;
        return (object)$resource;
    }

    public function showByUsername($username)
    {
        $register = $this->userRepository->getByUsername(strLower($username));
        if (!$register) {
            throw new Exception("Usuario no existe o fue eliminado", 400);
        }
        return $register;
    }

    public function delete($id)
    {
        if ($id == auth()->user()->id) {
            throw new Exception("No es posible eliminar tu propio usuario", 500);
        }
        $register = $this->show($id, true);
        $register->deleted = 1;
        $register->deleted_at = now();
        $register->user_deleted = auth()->user()->id;
        if (!$register->save()) {
            throw new Exception("Ocurrió un problema al eliminar registro", 500);
        }
        return true;
    }

    function validateProfile($code)
    {
        $profile = $this->profileRepository->getByCode($code);

        if (!$profile) {
            throw new Exception("Perfil no existe o fue eliminado", 400);
        }

        return $profile;
    }

}