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