From f353e0c96470187488b97275d0825a16792d5e6f Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Sun, 9 Nov 2025 16:17:10 +0100 Subject: [PATCH 01/16] Creation table tasks --- app/Http/Controllers/TasksController.php | 46 +++++++++++++++++++ app/Models/Events.php | 4 ++ app/Models/Task.php | 25 ++++++++++ .../2025_11_09_144248_create_tasks_table.php | 37 +++++++++++++++ routes/api.php | 3 ++ tests/Events/tasks/create event task.bru | 32 +++++++++++++ tests/Events/tasks/folder.bru | 8 ++++ 7 files changed, 155 insertions(+) create mode 100644 app/Http/Controllers/TasksController.php create mode 100644 app/Models/Task.php create mode 100644 database/migrations/2025_11_09_144248_create_tasks_table.php create mode 100644 tests/Events/tasks/create event task.bru create mode 100644 tests/Events/tasks/folder.bru diff --git a/app/Http/Controllers/TasksController.php b/app/Http/Controllers/TasksController.php new file mode 100644 index 0000000..cb9f5b4 --- /dev/null +++ b/app/Http/Controllers/TasksController.php @@ -0,0 +1,46 @@ +isAdmin($request->user()->role)){ + return response()->json(["message" => "Can't create task"], 403); + } + + try { + + $event = Events::find($request["event_id"]); + + $event->tasks()->create([ + "name" => $request["name"], + "description" => $request["description"], + "start" => $request["start"], + "end" => $request["end"], + "location" => $request["location"], + "max_participants" => $request["max_participants"], + ]); + + + return response()->json(['message' => "Task created"], 200); + + } catch(\Exception $e) { + Log::info($e->getMessage()); + return response()->json(['message' => "Server error"], 500); + } + } +} diff --git a/app/Models/Events.php b/app/Models/Events.php index 4a589cc..ba500fe 100644 --- a/app/Models/Events.php +++ b/app/Models/Events.php @@ -12,4 +12,8 @@ class Events extends Model "name", "description", ]; + + public function tasks() { + return $this->hasMany(Task::class); + } } diff --git a/app/Models/Task.php b/app/Models/Task.php new file mode 100644 index 0000000..3a4af85 --- /dev/null +++ b/app/Models/Task.php @@ -0,0 +1,25 @@ + */ + use HasFactory; + + protected $fillable = [ + 'name', + 'start', + 'end', + 'location', + 'description', + 'max_participants', + ]; + + public function event() { + return $this->belongsTo(Events::class); + } +} diff --git a/database/migrations/2025_11_09_144248_create_tasks_table.php b/database/migrations/2025_11_09_144248_create_tasks_table.php new file mode 100644 index 0000000..e6ce615 --- /dev/null +++ b/database/migrations/2025_11_09_144248_create_tasks_table.php @@ -0,0 +1,37 @@ +id(); + + $table->string('name'); + $table->string('description'); + $table->string('location'); + $table->dateTime("start"); + $table->dateTime("end"); + $table->integer('max_participants'); + + $table->foreignId("events_id")->constrained("events")->onDelete("cascade"); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tasks'); + } +}; diff --git a/routes/api.php b/routes/api.php index 0e32da9..91372b0 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,6 +3,7 @@ use App\Http\Controllers\AuthController; use App\Http\Controllers\UserController; use App\Http\Controllers\EventsController; +use App\Http\Controllers\TasksController; use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; @@ -33,3 +34,5 @@ Route::middleware(['web', 'auth:sanctum'])->post('/users/{id}/role', [UserContro Route::middleware(['web', 'auth:sanctum'])->get('/users', [UserController::class, "getUsers"]); Route::middleware(['web', 'auth:sanctum'])->post('/events/create', [EventsController::class, "create"]); + +Route::middleware(['web', 'auth:sanctum'])->post('/events/task', [TasksController::class, "create"]); diff --git a/tests/Events/tasks/create event task.bru b/tests/Events/tasks/create event task.bru new file mode 100644 index 0000000..6bcc342 --- /dev/null +++ b/tests/Events/tasks/create event task.bru @@ -0,0 +1,32 @@ +meta { + name: create event task + type: http + seq: 1 +} + +post { + url: {{url}}/api/events/task + body: json + auth: inherit +} + +headers { + X-XSRF-TOKEN: +} + +body:json { + { + "event_id": 1, + "name": "test", + "location": "location test", + "description": "desc test", + "start": "2025-11-09 15:30:00", + "end": "2025-11-09 15:30:00", + "max_participants": 10 + } +} + +settings { + encodeUrl: true + timeout: 0 +} diff --git a/tests/Events/tasks/folder.bru b/tests/Events/tasks/folder.bru new file mode 100644 index 0000000..7e05219 --- /dev/null +++ b/tests/Events/tasks/folder.bru @@ -0,0 +1,8 @@ +meta { + name: tasks + seq: 2 +} + +auth { + mode: inherit +} From 71fc82a0e7c5a9b3e11604c50d592f4dc7192a29 Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Fri, 14 Nov 2025 09:46:57 +0100 Subject: [PATCH 02/16] Create relationship task_user --- app/Models/Task.php | 7 ++++- app/Models/User.php | 4 +++ .../2025_11_14_081656_task_user.php | 30 +++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 database/migrations/2025_11_14_081656_task_user.php diff --git a/app/Models/Task.php b/app/Models/Task.php index 3a4af85..353ea54 100644 --- a/app/Models/Task.php +++ b/app/Models/Task.php @@ -5,7 +5,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -class Task extends Model +class Task extends Model { /** @use HasFactory<\Database\Factories\TaskFactory> */ use HasFactory; @@ -22,4 +22,9 @@ class Task extends Model public function event() { return $this->belongsTo(Events::class); } + + public function users() { + return $this->belongsToMany(User::class); + } + } diff --git a/app/Models/User.php b/app/Models/User.php index 248234b..b5c61df 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -50,4 +50,8 @@ class User extends Authenticatable 'password' => 'hashed', ]; } + + public function tasks() { + return $this->belongsToMany(Task::class); + } } diff --git a/database/migrations/2025_11_14_081656_task_user.php b/database/migrations/2025_11_14_081656_task_user.php new file mode 100644 index 0000000..0403a79 --- /dev/null +++ b/database/migrations/2025_11_14_081656_task_user.php @@ -0,0 +1,30 @@ +id(); + $table->foreignId('task_id')->constrained()->onDelete('cascade'); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->timestamps(); + }); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; From 55f332d28ef1a75b31aa0b506123c967d790d3b3 Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Fri, 14 Nov 2025 09:47:13 +0100 Subject: [PATCH 03/16] Create assign task route --- app/Http/Controllers/TasksController.php | 20 ++++++++++++++++ routes/api.php | 2 ++ tests/Events/tasks/Assign task.bru | 30 ++++++++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 tests/Events/tasks/Assign task.bru diff --git a/app/Http/Controllers/TasksController.php b/app/Http/Controllers/TasksController.php index cb9f5b4..454552a 100644 --- a/app/Http/Controllers/TasksController.php +++ b/app/Http/Controllers/TasksController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Models\Events; +use App\Models\Task; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; @@ -43,4 +44,23 @@ class TasksController extends Controller return response()->json(['message' => "Server error"], 500); } } + + public function assignSelf(Request $request): JsonResponse { + + try { + + $task = Task::find($request["task_id"]); + + if($task->max_participants = $task->users()->count()) { + return response()->json(["message" => "Max participants reached"], 403); + } + + $task->users()->attach($request->user()->id); + return response()->json(['message' => "Task assigned"], 200); + + } catch (\Exception $e) { + Log::info($e->getMessage()); + return response()->json(['message' => "Server error"], 500); + } + } } diff --git a/routes/api.php b/routes/api.php index 91372b0..bc3aa52 100644 --- a/routes/api.php +++ b/routes/api.php @@ -36,3 +36,5 @@ Route::middleware(['web', 'auth:sanctum'])->get('/users', [UserController::class Route::middleware(['web', 'auth:sanctum'])->post('/events/create', [EventsController::class, "create"]); Route::middleware(['web', 'auth:sanctum'])->post('/events/task', [TasksController::class, "create"]); + +Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign', [TasksController::class, "assignSelf"]); diff --git a/tests/Events/tasks/Assign task.bru b/tests/Events/tasks/Assign task.bru new file mode 100644 index 0000000..f8a4143 --- /dev/null +++ b/tests/Events/tasks/Assign task.bru @@ -0,0 +1,30 @@ +meta { + name: Assign task + type: http + seq: 2 +} + +post { + url: {{url}}/api/events/task/assign + body: json + auth: inherit +} + +headers { + X-XSRF-TOKEN: +} + +body:json { + { + "task_id": "{{taskId}}" + } +} + +vars:pre-request { + taskId: 1 +} + +settings { + encodeUrl: true + timeout: 0 +} From 827ade852e7bf5e76758266bdda3fea0fb1467e8 Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Fri, 14 Nov 2025 12:22:59 +0100 Subject: [PATCH 04/16] Create assign task to user route --- app/Http/Controllers/TasksController.php | 27 +++++++++++++++++++ routes/api.php | 2 ++ tests/Events/tasks/Assign task to user.bru | 31 ++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 tests/Events/tasks/Assign task to user.bru diff --git a/app/Http/Controllers/TasksController.php b/app/Http/Controllers/TasksController.php index 454552a..b1e98f2 100644 --- a/app/Http/Controllers/TasksController.php +++ b/app/Http/Controllers/TasksController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Models\Events; use App\Models\Task; +use App\Models\User; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; @@ -63,4 +64,30 @@ class TasksController extends Controller return response()->json(['message' => "Server error"], 500); } } + + public function assignUser(request $request, int $id): JsonResponse { + + if(!$this->isAdmin($request->user()->role)){ + return response()->json(["message" => "Can't create task"], 403); + } + + try { + + $task = Task::find($request["task_id"]); + + if($task->max_participants = $task->users()->count()) { + return response()->json(["message" => "Max participants reached"], 403); + } + + $user = User::find($id); + + if($user) $task->users()->attach($id); + + return response()->json(['message' => "Task assigned"], 200); + + } catch(\Exception $e) { + Log::info($e->getMessage()); + return response()->json(['message' => "Server error"], 500); + } + } } diff --git a/routes/api.php b/routes/api.php index bc3aa52..7f7a8b5 100644 --- a/routes/api.php +++ b/routes/api.php @@ -38,3 +38,5 @@ Route::middleware(['web', 'auth:sanctum'])->post('/events/create', [EventsContro Route::middleware(['web', 'auth:sanctum'])->post('/events/task', [TasksController::class, "create"]); Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign', [TasksController::class, "assignSelf"]); + +Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign/{id}', [TasksController::class, "assignUser"]); diff --git a/tests/Events/tasks/Assign task to user.bru b/tests/Events/tasks/Assign task to user.bru new file mode 100644 index 0000000..9b4dd97 --- /dev/null +++ b/tests/Events/tasks/Assign task to user.bru @@ -0,0 +1,31 @@ +meta { + name: Assign task to user + type: http + seq: 3 +} + +post { + url: {{url}}/api/events/task/assign/{{id}} + body: json + auth: inherit +} + +headers { + X-XSRF-TOKEN: eyJpdiI6Im9TOXR2dG96amtTazVlRDh0dkRLZGc9PSIsInZhbHVlIjoiaWgyNG13UXpMRnRVRlRTVTFmOVN5b20rWjhSOEdhUEFRUEo5Qm9ZUDYybTZhSnJxWjEzNWN1cEhVRm9yc3c2UE1tNkZnNFpJZHZUTXVkSC92VnFvZ0ZXT3dLNGRrT2FIRzdvdFZyTFV4M3VlMlM5MmlOc2FkVGhDeUJQczBLdS8iLCJtYWMiOiIyYWY5NjBiZjJlOTZhM2UxNGU5MDg1YTIwNTIzZjFjNzQyNDAzODYwMDI4MzFkOGM2ZWQyNTlkZWVkZjg3MzhhIiwidGFnIjoiIn0= +} + +body:json { + { + "task_id": "{{task_id}}" + } +} + +vars:pre-request { + id: 2 + task_id: 2 +} + +settings { + encodeUrl: true + timeout: 0 +} From ad0f51c405ee9f573a1371c8aae58bad33843925 Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Sun, 16 Nov 2025 01:53:46 +0100 Subject: [PATCH 05/16] Add /me route --- routes/api.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/routes/api.php b/routes/api.php index 7f7a8b5..cfa98d0 100644 --- a/routes/api.php +++ b/routes/api.php @@ -17,6 +17,10 @@ Route::post("/users/register", [UserController::class, "create"]); Route::middleware('web')->post('/users/login', [AuthController::class, 'login']); +Route::middleware(['web', 'auth:sanctum'])->get('/me', function (Request $request) { + return $request->user(); +}); + Route::middleware(['web', 'auth:sanctum'])->post('/users/logout', [AuthController::class, 'logout']); Route::middleware(['web', 'auth:sanctum'])->delete('/users', [UserController::class, "delete"]); From fd65cfdc1c2b8df5a618e3eb25edf5c79c483eb3 Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Thu, 20 Nov 2025 11:23:21 +0100 Subject: [PATCH 06/16] fix max participant reached --- app/Http/Controllers/TasksController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/TasksController.php b/app/Http/Controllers/TasksController.php index b1e98f2..3a3a1b4 100644 --- a/app/Http/Controllers/TasksController.php +++ b/app/Http/Controllers/TasksController.php @@ -75,7 +75,7 @@ class TasksController extends Controller $task = Task::find($request["task_id"]); - if($task->max_participants = $task->users()->count()) { + if($task->max_participants === $task->users()->count()) { return response()->json(["message" => "Max participants reached"], 403); } From feb901c9e823ca87c4e035f31596127c8e798a1a Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Thu, 20 Nov 2025 11:23:56 +0100 Subject: [PATCH 07/16] Add get user's tasks route --- app/Http/Controllers/UserController.php | 10 +++++++++ routes/api.php | 24 ++++++++++++++-------- tests/Events/tasks/Assign task to user.bru | 8 ++------ tests/Events/tasks/Assign task.bru | 4 ---- tests/Events/tasks/create event task.bru | 10 +++------ tests/Users/Get user tasks.bru | 16 +++++++++++++++ 6 files changed, 47 insertions(+), 25 deletions(-) create mode 100644 tests/Users/Get user tasks.bru diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 0c97cb4..32792c2 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -151,4 +151,14 @@ class UserController extends Controller return response()->json(['message' => "Server error"], 500); } } + + public function getUserTasks(Request $request): JsonResponse { + + try { + return response()->json(['data' => $request->user()->tasks]); + } catch (\Exception $e) { + Log::info($e->getMessage()); + return response()->json(['message' => "Server error"], 500); + } + } } diff --git a/routes/api.php b/routes/api.php index 399bb5f..2b74a08 100644 --- a/routes/api.php +++ b/routes/api.php @@ -18,7 +18,7 @@ Route::post("/users/register", [UserController::class, "create"]); Route::middleware('web')->post('/users/login', [AuthController::class, 'login']); -Route::middleware(['web', 'auth:sanctum'])->get('/me', function (Request $request) { +Route::middleware(['web', 'auth:sanctum'])->get('/users/me', function (Request $request) { return $request->user(); }); @@ -26,15 +26,19 @@ Route::middleware(['web', 'auth:sanctum'])->post('/users/logout', [AuthControlle Route::middleware(['web', 'auth:sanctum'])->delete('/users', [UserController::class, "delete"]); -Route::middleware(['web', 'auth:sanctum'])->delete('/users/{id}', [UserController::class, "deleteById"]); +Route::middleware(['web', 'auth:sanctum'])->delete('/users/{id}', [UserController::class, "deleteById"]) + ->whereNumber('id'); -Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}', [UserController::class, "getUser"]); +Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}', [UserController::class, "getUser"]) + ->whereNumber('id'); Route::middleware(['web', 'auth:sanctum'])->post('/users/update', [UserController::class, "update"]); -Route::middleware(['web', 'auth:sanctum'])->post('/users/{id}/validate', [UserController::class, "validate"]); +Route::middleware(['web', 'auth:sanctum'])->post('/users/{id}/validate', [UserController::class, "validate"]) + ->whereNumber('id'); -Route::middleware(['web', 'auth:sanctum'])->post('/users/{id}/role', [UserController::class, "addRole"]); +Route::middleware(['web', 'auth:sanctum'])->post('/users/{id}/role', [UserController::class, "addRole"]) + ->whereNumber('id'); Route::middleware(['web', 'auth:sanctum'])->get('/users', [UserController::class, "getUsers"]); @@ -44,9 +48,13 @@ Route::middleware(['web', 'auth:sanctum'])->post('/events/task', [TasksControlle Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign', [TasksController::class, "assignSelf"]); -Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign/{id}', [TasksController::class, "assignUser"]); +Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign/{id}', [TasksController::class, "assignUser"]) + ->whereNumber('id'); -Route::post("/users/{id}/create/notification", [NotificationsController::class, "create"]); +Route::post("/users/{id}/create/notification", [NotificationsController::class, "create"]) + ->whereNumber('id'); -Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}/notifications', [NotificationsController::class, "getNotifications"]); +Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}/notifications', [NotificationsController::class, "getNotifications"]) + ->whereNumber('id'); +Route::middleware(['web', 'auth:sanctum'])->get('/users/tasks', [UserController::class, "getUserTasks"]); diff --git a/tests/Events/tasks/Assign task to user.bru b/tests/Events/tasks/Assign task to user.bru index 9b4dd97..15cf31b 100644 --- a/tests/Events/tasks/Assign task to user.bru +++ b/tests/Events/tasks/Assign task to user.bru @@ -10,10 +10,6 @@ post { auth: inherit } -headers { - X-XSRF-TOKEN: eyJpdiI6Im9TOXR2dG96amtTazVlRDh0dkRLZGc9PSIsInZhbHVlIjoiaWgyNG13UXpMRnRVRlRTVTFmOVN5b20rWjhSOEdhUEFRUEo5Qm9ZUDYybTZhSnJxWjEzNWN1cEhVRm9yc3c2UE1tNkZnNFpJZHZUTXVkSC92VnFvZ0ZXT3dLNGRrT2FIRzdvdFZyTFV4M3VlMlM5MmlOc2FkVGhDeUJQczBLdS8iLCJtYWMiOiIyYWY5NjBiZjJlOTZhM2UxNGU5MDg1YTIwNTIzZjFjNzQyNDAzODYwMDI4MzFkOGM2ZWQyNTlkZWVkZjg3MzhhIiwidGFnIjoiIn0= -} - body:json { { "task_id": "{{task_id}}" @@ -21,8 +17,8 @@ body:json { } vars:pre-request { - id: 2 - task_id: 2 + id: 1 + task_id: 3 } settings { diff --git a/tests/Events/tasks/Assign task.bru b/tests/Events/tasks/Assign task.bru index f8a4143..74cda3e 100644 --- a/tests/Events/tasks/Assign task.bru +++ b/tests/Events/tasks/Assign task.bru @@ -10,10 +10,6 @@ post { auth: inherit } -headers { - X-XSRF-TOKEN: -} - body:json { { "task_id": "{{taskId}}" diff --git a/tests/Events/tasks/create event task.bru b/tests/Events/tasks/create event task.bru index 6bcc342..4f00dd7 100644 --- a/tests/Events/tasks/create event task.bru +++ b/tests/Events/tasks/create event task.bru @@ -10,16 +10,12 @@ post { auth: inherit } -headers { - X-XSRF-TOKEN: -} - body:json { { "event_id": 1, - "name": "test", - "location": "location test", - "description": "desc test", + "name": "test12", + "location": "blahhhhh", + "description": "blouuuuuuuuuuh", "start": "2025-11-09 15:30:00", "end": "2025-11-09 15:30:00", "max_participants": 10 diff --git a/tests/Users/Get user tasks.bru b/tests/Users/Get user tasks.bru new file mode 100644 index 0000000..0b7f05e --- /dev/null +++ b/tests/Users/Get user tasks.bru @@ -0,0 +1,16 @@ +meta { + name: Get user tasks + type: http + seq: 9 +} + +get { + url: {{url}}/api/users/tasks + body: none + auth: inherit +} + +settings { + encodeUrl: true + timeout: 0 +} From d142979e497071d8705502aa0839267bd9caf513 Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Thu, 20 Nov 2025 12:09:17 +0100 Subject: [PATCH 08/16] Split routes --- app/Providers/AppServiceProvider.php | 5 ++- routes/api.php | 51 ---------------------------- routes/auth.php | 12 +++++++ routes/events.php | 14 ++++++++ routes/users.php | 41 ++++++++++++++++++++++ 5 files changed, 71 insertions(+), 52 deletions(-) create mode 100644 routes/auth.php create mode 100644 routes/events.php create mode 100644 routes/users.php diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b6..1187d01 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use Illuminate\Support\ServiceProvider; +use Illuminate\Support\Facades\Route; class AppServiceProvider extends ServiceProvider { @@ -19,6 +20,8 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { - // + Route::middleware('api')->prefix('api')->group(base_path('routes/users.php')); + Route::middleware('api')->prefix('api')->group(base_path('routes/auth.php')); + Route::middleware('api')->prefix('api')->group(base_path('routes/events.php')); } } diff --git a/routes/api.php b/routes/api.php index 2b74a08..295aea6 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,60 +1,9 @@ get('/me', fn (Request $r) => $r->user()); - -Route::post("/users/register", [UserController::class, "create"]); - -Route::middleware('web')->post('/users/login', [AuthController::class, 'login']); - -Route::middleware(['web', 'auth:sanctum'])->get('/users/me', function (Request $request) { - return $request->user(); -}); - -Route::middleware(['web', 'auth:sanctum'])->post('/users/logout', [AuthController::class, 'logout']); - -Route::middleware(['web', 'auth:sanctum'])->delete('/users', [UserController::class, "delete"]); - -Route::middleware(['web', 'auth:sanctum'])->delete('/users/{id}', [UserController::class, "deleteById"]) - ->whereNumber('id'); - -Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}', [UserController::class, "getUser"]) - ->whereNumber('id'); - -Route::middleware(['web', 'auth:sanctum'])->post('/users/update', [UserController::class, "update"]); - -Route::middleware(['web', 'auth:sanctum'])->post('/users/{id}/validate', [UserController::class, "validate"]) - ->whereNumber('id'); - -Route::middleware(['web', 'auth:sanctum'])->post('/users/{id}/role', [UserController::class, "addRole"]) - ->whereNumber('id'); - -Route::middleware(['web', 'auth:sanctum'])->get('/users', [UserController::class, "getUsers"]); - -Route::middleware(['web', 'auth:sanctum'])->post('/events/create', [EventsController::class, "create"]); - -Route::middleware(['web', 'auth:sanctum'])->post('/events/task', [TasksController::class, "create"]); - -Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign', [TasksController::class, "assignSelf"]); - -Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign/{id}', [TasksController::class, "assignUser"]) - ->whereNumber('id'); - -Route::post("/users/{id}/create/notification", [NotificationsController::class, "create"]) - ->whereNumber('id'); - -Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}/notifications', [NotificationsController::class, "getNotifications"]) - ->whereNumber('id'); - -Route::middleware(['web', 'auth:sanctum'])->get('/users/tasks', [UserController::class, "getUserTasks"]); diff --git a/routes/auth.php b/routes/auth.php new file mode 100644 index 0000000..e033c23 --- /dev/null +++ b/routes/auth.php @@ -0,0 +1,12 @@ +post('/users/login', [AuthController::class, 'login']); + +Route::middleware(['web', 'auth:sanctum'])->post('/users/logout', [AuthController::class, 'logout']); diff --git a/routes/events.php b/routes/events.php new file mode 100644 index 0000000..78d2d84 --- /dev/null +++ b/routes/events.php @@ -0,0 +1,14 @@ +post('/events/create', [EventsController::class, "create"]); + +Route::middleware(['web', 'auth:sanctum'])->post('/events/task', [TasksController::class, "create"]); + +Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign', [TasksController::class, "assignSelf"]); + +Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign/{id}', [TasksController::class, "assignUser"]) + ->whereNumber('id'); diff --git a/routes/users.php b/routes/users.php new file mode 100644 index 0000000..cc46be6 --- /dev/null +++ b/routes/users.php @@ -0,0 +1,41 @@ +get('/users/me', function (Request $request) { + return $request->user(); +}); + +Route::middleware(['web', 'auth:sanctum'])->delete('/users', [UserController::class, "delete"]); + +Route::middleware(['web', 'auth:sanctum'])->delete('/users/{id}', [UserController::class, "deleteById"]) + ->whereNumber('id'); + +Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}', [UserController::class, "getUser"]) + ->whereNumber('id'); + +Route::middleware(['web', 'auth:sanctum'])->post('/users/update', [UserController::class, "update"]); + +Route::middleware(['web', 'auth:sanctum'])->post('/users/{id}/validate', [UserController::class, "validate"]) + ->whereNumber('id'); + +Route::middleware(['web', 'auth:sanctum'])->post('/users/{id}/role', [UserController::class, "addRole"]) + ->whereNumber('id'); + +Route::middleware(['web', 'auth:sanctum'])->get('/users', [UserController::class, "getUsers"]); + +Route::middleware(['web', 'auth:sanctum'])->get('/users/tasks', [UserController::class, "getUserTasks"]); + +Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}/notifications', [NotificationsController::class, "getNotifications"]) + ->whereNumber('id'); + +Route::post("/users/{id}/create/notification", [NotificationsController::class, "create"]) + ->whereNumber('id'); From feef269015410dfa8f97d2230f83e7c46885e298 Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Thu, 20 Nov 2025 12:16:38 +0100 Subject: [PATCH 09/16] Add get user by id tasks --- app/Http/Controllers/UserController.php | 10 ++++++++++ routes/users.php | 2 ++ tests/Users/Get user tasks by id.bru | 20 ++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 tests/Users/Get user tasks by id.bru diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 32792c2..710ffd6 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -161,4 +161,14 @@ class UserController extends Controller return response()->json(['message' => "Server error"], 500); } } + + public function getUserByIdTasks(Request $request, int $id): JsonResponse { + + try { + return response()->json(['data' => User::find($id)->tasks]); + } catch (\Exception $e) { + Log::info($e->getMessage()); + return response()->json(['message' => "Server error"], 500); + } + } } diff --git a/routes/users.php b/routes/users.php index cc46be6..2fd7c98 100644 --- a/routes/users.php +++ b/routes/users.php @@ -34,6 +34,8 @@ Route::middleware(['web', 'auth:sanctum'])->get('/users', [UserController::class Route::middleware(['web', 'auth:sanctum'])->get('/users/tasks', [UserController::class, "getUserTasks"]); +Route::middleware(['web', 'auth:sanctum'])->get('/users/tasks/{id}', [UserController::class, "getUserByIdTasks"]); + Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}/notifications', [NotificationsController::class, "getNotifications"]) ->whereNumber('id'); diff --git a/tests/Users/Get user tasks by id.bru b/tests/Users/Get user tasks by id.bru new file mode 100644 index 0000000..95f990e --- /dev/null +++ b/tests/Users/Get user tasks by id.bru @@ -0,0 +1,20 @@ +meta { + name: Get user tasks by id + type: http + seq: 10 +} + +get { + url: {{url}}/api/users/tasks/{{id}} + body: none + auth: inherit +} + +vars:pre-request { + id: +} + +settings { + encodeUrl: true + timeout: 0 +} From 5e846a88967a56d09626884781e82f8277b1e6ba Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Fri, 21 Nov 2025 11:08:11 +0100 Subject: [PATCH 10/16] Add get user task by id --- app/Http/Controllers/UserController.php | 10 ++++++++++ routes/users.php | 10 +++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 710ffd6..37b0e05 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -171,4 +171,14 @@ class UserController extends Controller return response()->json(['message' => "Server error"], 500); } } + + public function getUserTaskById(Request $request, int $idTask): JsonResponse { + + try { + return response()->json(['data' => $request->user()->tasks->find($idTask)]); + } catch (\Exception $e) { + Log::info($e->getMessage()); + return response()->json(['message' => "Server error"], 500); + } + } } diff --git a/routes/users.php b/routes/users.php index 2fd7c98..031caf8 100644 --- a/routes/users.php +++ b/routes/users.php @@ -34,10 +34,10 @@ Route::middleware(['web', 'auth:sanctum'])->get('/users', [UserController::class Route::middleware(['web', 'auth:sanctum'])->get('/users/tasks', [UserController::class, "getUserTasks"]); -Route::middleware(['web', 'auth:sanctum'])->get('/users/tasks/{id}', [UserController::class, "getUserByIdTasks"]); +Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}/tasks', [UserController::class, "getUserByIdTasks"]); -Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}/notifications', [NotificationsController::class, "getNotifications"]) - ->whereNumber('id'); +Route::middleware(['web', 'auth:sanctum'])->get('/users/tasks/{idTask}', [UserController::class, "getUserTaskById"]); -Route::post("/users/{id}/create/notification", [NotificationsController::class, "create"]) - ->whereNumber('id'); +Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}/notifications', [NotificationsController::class, "getNotifications"])->whereNumber('id'); + +Route::post("/users/{id}/create/notification", [NotificationsController::class, "create"])->whereNumber('id'); From 016017ab30376a52702f37f3d95f7d37e9a46a97 Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Fri, 21 Nov 2025 12:07:23 +0100 Subject: [PATCH 11/16] add get event tasks route --- app/Http/Controllers/TasksController.php | 15 +++++++++++++++ routes/events.php | 5 +++-- tests/Events/Get event tasks.bru | 20 ++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 tests/Events/Get event tasks.bru diff --git a/app/Http/Controllers/TasksController.php b/app/Http/Controllers/TasksController.php index 3a3a1b4..95533ef 100644 --- a/app/Http/Controllers/TasksController.php +++ b/app/Http/Controllers/TasksController.php @@ -90,4 +90,19 @@ class TasksController extends Controller return response()->json(['message' => "Server error"], 500); } } + + public function getEventTasks(Request $request, int $id): JsonResponse { + + try { + + $event = Events::find($id); + + return response()->json(['data' => $event->tasks()->get()]); + + } catch(\Exception $e) { + Log::info($e->getMessage()); + return response()->json(['message' => "Server error"], 500); + } + + } } diff --git a/routes/events.php b/routes/events.php index 78d2d84..6d330ef 100644 --- a/routes/events.php +++ b/routes/events.php @@ -10,5 +10,6 @@ Route::middleware(['web', 'auth:sanctum'])->post('/events/task', [TasksControlle Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign', [TasksController::class, "assignSelf"]); -Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign/{id}', [TasksController::class, "assignUser"]) - ->whereNumber('id'); +Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign/{id}', [TasksController::class, "assignUser"])->whereNumber('id'); + +Route::middleware(['web', 'auth:sanctum'])->get('/events/{id}/tasks', [TasksController::class, "getEventTasks"]); diff --git a/tests/Events/Get event tasks.bru b/tests/Events/Get event tasks.bru new file mode 100644 index 0000000..4df5473 --- /dev/null +++ b/tests/Events/Get event tasks.bru @@ -0,0 +1,20 @@ +meta { + name: Get event tasks + type: http + seq: 3 +} + +get { + url: {{url}}/api/events/{{id}}/tasks + body: none + auth: inherit +} + +vars:pre-request { + id: +} + +settings { + encodeUrl: true + timeout: 0 +} From d5f1c7f163f6fa3c0ff8f52c1d7bf4cb2c6155f5 Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Fri, 21 Nov 2025 15:44:25 +0100 Subject: [PATCH 12/16] add delete event tasks route --- app/Http/Controllers/TasksController.php | 18 ++++++++++++++++++ routes/events.php | 2 ++ tests/Events/tasks/Delete task.bru | 20 ++++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 tests/Events/tasks/Delete task.bru diff --git a/app/Http/Controllers/TasksController.php b/app/Http/Controllers/TasksController.php index 95533ef..e6ada3f 100644 --- a/app/Http/Controllers/TasksController.php +++ b/app/Http/Controllers/TasksController.php @@ -105,4 +105,22 @@ class TasksController extends Controller } } + + public function deleteTask(Request $request, int $id): JsonResponse { + + if(!$this->isAdmin($request->user()->role)){ + return response()->json(["message" => "Can't delete task"], 403); + } + + try { + + $task = Task::find($id); + $task->delete(); + return response()->json(['message' => "Task deleted"], 200); + + } catch(\Exception $e) { + Log::info($e->getMessage()); + return response()->json(['message' => "Server error"], 500); + } + } } diff --git a/routes/events.php b/routes/events.php index 6d330ef..d4edef4 100644 --- a/routes/events.php +++ b/routes/events.php @@ -13,3 +13,5 @@ Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign', [TasksCo Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign/{id}', [TasksController::class, "assignUser"])->whereNumber('id'); Route::middleware(['web', 'auth:sanctum'])->get('/events/{id}/tasks', [TasksController::class, "getEventTasks"]); + +Route::middleware(['web', 'auth:sanctum'])->delete('/events/tasks/{id}', [TasksController::class, "deleteTask"]); diff --git a/tests/Events/tasks/Delete task.bru b/tests/Events/tasks/Delete task.bru new file mode 100644 index 0000000..fac39b0 --- /dev/null +++ b/tests/Events/tasks/Delete task.bru @@ -0,0 +1,20 @@ +meta { + name: Delete task + type: http + seq: 1 +} + +delete { + url: {{url}}/api/events/tasks/{{id}} + body: none + auth: inherit +} + +vars:pre-request { + id: +} + +settings { + encodeUrl: true + timeout: 0 +} From d6a8fd3010515031b1d1d4851d87cebeedc9db92 Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Fri, 21 Nov 2025 16:08:04 +0100 Subject: [PATCH 13/16] add update event route --- app/Http/Controllers/EventsController.php | 23 ++++++++++++++++++ routes/events.php | 2 ++ tests/Events/Update event.bru | 29 +++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 tests/Events/Update event.bru diff --git a/app/Http/Controllers/EventsController.php b/app/Http/Controllers/EventsController.php index e9dfe70..bd98f72 100644 --- a/app/Http/Controllers/EventsController.php +++ b/app/Http/Controllers/EventsController.php @@ -6,6 +6,7 @@ use App\Models\Events; use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Log; +use PHPUnit\Event\Event; class EventsController extends Controller { @@ -30,4 +31,26 @@ class EventsController extends Controller } } + + public function update(Request $request, int $id): JsonResponse { + + if ($request->user()->role != 1) { + return response()->json(['message' => 'Forbidden'], 403); + } + + try { + + $event = Events::find($id); + + $event->name = $request['name']; + $event->description = $request['description']; + $event->save(); + + return response()->json(["message" => "Event updated"]); + + } catch (\Exception $e) { + Log::info($e->getMessage()); + return response()->json(['message' => "Server error"], 500); + } + } } diff --git a/routes/events.php b/routes/events.php index d4edef4..41cbab7 100644 --- a/routes/events.php +++ b/routes/events.php @@ -15,3 +15,5 @@ Route::middleware(['web', 'auth:sanctum'])->post('/events/task/assign/{id}', [Ta Route::middleware(['web', 'auth:sanctum'])->get('/events/{id}/tasks', [TasksController::class, "getEventTasks"]); Route::middleware(['web', 'auth:sanctum'])->delete('/events/tasks/{id}', [TasksController::class, "deleteTask"]); + +Route::middleware(['web', 'auth:sanctum'])->post('/events/{id}/update', [EventsController::class, "update"]); diff --git a/tests/Events/Update event.bru b/tests/Events/Update event.bru new file mode 100644 index 0000000..dc5b573 --- /dev/null +++ b/tests/Events/Update event.bru @@ -0,0 +1,29 @@ +meta { + name: Update event + type: http + seq: 4 +} + +post { + url: {{url}}/api/events/{{id}}/update + body: json + auth: inherit +} + +body:json { + { + "name": "{{name}}", + "description": "{{description}}" + } +} + +vars:pre-request { + id: 1 + name: BLAAHHHH + description: DADADADADDA +} + +settings { + encodeUrl: true + timeout: 0 +} From 9e271f8a3e328e7802af0bc2f2feba92efd81aaf Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Fri, 21 Nov 2025 16:16:34 +0100 Subject: [PATCH 14/16] add update event task route --- app/Http/Controllers/TasksController.php | 25 ++++++++++++++++ routes/events.php | 2 ++ tests/Events/tasks/Update Task.bru | 37 ++++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 tests/Events/tasks/Update Task.bru diff --git a/app/Http/Controllers/TasksController.php b/app/Http/Controllers/TasksController.php index e6ada3f..1de2456 100644 --- a/app/Http/Controllers/TasksController.php +++ b/app/Http/Controllers/TasksController.php @@ -123,4 +123,29 @@ class TasksController extends Controller return response()->json(['message' => "Server error"], 500); } } + + public function update(Request $request, int $id): JsonResponse { + + if(!$this->isAdmin($request->user()->role)){ + return response()->json(["message" => "Forbidden"], 403); + } + + try { + + $task = Task::find($id); + $task->name = $request["name"]; + $task->description = $request["description"]; + $task->start = $request["start"]; + $task->end = $request["end"]; + $task->location = $request["location"]; + $task->max_participants = $request["max_participants"]; + $task->save(); + + return response()->json(['message' => "Task updated"], 200); + + } catch (\Exception $e) { + Log::info($e->getMessage()); + return response()->json(['message' => "Server error"], 500); + } + } } diff --git a/routes/events.php b/routes/events.php index 41cbab7..2eee7ab 100644 --- a/routes/events.php +++ b/routes/events.php @@ -17,3 +17,5 @@ Route::middleware(['web', 'auth:sanctum'])->get('/events/{id}/tasks', [TasksCont Route::middleware(['web', 'auth:sanctum'])->delete('/events/tasks/{id}', [TasksController::class, "deleteTask"]); Route::middleware(['web', 'auth:sanctum'])->post('/events/{id}/update', [EventsController::class, "update"]); + +Route::middleware(['web', 'auth:sanctum'])->post('/events/tasks/{id}/update', [TasksController::class, "update"]); diff --git a/tests/Events/tasks/Update Task.bru b/tests/Events/tasks/Update Task.bru new file mode 100644 index 0000000..ef57d9a --- /dev/null +++ b/tests/Events/tasks/Update Task.bru @@ -0,0 +1,37 @@ +meta { + name: Update Task + type: http + seq: 5 +} + +post { + url: {{url}}/api/events/tasks/{{id}}/update + body: json + auth: inherit +} + +body:json { + { + "name": "{{name}}", + "description": "{{description}}", + "location": "{{location}}", + "start": "{{start}}", + "end": "{{end}}", + "max_participants": "{{max_participants}}" + } +} + +vars:pre-request { + id: + name: + description: + location: + start: + end: + max_participants: +} + +settings { + encodeUrl: true + timeout: 0 +} From c83b626b9aac42e00bd8e6303b14c291155df1b1 Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Sat, 22 Nov 2025 00:33:51 +0100 Subject: [PATCH 15/16] add get all events route --- app/Http/Controllers/EventsController.php | 13 +++++++++++++ routes/events.php | 2 ++ tests/Events/Get all events.bru | 15 +++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 tests/Events/Get all events.bru diff --git a/app/Http/Controllers/EventsController.php b/app/Http/Controllers/EventsController.php index bd98f72..8b34059 100644 --- a/app/Http/Controllers/EventsController.php +++ b/app/Http/Controllers/EventsController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Models\Events; +use http\Env\Response; use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Log; @@ -53,4 +54,16 @@ class EventsController extends Controller return response()->json(['message' => "Server error"], 500); } } + + public function getEvents(Request $request): JsonResponse { + + try { + + return response()->json(['data' => Events::all()]); + + } catch (\Exception $e) { + Log::info($e->getMessage()); + return response()->json(['message' => "Server error"], 500); + } + } } diff --git a/routes/events.php b/routes/events.php index 2eee7ab..9f8d3d8 100644 --- a/routes/events.php +++ b/routes/events.php @@ -19,3 +19,5 @@ Route::middleware(['web', 'auth:sanctum'])->delete('/events/tasks/{id}', [TasksC Route::middleware(['web', 'auth:sanctum'])->post('/events/{id}/update', [EventsController::class, "update"]); Route::middleware(['web', 'auth:sanctum'])->post('/events/tasks/{id}/update', [TasksController::class, "update"]); + +Route::middleware(['web', 'auth:sanctum'])->get('/events', [EventsController::class, "getEvents"]); diff --git a/tests/Events/Get all events.bru b/tests/Events/Get all events.bru new file mode 100644 index 0000000..c7267c8 --- /dev/null +++ b/tests/Events/Get all events.bru @@ -0,0 +1,15 @@ +meta { + name: Get all events + type: http + seq: 5 +} + +get { + url: {{url}}/api/events + body: none + auth: inherit +} + +settings { + encodeUrl: true +} From 59a5a4fde95f1404db1d33c4c64906badebca335 Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Sat, 22 Nov 2025 00:37:59 +0100 Subject: [PATCH 16/16] add delete event route --- app/Http/Controllers/EventsController.php | 17 +++++++++++++++++ routes/events.php | 2 ++ tests/Events/Delete event.bru | 20 ++++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 tests/Events/Delete event.bru diff --git a/app/Http/Controllers/EventsController.php b/app/Http/Controllers/EventsController.php index 8b34059..332d49b 100644 --- a/app/Http/Controllers/EventsController.php +++ b/app/Http/Controllers/EventsController.php @@ -66,4 +66,21 @@ class EventsController extends Controller return response()->json(['message' => "Server error"], 500); } } + + public function delete(Request $request, int $id): JsonResponse { + + if ($request->user()->role != 1) { + return response()->json(['message' => 'Forbidden'], 403); + } + + try { + + $event = Events::find($id); + $event->delete(); + return response()->json(["message" => "Event deleted"]); + } catch (\Exception $e) { + Log::info($e->getMessage()); + return response()->json(['message' => "Server error"], 500); + } + } } diff --git a/routes/events.php b/routes/events.php index 9f8d3d8..a503abd 100644 --- a/routes/events.php +++ b/routes/events.php @@ -21,3 +21,5 @@ Route::middleware(['web', 'auth:sanctum'])->post('/events/{id}/update', [EventsC Route::middleware(['web', 'auth:sanctum'])->post('/events/tasks/{id}/update', [TasksController::class, "update"]); Route::middleware(['web', 'auth:sanctum'])->get('/events', [EventsController::class, "getEvents"]); + +Route::middleware(['web', 'auth:sanctum'])->delete('/events/{id}', [EventsController::class, "delete"]); diff --git a/tests/Events/Delete event.bru b/tests/Events/Delete event.bru new file mode 100644 index 0000000..1cfedb3 --- /dev/null +++ b/tests/Events/Delete event.bru @@ -0,0 +1,20 @@ +meta { + name: Delete event + type: http + seq: 6 +} + +delete { + url: {{url}}/api/events/{{id}} + body: none + auth: inherit +} + +vars:pre-request { + id: +} + +settings { + encodeUrl: true + timeout: 0 +}