107 lines
2.6 KiB
PHP
107 lines
2.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Repositories;
|
|
|
|
use App\Models\User;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class UserRepository extends BaseRepository implements UserRepositoryInterface
|
|
{
|
|
public function __construct(User $model)
|
|
{
|
|
parent::__construct($model);
|
|
}
|
|
|
|
/**
|
|
* @param array<string, mixed> $attributes
|
|
*/
|
|
public function create(array $attributes): Model
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
|
|
$roles = $attributes['roles'] ?? [];
|
|
$permissions = $attributes['permissions'] ?? [];
|
|
|
|
unset($attributes['roles'], $attributes['permissions']);
|
|
|
|
/** @var User $user */
|
|
$user = $this->model->newQuery()->create($attributes);
|
|
|
|
if (! empty($roles)) {
|
|
$user->syncRoles($roles);
|
|
}
|
|
|
|
if (! empty($permissions)) {
|
|
$user->syncPermissions($permissions);
|
|
}
|
|
|
|
DB::commit();
|
|
|
|
return $user;
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
Log::error('Error creating user with roles/permissions: ' . $e->getMessage(), [
|
|
'attributes' => $attributes,
|
|
'exception' => $e,
|
|
]);
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param int|string $id
|
|
* @param array<string, mixed> $attributes
|
|
*/
|
|
public function update(int|string $id, array $attributes): bool
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
|
|
/** @var User|null $user */
|
|
$user = $this->find($id);
|
|
|
|
if (! $user instanceof User) {
|
|
DB::rollBack();
|
|
return false;
|
|
}
|
|
|
|
$roles = $attributes['roles'] ?? null;
|
|
$permissions = $attributes['permissions'] ?? null;
|
|
|
|
unset($attributes['roles'], $attributes['permissions']);
|
|
|
|
$updated = $user->fill($attributes)->save();
|
|
|
|
if (! $updated) {
|
|
DB::rollBack();
|
|
return false;
|
|
}
|
|
|
|
if (is_array($roles)) {
|
|
$user->syncRoles($roles);
|
|
}
|
|
|
|
if (is_array($permissions)) {
|
|
$user->syncPermissions($permissions);
|
|
}
|
|
|
|
DB::commit();
|
|
|
|
return true;
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
Log::error('Error updating user with roles/permissions: ' . $e->getMessage(), [
|
|
'id' => $id,
|
|
'attributes' => $attributes,
|
|
'exception' => $e,
|
|
]);
|
|
throw $e;
|
|
}
|
|
}
|
|
}
|