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

307 خطوط
11 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\StoreMeetingRequest;
use App\Http\Resources\MeetingResource;
use App\Http\Resources\MeetingActionItemResource;
use App\Http\Resources\TaskResource;
use App\Models\Meeting;
use App\Models\MeetingActionItem;
use App\Models\Task;
use App\Models\User;
use App\Services\NotificationService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class MeetingController extends Controller
{
public function __construct(protected NotificationService $notificationService) {}
public function index(Request $request): JsonResponse
{
try {
$query = Meeting::with(['project', 'creator', 'participants']);
if ($request->filled('project_id')) {
$query->where('project_id', $request->project_id);
}
if ($request->filled('date_from')) {
$query->whereDate('date', '>=', $request->date_from);
}
if ($request->filled('date_to')) {
$query->whereDate('date', '<=', $request->date_to);
}
if ($request->filled('meeting_type')) {
$query->where('meeting_type', $request->meeting_type);
}
$perPage = $request->input('per_page', 15);
$sortBy = $request->input('sort_by', 'date');
$sortDir = $request->input('sort_dir', 'desc');
$meetings = $query->orderBy($sortBy, $sortDir)->paginate($perPage);
return response()->json([
'success' => true,
'data' => MeetingResource::collection($meetings),
'meta' => [
'current_page' => $meetings->currentPage(),
'last_page' => $meetings->lastPage(),
'per_page' => $meetings->perPage(),
'total' => $meetings->total(),
],
'message' => 'لیست جلسات',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در دریافت جلسات',
], 500);
}
}
public function show(Meeting $meeting): JsonResponse
{
try {
$meeting->load(['project', 'creator', 'participants', 'actionItems.assignee']);
return response()->json([
'success' => true,
'data' => new MeetingResource($meeting),
'message' => 'اطلاعات جلسه',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در دریافت اطلاعات جلسه',
], 500);
}
}
public function store(StoreMeetingRequest $request): JsonResponse
{
try {
$data = $request->validated();
$data['created_by'] = $request->user()->id;
$meeting = Meeting::create($data);
$meeting->load(['project', 'creator']);
return response()->json([
'success' => true,
'data' => new MeetingResource($meeting),
'message' => 'جلسه با موفقیت ایجاد شد',
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در ایجاد جلسه',
], 500);
}
}
public function update(Request $request, Meeting $meeting): JsonResponse
{
try {
$request->validate([
'title' => 'sometimes|required|string|max:255',
'date' => 'sometimes|required|date',
'start_time' => 'nullable',
'end_time' => 'nullable',
'meeting_type' => 'sometimes|required|string|max:50',
'location' => 'nullable|string',
'meeting_link' => 'nullable|string',
'agenda' => 'nullable|string',
'notes' => 'nullable|string',
'decisions' => 'nullable|string',
]);
$meeting->update($request->only([
'title', 'date', 'start_time', 'end_time', 'meeting_type',
'location', 'meeting_link', 'agenda', 'notes', 'decisions'
]));
$meeting->load(['project', 'creator']);
return response()->json([
'success' => true,
'data' => new MeetingResource($meeting->fresh()),
'message' => 'جلسه به‌روزرسانی شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در به‌روزرسانی جلسه',
], 500);
}
}
public function destroy(Meeting $meeting): JsonResponse
{
try {
$meeting->delete();
return response()->json([
'success' => true,
'message' => 'جلسه حذف شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در حذف جلسه',
], 500);
}
}
public function addParticipant(Request $request, Meeting $meeting): JsonResponse
{
try {
$request->validate(['user_id' => 'required|exists:users,id']);
$meeting->participants()->syncWithoutDetaching([$request->user_id]);
$this->notificationService->create(
$request->user_id,
'meeting_assigned',
[
'meeting_id' => $meeting->id,
'project_id' => $meeting->project_id,
'url' => '/meetings',
'notifiable_type' => 'App\\Models\\Meeting',
'notifiable_id' => $meeting->id,
],
"شما به جلسه {$meeting->title} اضافه شدید"
);
return response()->json([
'success' => true,
'message' => 'شرکت‌کننده اضافه شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در اضافه کردن شرکت‌کننده',
], 500);
}
}
public function removeParticipant(Meeting $meeting, User $user): JsonResponse
{
try {
$meeting->participants()->detach($user->id);
return response()->json([
'success' => true,
'message' => 'شرکت‌کننده حذف شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در حذف شرکت‌کننده',
], 500);
}
}
public function addActionItem(Request $request, Meeting $meeting): JsonResponse
{
try {
$request->validate([
'title' => 'required|string|max:255',
'assigned_to' => 'nullable|exists:users,id',
'due_date' => 'nullable|date',
]);
$actionItem = $meeting->actionItems()->create([
'title' => $request->title,
'assigned_to' => $request->assigned_to,
'due_date' => $request->due_date,
'is_completed' => false,
]);
$actionItem->load('assignee');
if ($actionItem->assigned_to) {
$this->notificationService->create(
$actionItem->assigned_to,
'meeting_action_assigned',
[
'meeting_id' => $meeting->id,
'action_item_id' => $actionItem->id,
'url' => '/meetings',
'notifiable_type' => 'App\\Models\\MeetingActionItem',
'notifiable_id' => $actionItem->id,
],
"اقدام جلسه {$actionItem->title} به شما اختصاص داده شد"
);
}
return response()->json([
'success' => true,
'data' => new MeetingActionItemResource($actionItem),
'message' => 'ایتم اقدام ایجاد شد',
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در ایجاد ایتم اقدام',
], 500);
}
}
public function updateActionItem(Request $request, Meeting $meeting, MeetingActionItem $actionItem): JsonResponse
{
try {
$request->validate([
'title' => 'sometimes|required|string|max:255',
'assigned_to' => 'nullable|exists:users,id',
'due_date' => 'nullable|date',
'is_completed' => 'nullable|boolean',
]);
$actionItem->update($request->only(['title', 'assigned_to', 'due_date', 'is_completed']));
$actionItem->load('assignee');
return response()->json([
'success' => true,
'data' => new MeetingActionItemResource($actionItem->fresh()),
'message' => 'ایتم اقدام به‌روزرسانی شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در به‌روزرسانی ایتم اقدام',
], 500);
}
}
public function convertActionItemToTask(Request $request, Meeting $meeting, MeetingActionItem $actionItem): JsonResponse
{
try {
$request->validate([
'project_id' => 'required|exists:projects,id',
]);
$task = Task::create([
'title' => $actionItem->title,
'project_id' => $request->project_id,
'assignee_id' => $actionItem->assigned_to,
'reporter_id' => $request->user()->id,
'created_by' => $request->user()->id,
'due_date' => $actionItem->due_date,
'status' => 'todo',
]);
$actionItem->update(['converted_to_task_id' => $task->id]);
$task->load(['project', 'assignee']);
return response()->json([
'success' => true,
'data' => new TaskResource($task),
'message' => 'ایتم اقدام به وظیفه تبدیل شد',
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'خطا در تبدیل ایتم اقدام به وظیفه',
], 500);
}
}
}