siakad-itm/app/Services/Admin/Users/LecturerService.php
Yoga Pangestu 2885de2c20 feat: add lecturer and student management pages with CRUD functionality
- Implemented LecturerEdit and LecturerIndex components for managing lecturers.
- Created StudentCreate and StudentEdit components for adding and editing students.
- Developed StudentIndex component for listing students with search and pagination.
- Added department and user types for better type safety.
- Updated routes for lecturers and students, including reset password functionality.
- Removed AppSidebar from dashboard for a cleaner layout.
2026-08-21 14:14:01 +07:00

104 lines
3.4 KiB
PHP

<?php
namespace App\Services\Admin\Users;
use App\Models\Lecturer;
use App\Models\User;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class LecturerService
{
public function getAllForSelect(): Collection
{
return Lecturer::with('user.profile')->get();
}
public function getPaginated(array $filters = []): LengthAwarePaginator
{
return User::with(['profile', 'lecturer.department'])
->whereHas('roles', fn($q) => $q->where('name', 'dosen'))
->when($filters['search'] ?? null, fn($q, $search) => $q->where(function ($query) use ($search) {
$query->where('username', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%")
->orWhereHas('profile', fn($q) => $q->where('full_name', 'like', "%{$search}%"))
->orWhereHas('lecturer', fn($q) => $q->where('lecturer_number', 'like', "%{$search}%"));
}))
->latest()
->paginate($filters['per_page'] ?? 25);
}
public function create(array $data): User
{
return DB::transaction(function () use ($data) {
$user = User::create([
'username' => $data['username'],
'email' => $data['email'],
'password' => Hash::make(config('app.default_password')),
]);
$user->assignRole('dosen');
$user->profile()->create([
'full_name' => $data['full_name'],
'phone_number' => $data['phone_number'],
'address' => $data['address'],
'gender' => $data['gender'],
'birth_date' => $data['birth_date'],
'birth_place' => $data['birth_place'],
]);
$user->lecturer()->create([
'lecturer_number' => $data['lecturer_number'],
'department_id' => $data['department_id'],
]);
return $user;
});
}
public function update(User $user, array $data): User
{
DB::transaction(function () use ($user, $data) {
$user->update([
'username' => $data['username'],
'email' => $data['email'],
]);
$user->profile()->updateOrCreate([], [
'full_name' => $data['full_name'],
'phone_number' => $data['phone_number'],
'address' => $data['address'],
'gender' => $data['gender'],
'birth_date' => $data['birth_date'],
'birth_place' => $data['birth_place'],
]);
$user->lecturer()->updateOrCreate([], [
'lecturer_number' => $data['lecturer_number'],
'department_id' => $data['department_id'],
]);
});
return $user->fresh(['profile', 'lecturer.department', 'roles']);
}
public function delete(User $user): void
{
DB::transaction(function () use ($user) {
$user->lecturer()->delete();
$user->profile()->delete();
$user->delete();
});
}
public function resetPassword(User $user): void
{
$user->update([
'password' => Hash::make(config('app.default_password')),
]);
}
}