File "UserRepository.php"
Full Path: /var/www/html/back/app/Repositories/User/UserRepository.php
File size: 5.46 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace App\Repositories\User;
use App\Domain\Users\UserService;
use App\Enums\RoleEnum;
use App\Models\Role;
use App\Models\User;
use App\Models\System;
use App\Repositories\Model\Interfaces\ModelInterface;
use App\Repositories\User\Interfaces\UserInterface;
use Illuminate\Http\Request;
class UserRepository implements UserInterface
{
public function __construct(protected UserService $service, private ModelInterface $modelRepository)
{
}
public function index($type, Request $request)
{
$query = User::query();
if ($type == 'active') {
if ($request->model_id) {
$modelId = (int)$request->input('model_id');
$query->where('is_blocked', false)
->whereHas('roles', function ($q) use ($modelId) {
$q->where('model_id', $modelId)
->where('role', '!=', 'null')
->with('model');
});
} else {
$query->where('is_blocked', false)
->with([
'roles', 'roles.model'
]);
}
} else {
if ($request->model_id) {
$modelId = (int)$request->input('model_id');
$query->where('is_blocked', true)
->whereHas('roles', function ($q) use ($modelId) {
$q->where('model_id', $modelId)
->where('role', '!=', 'null')
->with('model');
});
} else {
$query->where('is_blocked', true)
->with([
'roles', 'roles.model'
]);
}
}
$users = $query->get();
return $users;
}
public function show(int $userId)
{
return User::query()->with('roles')->find($userId);
}
public function update(array $data, int $userId)
{
$user = User::find($userId);
if ($user) {
if (isset($data['delete_image'])) {
$user->clearMediaCollection('avatars');
}
if (isset($data['image'])) {
$user->clearMediaCollection('avatars');
$user->addMedia($data['image'])->toMediaCollection('avatars');
}
$this->syncModels($userId, $data['model']);
$allowedFields = ['first_name', 'last_name', 'start_page', 'email', 'password'];
$user->update(array_intersect_key($data, array_flip($allowedFields)));
return $user->refresh();
}
return 1;
}
public function store($data, $image)
{
$user = User::query()->create([
'first_name' => $data['first_name'],
'last_name' => $data['last_name'],
'email' => $data['email'],
'start_page' => $data['start_page'],
'password' => $data['password']
]);
foreach ($data['model'] as $key => $item) {
if (isset($item['roles']) && $item['roles'] != 'null') {
$role = RoleEnum::from($item['roles']);
$this->service->assignRole($user, $role, $key);
}
}
foreach ($data['model'] as $key => $item) {
if (isset($item['permissions']) && $item['permissions'] != 'null') {
$this->service->assignPermissions($user, $item['permissions'], $key);
}
}
if ($image) {
$media = $user->addMedia($image)->toMediaCollection('avatars');
}
return $user;
}
public function blocked(int $userId, bool $type)
{
$user = User::find($userId);
if ($user) {
$user->update(['is_blocked' => $type]);
return true;
}
return false;
}
public function destroy(int $userId)
{
$user = User::find($userId);
if ($user) {
$user->delete();
return true;
}
return false;
}
public function showPermissions($userId, int $modelId)
{
return User::query()
->with([
'roles' => function ($query) use ($modelId) {
$query->where('model_id', $modelId);
},
])
->find($userId);
}
private function syncModels(int $userId, array $modelsData)
{
$models = $this->modelRepository->getAll();
/** @var System $model */
foreach ($models as $model) {
if (isset($modelsData[$model->id]['roles'])) {
$role = Role::query()
->where(['user_id' => $userId, 'model_id' => $model->id])->first();
if ($modelsData[$model->id]['roles'] == 'null') {
if ($role) {
$role->delete();
}
}
if ($role) {
$role->update(['role' => $modelsData[$model->id]['roles']]);
} else {
Role::query()->create(['user_id' => $userId, 'model_id' => $model->id, 'role' => $modelsData[$model->id]['roles']]);
}
}
if (isset($modelsData[$model->id]['permissions'])) {
Role::query()
->where(['user_id' => $userId, 'model_id' => $model->id])
->update(['permissions' => json_encode($modelsData[$model->id]['permissions'])]);
}
}
}
}