Files
approagency/app/Http/Controllers/ReminderController.php
T
2025-12-18 18:16:23 +03:30

191 lines
5.9 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\PackageName;
use App\Models\Reminder;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Enums\ReminderType;
use Illuminate\Validation\Rules\Enum;
class ReminderController extends Controller
{
public function index()
{
$reminders = Reminder::where('user_id', Auth::id())
->orderBy('time')
->get();
return response()->json($reminders);
}
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required|string|max:255',
'description' => 'nullable|string|max:500',
'time' => 'required|date',
'repeatable' => 'boolean',
'repeat_days' => 'nullable|integer|min:1',
'data' => 'nullable|array',
'type' => ['required', new Enum(ReminderType::class)],
]);
$packageNameData = $request->validate([
'package_name' => 'required|exists:package_names,name',
]);
if (!$packageName = PackageName::with('products')->where('name', $packageNameData['package_name'])->first()) {
return response()->json([
'message' => 'package name not found'
], 404);
}
$reminder = Reminder::create([...$data, 'package_name_id' => $packageName->id, 'user_id' => auth()->user()->id]);
return $reminder;
}
public function show(Reminder $reminder)
{
$this->authorizeReminder($reminder);
return response()->json($reminder);
}
public function update(Request $request, Reminder $reminder)
{
$this->authorizeReminder($reminder);
$data = $request->validate([
'title' => 'sometimes|string|max:255',
'description' => 'nullable|string|max:500',
'time' => 'sometimes|date',
'repeatable' => 'boolean',
'repeat_days' => 'nullable|integer|min:1',
'data' => 'nullable|array',
'type' => ['sometimes', new Enum(ReminderType::class)],
]);
$packageNameData = $request->validate([
'package_name' => 'required|exists:package_names,name',
]);
if (!$packageName = PackageName::with('products')->where('name', $packageNameData['package_name'])->first()) {
return response()->json([
'message' => 'package name not found'
], 404);
}
$reminder->update([...$data, 'package_name_id' => $packageName->id]);
return response()->json($reminder);
}
public function destroy(Reminder $reminder)
{
$this->authorizeReminder($reminder);
$reminder->delete();
return response()->json(null, 204);
}
private function authorizeReminder(Reminder $reminder)
{
if ($reminder->user_id !== Auth::id()) {
abort(403, 'Unauthorized action.');
}
}
public function packageIndex(PackageName $packageName)
{
// Get package-wide reminders (user_id = null) for this package
$reminders = Reminder::where('package_name_id', $packageName->id)
->whereNull('user_id')
->orderBy('time')
->get();
return response()->json($reminders);
}
public function packageStore(Request $request, PackageName $packageName)
{
$data = $request->validate([
'title' => 'required|string|max:255',
'description' => 'nullable|string|max:500',
'time' => 'required|date',
'repeatable' => 'boolean',
'repeat_days' => 'nullable|integer|min:1',
'data' => 'nullable|array',
'type' => ['required', new Enum(ReminderType::class)],
]);
$reminder = Reminder::create([
...$data,
'package_name_id' => $packageName->id,
'user_id' => null
]);
return response()->json($reminder, 201);
}
public function packageUpdate(Request $request, PackageName $packageName, Reminder $reminder)
{
// Basic checks
if (!auth()->check()) {
return response()->json(['message' => 'Unauthorized'], 401);
}
if ($reminder->user_id !== null) {
return response()->json(['message' => 'This is not a package-wide reminder'], 400);
}
if ($reminder->package_name_id !== $packageName->id) {
return response()->json(['message' => 'This reminder does not belong to this package'], 403);
}
$data = $request->validate([
'title' => 'sometimes|string|max:255',
'description' => 'nullable|string|max:500',
'time' => 'sometimes|date',
'repeatable' => 'boolean',
'repeat_days' => 'nullable|integer|min:1',
'data' => 'nullable|array',
'type' => ['sometimes', new Enum(ReminderType::class)],
]);
// If time is being updated, reset last_repeat to null
if (isset($data['time']) && $reminder->time != $data['time']) {
$data['last_repeat'] = null;
}
$reminder->update($data);
return response()->json($reminder);
}
public function packageDestroy(PackageName $packageName, Reminder $reminder)
{
// Basic checks
if (!auth()->check()) {
return response()->json(['message' => 'Unauthorized'], 401);
}
if ($reminder->user_id !== null) {
return response()->json(['message' => 'This is not a package-wide reminder'], 400);
}
if ($reminder->package_name_id !== $packageName->id) {
return response()->json(['message' => 'This reminder does not belong to this package'], 403);
}
$reminder->delete();
return response()->json(null, 204);
}
}