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', ]); $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', ]); $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', ]); $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', ]); // 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); } }