From b97f8c785f95871285618ab4af1a8c376a773a98 Mon Sep 17 00:00:00 2001 From: Flycro Date: Wed, 20 Mar 2024 18:07:46 +0100 Subject: [PATCH] feat: Deadline Functionality --- app/Http/Controllers/DeadlineController.php | 104 ++++++++++++++++++++ app/Models/Deadline.php | 27 +++++ 2 files changed, 131 insertions(+) create mode 100644 app/Http/Controllers/DeadlineController.php create mode 100644 app/Models/Deadline.php diff --git a/app/Http/Controllers/DeadlineController.php b/app/Http/Controllers/DeadlineController.php new file mode 100644 index 0000000..ca29630 --- /dev/null +++ b/app/Http/Controllers/DeadlineController.php @@ -0,0 +1,104 @@ + function ($query) { + $query->where('status', 'active'); + }, 'userDeadlines']) + ->get(); + + + $deadlines->each(function ($deadline) use ($userId) { + UserDeadline::firstOrCreate([ + 'user_id' => $userId, + 'deadline_id' => $deadline->id, + ], [ + 'completed_at' => null, // Default value, indicating not completed + ]); + }); + + $deadlinesWithAllUserProgress = Deadline::with(['bookRecommendation', 'userDeadlines.user']) + ->get(); + + return response()->json($deadlinesWithAllUserProgress); + } + + public function deadlinesByBookRecommendation($bookRecommendationId) + { + $userId = Auth::id(); + $refetch = false; + + $deadlines = Deadline::with(['userDeadlines' => function ($query) use ($userId) { + $query->where('user_id', $userId); + }, 'userDeadlines.user']) + ->where('book_recommendation_id', $bookRecommendationId) + ->get(); + + $deadlines->each(function ($deadline) use ($userId, &$refetch) { + UserDeadline::firstOrCreate([ + 'user_id' => $userId, + 'deadline_id' => $deadline->id, + ], [ + 'completed_at' => null, // Default to not completed. + ]); + $refetch = true; + }); + + if ($refetch) { + $deadlines = Deadline::with(['userDeadlines' => function ($query) use ($userId) { + $query->where('user_id', $userId); + }, 'userDeadlines.user']) + ->where('book_recommendation_id', $bookRecommendationId) + ->get(); + } + + return response()->json($deadlines); + } + + public function createDeadline(Request $request) + { + $validated = $request->validate([ + 'book_recommendation_id' => 'required|integer|exists:book_recommendations,id', + 'deadline' => 'required|date', + 'target_page' => 'nullable|integer', + 'target_chapter' => 'nullable|string|max:255', + ]); + + if (!(auth()->user()->hasRole('admin')) ) { + return response()->json(['message' => 'Keine Berechtigung.'], 403); + } + + $deadline = new Deadline($validated); + $deadline->save(); + + return response()->json([ + 'message' => 'Deadline created successfully.', + 'deadline' => $deadline, + ], 201); + } + + + public function updateUserDeadline(Request $request, $deadlineId) + { + $userId = Auth::id(); + $userDeadline = UserDeadline::where('deadline_id', $deadlineId) + ->where('user_id', $userId) + ->firstOrFail(); + + $userDeadline->completed_at = now(); // Mark as completed + $userDeadline->save(); + + return response()->json(['message' => 'Deadline marked as completed successfully.']); + } +} diff --git a/app/Models/Deadline.php b/app/Models/Deadline.php new file mode 100644 index 0000000..39bc034 --- /dev/null +++ b/app/Models/Deadline.php @@ -0,0 +1,27 @@ +belongsTo(BookRecommendation::class); + } + public function userDeadlines() + { + return $this->hasMany(UserDeadline::class); + } +}