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;
}
}