changes
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace App\Containers\Dashboard\Actions\Users;
|
||||
|
||||
use App\Containers\User\Models\User;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class CreateUserAction
|
||||
{
|
||||
public function run(array $data): User
|
||||
{
|
||||
// Генерация уникального slug
|
||||
$data['slug'] = $this->generateUniqueSlug($data['name']);
|
||||
|
||||
$user = User::create($data);
|
||||
|
||||
// Назначение ролей если переданы
|
||||
if (isset($data['roles']) && is_array($data['roles'])) {
|
||||
$user->syncRoles($data['roles']);
|
||||
}
|
||||
|
||||
// Назначение разрешений если переданы
|
||||
if (isset($data['permissions']) && is_array($data['permissions'])) {
|
||||
$user->syncPermissions($data['permissions']);
|
||||
}
|
||||
|
||||
return $user->load(['roles', 'permissions']);
|
||||
}
|
||||
|
||||
private function generateUniqueSlug(string $name): string
|
||||
{
|
||||
$slug = Str::slug($name);
|
||||
$count = 1;
|
||||
$baseSlug = $slug;
|
||||
|
||||
while (User::where('slug', $slug)->exists()) {
|
||||
$slug = $baseSlug . '-' . $count;
|
||||
$count++;
|
||||
}
|
||||
|
||||
return $slug;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace App\Containers\Dashboard\Actions\Users;
|
||||
|
||||
use App\Containers\User\Models\User;
|
||||
|
||||
class DeleteUserAction
|
||||
{
|
||||
public function run(User $user): bool
|
||||
{
|
||||
return $user->delete();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Containers\Dashboard\Actions\Users;
|
||||
|
||||
use App\Containers\User\Mails\InvitationMail;
|
||||
use App\Containers\User\Models\Invitation;
|
||||
|
||||
class InviteUserAction
|
||||
{
|
||||
public function run(string $email, int $senderId): array
|
||||
{
|
||||
// Проверяем существует ли пользователь
|
||||
$existingUser = \App\Containers\User\Models\User::where('email', $email)->first();
|
||||
|
||||
if ($existingUser) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Данный пользователь уже существует в системе',
|
||||
];
|
||||
}
|
||||
|
||||
// Создаем приглашение
|
||||
$invitation = Invitation::create([
|
||||
'email' => $email,
|
||||
'user_id' => $senderId,
|
||||
]);
|
||||
|
||||
// Отправляем письмо
|
||||
\Illuminate\Support\Facades\Mail::to($invitation->email)->send(new InvitationMail($invitation));
|
||||
|
||||
return [
|
||||
'success' => true,
|
||||
'message' => 'Пользователь успешно приглашен',
|
||||
'invitation' => $invitation,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Containers\Dashboard\Actions\Users;
|
||||
|
||||
use App\Containers\User\Models\User;
|
||||
use Spatie\Permission\Models\Role;
|
||||
|
||||
class ListUsersAction
|
||||
{
|
||||
public function run(array $filters = []): array
|
||||
{
|
||||
$query = User::with(['roles', 'userDetail']);
|
||||
|
||||
// Поиск по имени или email
|
||||
if (!empty($filters['search'])) {
|
||||
$query->where(function ($q) use ($filters) {
|
||||
$q->where('name', 'like', '%' . $filters['search'] . '%')
|
||||
->orWhere('email', 'like', '%' . $filters['search'] . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Фильтр по роли
|
||||
if (!empty($filters['role_id'])) {
|
||||
$query->whereHas('roles', function ($q) use ($filters) {
|
||||
$q->where('roles.id', $filters['role_id']);
|
||||
});
|
||||
}
|
||||
|
||||
$users = $query->orderBy('created_at', 'desc')->paginate(20)->withQueryString();
|
||||
|
||||
return [
|
||||
'users' => $users,
|
||||
'filters' => $filters,
|
||||
'roles' => Role::with('permissions')->orderBy('name')->get(['id', 'name']),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
namespace App\Containers\Dashboard\Actions\Users;
|
||||
|
||||
use App\Containers\User\Models\User;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class UpdateUserAction
|
||||
{
|
||||
public function run(User $user, array $data): User
|
||||
{
|
||||
// Генерация уникального slug при изменении имени
|
||||
if (isset($data['name']) && $data['name'] !== $user->name) {
|
||||
$data['slug'] = $this->generateUniqueSlug($data['name']);
|
||||
}
|
||||
|
||||
// Если пароль пустой или null, удаляем из данных
|
||||
if (empty($data['password'])) {
|
||||
unset($data['password']);
|
||||
}
|
||||
|
||||
// Извлекаем роли и пермисшены — они не в $fillable и не колонки таблицы
|
||||
$roles = $data['roles'] ?? null;
|
||||
$permissions = $data['permissions'] ?? null;
|
||||
unset($data['roles'], $data['permissions']);
|
||||
|
||||
$user->update($data);
|
||||
|
||||
// Синхронизация ролей
|
||||
if ($roles !== null && is_array($roles)) {
|
||||
$user->syncRoles($roles);
|
||||
}
|
||||
|
||||
// Синхронизация разрешений
|
||||
if ($permissions !== null && is_array($permissions)) {
|
||||
$user->syncPermissions($permissions);
|
||||
}
|
||||
|
||||
return $user->fresh(['roles', 'permissions']);
|
||||
}
|
||||
|
||||
private function generateUniqueSlug(string $name): string
|
||||
{
|
||||
$slug = Str::slug($name);
|
||||
$count = 1;
|
||||
$baseSlug = $slug;
|
||||
|
||||
while (User::where('slug', $slug)->exists()) {
|
||||
$slug = $baseSlug . '-' . $count;
|
||||
$count++;
|
||||
}
|
||||
|
||||
return $slug;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user