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

302 خطوط
10 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\StoreProjectRequest;
use App\Http\Requests\UpdateProjectRequest;
use App\Http\Resources\ProjectResource;
use App\Models\Project;
use App\Models\User;
use App\Services\ActivityLogService;
use App\Services\NotificationService;
use App\Services\ProjectProgressService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ProjectController extends Controller
{
public function __construct(
protected ActivityLogService $activityLogService,
protected NotificationService $notificationService,
protected ProjectProgressService $projectProgressService,
) {}
public function index(Request $request): JsonResponse
{
try {
$query = Project::with(['projectManager', 'creator', 'department']);
if ($request->filled('status')) {
$query->where('status', $request->status);
}
if ($request->filled('priority')) {
$query->where('priority', $request->priority);
}
if ($request->filled('project_manager_id')) {
$query->where('project_manager_id', $request->project_manager_id);
}
if ($request->filled('risk_level')) {
$query->where('risk_level', $request->risk_level);
}
if ($request->filled('search')) {
$search = $request->search;
$query->where('title', 'like', "%{$search}%");
}
$perPage = min((int) $request->input('per_page', 15), 100);
$sortBy = in_array($request->input('sort_by'), ['id', 'title', 'status', 'priority', 'created_at', 'updated_at', 'start_date', 'end_date'], true)
? $request->input('sort_by')
: 'created_at';
$sortDir = $request->input('sort_dir') === 'asc' ? 'asc' : 'desc';
$projects = $query->orderBy($sortBy, $sortDir)->paginate($perPage);
return response()->json([
'success' => true,
'data' => ProjectResource::collection($projects),
'meta' => [
'current_page' => $projects->currentPage(),
'last_page' => $projects->lastPage(),
'per_page' => $projects->perPage(),
'total' => $projects->total(),
],
'message' => 'لیست پروژه‌ها',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در دریافت لیست پروژه‌ها',
], 500);
}
}
public function show(Project $project): JsonResponse
{
try {
$project->load(['projectManager', 'creator', 'department', 'members', 'tasks', 'sprints', 'meetings']);
return response()->json([
'success' => true,
'data' => new ProjectResource($project),
'message' => 'اطلاعات پروژه',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در دریافت اطلاعات پروژه',
], 500);
}
}
public function store(StoreProjectRequest $request): JsonResponse
{
try {
$data = $request->validated();
$data['created_by'] = $request->user()->id;
$project = Project::create($data);
$project->load(['projectManager', 'creator', 'department']);
$this->activityLogService->log(
$request->user()->id,
'create_project',
"پروژه {$project->title} ایجاد شد",
'project',
$project->id,
$project->id,
null,
['project_title' => $project->title]
);
return response()->json([
'success' => true,
'data' => new ProjectResource($project),
'message' => 'پروژه با موفقیت ایجاد شد',
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در ایجاد پروژه',
], 500);
}
}
public function update(UpdateProjectRequest $request, Project $project): JsonResponse
{
try {
$project->update($request->validated());
$project->load(['projectManager', 'creator', 'department']);
$this->activityLogService->log(
$request->user()->id,
'update_project',
"پروژه {$project->title} به‌روزرسانی شد",
'project',
$project->id,
$project->id,
null,
['project_title' => $project->title]
);
return response()->json([
'success' => true,
'data' => new ProjectResource($project->fresh()),
'message' => 'پروژه با موفقیت به‌روزرسانی شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در به‌روزرسانی پروژه',
], 500);
}
}
public function destroy(Request $request, Project $project): JsonResponse
{
try {
$projectTitle = $project->title;
$project->delete();
$this->activityLogService->log(
$request->user()->id,
'delete_project',
"پروژه {$projectTitle} حذف شد",
'project',
$project->id,
$project->id,
null,
['project_title' => $projectTitle]
);
return response()->json([
'success' => true,
'message' => 'پروژه با موفقیت حذف شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در حذف پروژه',
], 500);
}
}
public function archive(Request $request, Project $project): JsonResponse
{
try {
$project->update(['is_archived' => true]);
return response()->json([
'success' => true,
'data' => new ProjectResource($project->fresh()),
'message' => 'پروژه بایگانی شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در بایگانی پروژه',
], 500);
}
}
public function restore(Request $request, Project $project): JsonResponse
{
try {
$project->update(['is_archived' => false]);
return response()->json([
'success' => true,
'data' => new ProjectResource($project->fresh()),
'message' => 'پروژه از بایگانی خارج شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در بازیابی پروژه',
], 500);
}
}
public function addMember(Request $request, Project $project): JsonResponse
{
try {
$request->validate([
'user_id' => 'required|exists:users,id',
'role_in_project' => 'nullable|string',
]);
$project->members()->syncWithoutDetaching([
$request->user_id => [
'role_in_project' => $request->role_in_project ?? 'member',
],
]);
$this->activityLogService->log(
$request->user()->id,
'add_member',
"عضو جدید به پروژه {$project->title} اضافه شد",
'project',
$project->id,
$project->id,
null,
['user_id' => $request->user_id]
);
return response()->json([
'success' => true,
'data' => new ProjectResource($project->fresh()->load(['projectManager', 'creator', 'department', 'members'])),
'message' => 'عضو با موفقیت اضافه شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در اضافه کردن عضو',
], 500);
}
}
public function removeMember(Request $request, Project $project, User $user): JsonResponse
{
try {
$project->members()->detach($user->id);
$this->activityLogService->log(
$request->user()->id,
'remove_member',
"عضو از پروژه {$project->title} حذف شد",
'project',
$project->id,
$project->id,
null,
['user_id' => $user->id]
);
return response()->json([
'success' => true,
'message' => 'عضو با موفقیت حذف شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در حذف عضو',
], 500);
}
}
public function updateProgress(Request $request, Project $project): JsonResponse
{
try {
$progress = $this->projectProgressService->calculateProgress($project->id);
return response()->json([
'success' => true,
'data' => ['progress' => $progress],
'message' => 'پیشرفت پروژه به‌روزرسانی شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در به‌روزرسانی پیشرفت',
], 500);
}
}
}