/
itp_practice
/
itp_backend
Обзор
Документация
Войти
/
itp_practice
/
itp_backend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
app/Repositories/Admin/DatabaseUserRepository.php
133 строки
4 KB
vivanenko
migrations
23 май 2025, 09:01
23 май 2025, 09:01
0adfcde
Код
Авторство
О чём код?
<?php namespace App\Repositories\Admin; use App\Contracts\Admin\UserRepositoryInterface; use App\DTOs\Admin\UserDTO; use App\Models\User; use Carbon\Carbon; use Illuminate\Support\Facades\DB; use Spatie\Permission\Models\Role; class DatabaseUserRepository implements UserRepositoryInterface { public function all(array $columns = ['*']): array { $users = User::with('roles')->get($columns); return $users->map(fn ($user) => $this->toDTO($user))->all(); } public function paginate(int $perPage = 15, array $columns = ['*']): array { $paginator = User::with('roles')->paginate($perPage, $columns); return [ 'data' => collect($paginator->items())->map(fn ($user) => $this->toDTO($user))->all(), 'total' => $paginator->total(), 'per_page' => $paginator->perPage(), 'current_page' => $paginator->currentPage(), 'last_page' => $paginator->lastPage(), ]; } public function find(int $id, array $columns = ['*']): ?UserDTO { $user = User::with('roles')->find($id, $columns); return $user ? $this->toDTO($user) : null; } public function findByEmail(string $email): ?UserDTO { $user = User::with('roles')->where('email', $email)->first(); return $user ? $this->toDTO($user) : null; } public function findByTelegramUsername(string $username): ?UserDTO { $user = User::with('roles')->where('telegram_username', $username)->first(); return $user ? $this->toDTO($user) : null; } public function create(array $data): UserDTO { DB::beginTransaction(); try { $user = User::create($data); // Если указаны роли, присваиваем их if (isset($data['roles'])) { // Получаем существующие роли или создаем новые $roles = collect($data['roles'])->map(function ($roleName) { return Role::firstOrCreate(['name' => $roleName]); }); $user->syncRoles($roles); } DB::commit(); return $this->toDTO($user->load('roles')); } catch (\Exception $e) { DB::rollBack(); throw $e; } } public function update(int $id, array $data): ?UserDTO { DB::beginTransaction(); try { $user = User::find($id); if (!$user) { return null; } $user->update($data); // Обновляем роли, если они указаны if (isset($data['roles'])) { // Получаем существующие роли или создаем новые $roles = collect($data['roles'])->map(function ($roleName) { return Role::firstOrCreate(['name' => $roleName]); }); $user->syncRoles($roles); } DB::commit(); return $this->toDTO($user->load('roles')); } catch (\Exception $e) { DB::rollBack(); throw $e; } } public function delete(int $id): bool { return User::destroy($id) > 0; } public function updateTelegramData(int $id, array $telegramData): bool { return User::where('id', $id)->update([ 'telegram_data' => $telegramData, 'updated_at' => Carbon::now() ]) > 0; } public function updateLastLogin(int $id): bool { return User::where('id', $id)->update([ 'last_login' => Carbon::now(), 'updated_at' => Carbon::now() ]) > 0; } private function toDTO(User $user): UserDTO { $data = $user->toArray(); // Получаем имена ролей $data['roles'] = $user->getRoleNames()->toArray(); return UserDTO::fromArray($data); } }