feat: Deadline Functionality

main
Flycro 2024-03-20 18:07:46 +01:00
parent 5ab2c46335
commit b97f8c785f
2 changed files with 131 additions and 0 deletions

View File

@ -0,0 +1,104 @@
<?php
namespace App\Http\Controllers;
use App\Models\Deadline;
use App\Models\UserDeadline;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class DeadlineController extends Controller
{
public function index()
{
$userId = Auth::id();
$deadlines = Deadline::with(['bookRecommendation' => 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.']);
}
}

27
app/Models/Deadline.php Normal file
View File

@ -0,0 +1,27 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Deadline extends Model
{
use HasFactory;
protected $fillable = [
'book_recommendation_id',
'deadline',
'target_page',
'target_chapter',
];
public function bookRecommendation()
{
return $this->belongsTo(BookRecommendation::class);
}
public function userDeadlines()
{
return $this->hasMany(UserDeadline::class);
}
}