PM_Console/backend/app/Http/Controllers/Api/UserController.php

238 خطوط
8.2 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\StoreUserRequest;
use App\Http\Requests\UpdateUserRequest;
use App\Http\Resources\UserResource;
use App\Models\User;
use App\Models\Task;
use App\Services\WorkloadService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class UserController extends Controller
{
public function __construct(protected WorkloadService $workloadService) {}
public function index(Request $request): JsonResponse
{
try {
$query = User::with(['roles.permissions', 'dept', 'departments']);
if ($request->filled('search')) {
$search = $request->search;
$query->where(function ($q) use ($search) {
$q->where('name', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%");
});
}
$perPage = min((int) $request->input('per_page', 15), 100);
$sortBy = in_array($request->input('sort_by'), ['id', 'name', 'email', 'status', 'created_at', 'updated_at'], true)
? $request->input('sort_by')
: 'created_at';
$sortDir = $request->input('sort_dir') === 'asc' ? 'asc' : 'desc';
$users = $query->orderBy($sortBy, $sortDir)->paginate($perPage);
return response()->json([
'success' => true,
'data' => UserResource::collection($users),
'meta' => [
'current_page' => $users->currentPage(),
'last_page' => $users->lastPage(),
'per_page' => $users->perPage(),
'total' => $users->total(),
],
'message' => 'لیست کاربران',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در دریافت لیست کاربران',
], 500);
}
}
public function show(User $user): JsonResponse
{
try {
$user->load(['roles.permissions', 'projects', 'dept', 'departments']);
return response()->json([
'success' => true,
'data' => new UserResource($user),
'message' => 'اطلاعات کاربر',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در دریافت اطلاعات کاربر',
], 500);
}
}
public function store(StoreUserRequest $request): JsonResponse
{
try {
$data = $request->validated();
$data['password'] = Hash::make($data['password']);
$data['status'] = $data['status'] ?? 'active';
$user = User::create($data);
if (array_key_exists('role_id', $data)) {
$data['role_id'] ? $user->roles()->sync([$data['role_id']]) : $user->roles()->detach();
}
$user->load(['role', 'roles.permissions', 'dept']);
return response()->json([
'success' => true,
'data' => new UserResource($user),
'message' => 'کاربر با موفقیت ایجاد شد',
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در ایجاد کاربر',
], 500);
}
}
public function update(UpdateUserRequest $request, User $user): JsonResponse
{
try {
$data = $request->validated();
if (!empty($data['password'])) {
$data['password'] = Hash::make($data['password']);
} else {
unset($data['password']);
}
$user->update($data);
if (!empty($data['role_id'])) {
$user->roles()->sync([$data['role_id']]);
}
$user->load(['role', 'roles.permissions']);
return response()->json([
'success' => true,
'data' => new UserResource($user->fresh()),
'message' => 'کاربر با موفقیت به‌روزرسانی شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در به‌روزرسانی کاربر',
], 500);
}
}
public function destroy(User $user): JsonResponse
{
try {
if ($user->id === request()->user()->id) {
return response()->json([
'success' => false,
'message' => 'نمی‌توانید خودتان را حذف کنید',
], 400);
}
$user->delete();
return response()->json([
'success' => true,
'message' => 'کاربر با موفقیت حذف شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در حذف کاربر',
], 500);
}
}
public function updateStatus(Request $request, User $user): JsonResponse
{
try {
$request->validate(['status' => 'required|string|in:active,inactive']);
$user->update(['status' => $request->status]);
return response()->json([
'success' => true,
'data' => new UserResource($user->fresh()),
'message' => 'وضعیت کاربر به‌روزرسانی شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در به‌روزرسانی وضعیت',
], 500);
}
}
public function syncRoles(Request $request, User $user): JsonResponse
{
try {
$request->validate([
'roles' => 'present|array',
'roles.*' => 'integer|exists:roles,id',
]);
$user->roles()->sync($request->roles);
$user->load(['roles.permissions', 'dept', 'departments']);
return response()->json([
'success' => true,
'data' => new UserResource($user),
'message' => 'نقش‌های کاربر به‌روزرسانی شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در به‌روزرسانی نقش‌های کاربر',
], 500);
}
}
public function updateWorkload(User $user): JsonResponse
{
try {
$workload = collect($this->workloadService->getWorkload())
->firstWhere('user_id', $user->id);
return response()->json([
'success' => true,
'data' => $workload,
'message' => 'بار کاری کاربر',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در دریافت بار کاری',
], 500);
}
}
public function taskStats(User $user): JsonResponse
{
try {
$tasks = Task::where('assignee_id', $user->id);
return response()->json([
'success' => true,
'data' => [
'assigned_tasks_count' => (clone $tasks)->count(),
'in_progress_count' => (clone $tasks)->whereNotIn('status', ['done', 'canceled'])->count(),
'delayed_tasks_count' => (clone $tasks)->whereDate('due_date', '<', now()->toDateString())->where('status', '!=', 'done')->count(),
],
'message' => 'آمار تسک‌های کاربر',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در دریافت آمار کاربر',
], 500);
}
}
}