205 lines
6.5 KiB
PHP
Executable File
205 lines
6.5 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\PackageName;
|
|
use App\Models\Reminder;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use App\ReminderType;
|
|
use Illuminate\Validation\Rules\Enum;
|
|
|
|
class ReminderController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$request->validate([
|
|
'type' => ['nullable', new Enum(ReminderType::class)],
|
|
'package_name' => ['nullable', 'exists:package_names,name'],
|
|
]);
|
|
|
|
$reminders = Reminder::query()
|
|
->where('user_id', Auth::id())
|
|
->when($request->type, function ($q) use ($request) {
|
|
$q->where('type', $request->type);
|
|
})
|
|
->when($request->package_name, function ($q) use ($request) {
|
|
$q->whereHas('packageName', function ($q2) use ($request) {
|
|
$q2->where('name', $request->package_name);
|
|
});
|
|
})
|
|
->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);
|
|
}
|
|
|
|
}
|