238 خطوط
8.2 KiB
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);
|
|
}
|
|
}
|
|
}
|