Merge branch 'features/authorizations' into 'features/notifications'

Features/authorizations

See merge request sae-but2/2025-26/gestion-benevoles-association/backend!14
This commit is contained in:
JOSSERAND GIOVANNI p2405212 committed 2025-12-17 16:19:31 +00:00
commit e0504ea0c2
28 files changed
+153 -91

No files matched your search

+3 -1
View File
@@ -2,7 +2,9 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
abstract class Controller abstract class Controller
{ {
// use AuthorizesRequests;
} }
+4 -3
View File
@@ -6,6 +6,7 @@ use App\Models\Events;
use http\Env\Response; use http\Env\Response;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use PHPUnit\Event\Event; use PHPUnit\Event\Event;
@@ -13,7 +14,7 @@ class EventsController extends Controller
{ {
public function create(Request $request): JsonResponse public function create(Request $request): JsonResponse
{ {
if ($request->user()->role != 1) { if (Gate::denies('create', Events::class)) {
return response()->json(['message' => 'Forbidden'], 403); return response()->json(['message' => 'Forbidden'], 403);
} }
@@ -37,7 +38,7 @@ class EventsController extends Controller
public function update(Request $request, int $id): JsonResponse { public function update(Request $request, int $id): JsonResponse {
if ($request->user()->role != 1) { if (Gate::denies('update', Events::class)) {
return response()->json(['message' => 'Forbidden'], 403); return response()->json(['message' => 'Forbidden'], 403);
} }
@@ -76,7 +77,7 @@ class EventsController extends Controller
public function delete(Request $request, int $id): JsonResponse { public function delete(Request $request, int $id): JsonResponse {
if ($request->user()->role != 1) { if (Gate::denies('delete', Events::class)) {
return response()->json(['message' => 'Forbidden'], 403); return response()->json(['message' => 'Forbidden'], 403);
} }
@@ -10,24 +10,10 @@ use Illuminate\Support\Facades\Log;
class NotificationsController extends Controller class NotificationsController extends Controller
{ {
public function createNotification(Request $request, int $id): JsonResponse { public function getNotifications(Request $request): JsonResponse {
$notification = Notification::create([
"content" => $request["content"]
]);
$notification->users()->attach($id);
return response()->json(['message' => 'Notification created successfully']);
}
public function getNotifications(Request $request, int $id): JsonResponse {
try { try {
$user = User::findOrFail($id);
return response()->json([ return response()->json([
'data' => $user->notifications 'data' => $request->user()->notifications
]); ]);
} catch(\Exception $e) { } catch(\Exception $e) {
Log::info($e->getMessage()); Log::info($e->getMessage());
@@ -37,10 +23,9 @@ class NotificationsController extends Controller
public function deleteNotification(int $userId, int $notificationId): JsonResponse { public function deleteNotification(Request $request, int $notificationId): JsonResponse {
try { try {
$user = User::findOrFail($userId); $request->user()->notifications()->detach($notificationId);
$user->notifications()->detach($notificationId);
$notification = Notification::find($notificationId); $notification = Notification::find($notificationId);
if ($notification && $notification->users()->count() === 0) { if ($notification && $notification->users()->count() === 0) {
@@ -53,5 +38,4 @@ class NotificationsController extends Controller
return response()->json(['message' => 'Erreur lors de la suppression'], 500); return response()->json(['message' => 'Erreur lors de la suppression'], 500);
} }
} }
} }
+6 -1
View File
@@ -68,6 +68,12 @@ class SearchController extends Controller
public function searchEvents(Request $request) public function searchEvents(Request $request)
{ {
try { try {
try {
$this->client->collections['events']->delete();
} catch (\Exception $e) {
// ignore si la collection n'existe pas
}
$this->createEventsCollection(); $this->createEventsCollection();
$this->indexEvents(); $this->indexEvents();
$query = $request->input('query', ''); $query = $request->input('query', '');
@@ -147,7 +153,6 @@ class SearchController extends Controller
// ignore si la collection n'existe pas // ignore si la collection n'existe pas
} }
$this->createUsersCollection();
$this->indexUsers(); $this->indexUsers();
$query = $request->input('query', ''); $query = $request->input('query', '');
+5 -11
View File
@@ -7,20 +7,14 @@ use App\Models\Task;
use App\Models\User; use App\Models\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
class TasksController extends Controller class TasksController extends Controller
{ {
public function isAdmin(int $role) {
if($role != 1) return false;
return true;
}
public function create(Request $request): JsonResponse { public function create(Request $request): JsonResponse {
if(!$this->isAdmin($request->user()->role)){ if(Gate::denies('create', Task::class)) {
return response()->json(["message" => "Can't create task"], 403); return response()->json(["message" => "Can't create task"], 403);
} }
@@ -67,7 +61,7 @@ class TasksController extends Controller
public function assignUser(request $request, int $id): JsonResponse { public function assignUser(request $request, int $id): JsonResponse {
if(!$this->isAdmin($request->user()->role)){ if(Gate::denies('assignOther', Task::class)) {
return response()->json(["message" => "Can't create task"], 403); return response()->json(["message" => "Can't create task"], 403);
} }
@@ -108,7 +102,7 @@ class TasksController extends Controller
public function deleteTask(Request $request, int $id): JsonResponse { public function deleteTask(Request $request, int $id): JsonResponse {
if(!$this->isAdmin($request->user()->role)){ if(Gate::denies('delete', Task::class)) {
return response()->json(["message" => "Can't delete task"], 403); return response()->json(["message" => "Can't delete task"], 403);
} }
@@ -126,7 +120,7 @@ class TasksController extends Controller
public function update(Request $request, int $id): JsonResponse { public function update(Request $request, int $id): JsonResponse {
if(!$this->isAdmin($request->user()->role)){ if(Gate::denies('update', Task::class)) {
return response()->json(["message" => "Forbidden"], 403); return response()->json(["message" => "Forbidden"], 403);
} }
+10 -10
View File
@@ -6,6 +6,7 @@ use App\Models\Notification;
use App\Models\User; use App\Models\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use App\Services\GetRole; use App\Services\GetRole;
@@ -14,11 +15,6 @@ use Propaganistas\LaravelPhone\PhoneNumber;
class UserController extends Controller class UserController extends Controller
{ {
public function isAdmin(int $role) {
if($role != 1) return false;
return true;
}
public function me(Request $request): JsonResponse { public function me(Request $request): JsonResponse {
try { try {
return response()->json(UserService::getData($request->user()->id)); return response()->json(UserService::getData($request->user()->id));
@@ -72,15 +68,13 @@ class UserController extends Controller
public function deleteById(Request $request, int $id): JsonResponse { public function deleteById(Request $request, int $id): JsonResponse {
if(!$this->isAdmin($request->user()->role)){ if(Gate::denies('deleteOther', $request->user())){
return response()->json(["message" => "Can't delete this user"], 403); return response()->json(["message" => "Can't delete this user"], 403);
} }
try { try {
$user = User::find($id); $user = User::find($id);
if($user->role === 1) return response()->json(["message" => "Can't delete this user"], 403);
$user->delete(); $user->delete();
return response()->json(['message' => 'User deleted successfully']); return response()->json(['message' => 'User deleted successfully']);
} catch(\Exception $e) { } catch(\Exception $e) {
@@ -120,7 +114,7 @@ class UserController extends Controller
public function validate(Request $request, int $id): JsonResponse { public function validate(Request $request, int $id): JsonResponse {
if($request->user()->role != 1 && $request->user()->role != 2 || $request->user()->role == null){ if(Gate::denies('validate', $request->user())){
return response()->json(["message" => "Can't validate this user"], 403); return response()->json(["message" => "Can't validate this user"], 403);
} }
@@ -149,7 +143,7 @@ class UserController extends Controller
public function addRole(Request $request, int $id): JsonResponse { public function addRole(Request $request, int $id): JsonResponse {
if(!$this->isAdmin($request->user()->role)){ if(Gate::denies('addRole', $request->user())){
return response()->json(["message" => "Can't add role to this user"], 403); return response()->json(["message" => "Can't add role to this user"], 403);
} }
@@ -158,6 +152,12 @@ class UserController extends Controller
$user->role = $request['role']; $user->role = $request['role'];
$user->save(); $user->save();
$role = GetRole::getRole($request['role']);
$notification = Notification::create([
'content' => "Votre rôle à changé pour {$role} !",
]);
$notification->users()->attach($user->id);
return response()->json(['message' => 'User role added successfully']); return response()->json(['message' => 'User role added successfully']);
} catch(\Exception $e) { } catch(\Exception $e) {
Log::info($e->getMessage()); Log::info($e->getMessage());
+25
View File
@@ -0,0 +1,25 @@
<?php
namespace App\Policies;
use App\Models\Events;
use App\Models\User;
use Illuminate\Auth\Access\Response;
class EventsPolicy
{
public function create(User $user, Events $model): bool
{
return $user->role === 1 || $user->role === 2;
}
public function update(User $user, Events $model): bool
{
return $user->role === 1 || $user->role === 2;
}
public function delete(User $user, Events $model): bool
{
return $user->role === 1 || $user->role === 2;
}
}
+30
View File
@@ -0,0 +1,30 @@
<?php
namespace App\Policies;
use App\Models\Task;
use App\Models\User;
use Illuminate\Auth\Access\Response;
class TasksPolicy
{
public function create(User $user, Task $model): bool
{
return $user->role === 1 || $user->role === 2;
}
public function assignOther(User $user, Task $model): bool
{
return $user->role === 1 || $user->role === 2;
}
public function delete(User $user, Task $model): bool
{
return $user->role === 1 || $user->role === 2;
}
public function update(User $user, Task $model): bool
{
return $user->role === 1 || $user->role === 2;
}
}
+24
View File
@@ -0,0 +1,24 @@
<?php
namespace App\Policies;
use App\Models\User;
use Illuminate\Auth\Access\Response;
class UserPolicy
{
public function deleteOther(User $user, User $model): bool
{
return $user->role === 1;
}
public function validate(User $user, User $model): bool
{
return $user->role === 1 || $user->role === 2;
}
public function addRole(User $user, User $model): bool
{
return $user->role === 1;
}
}
+33
View File
@@ -0,0 +1,33 @@
<?php
namespace App\Providers;
use App\Models\Events;
use App\Models\Task;
use App\Models\User;
use App\Policies\EventsPolicy;
use App\Policies\TasksPolicy;
use App\Policies\UserPolicy;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;
class GateServiceProvider extends ServiceProvider
{
/**
* Register services.
*/
public function register(): void
{
//
}
/**
* Bootstrap services.
*/
public function boot(): void
{
Gate::policy(User::class, UserPolicy::class);
Gate::policy(Events::class, EventsPolicy::class);
Gate::policy(Task::class, TasksPolicy::class);
}
}
Executable → Regular
View File
File mode changed.
Executable → Regular
View File
File mode changed.
+1
View File
@@ -2,4 +2,5 @@
return [ return [
App\Providers\AppServiceProvider::class, App\Providers\AppServiceProvider::class,
App\Providers\GateServiceProvider::class,
]; ];
+2 -7
View File
@@ -3,12 +3,7 @@
use App\Http\Controllers\NotificationsController; use App\Http\Controllers\NotificationsController;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
Route::middleware(['web', 'auth:sanctum'])->get('/users/{id}/notifications', [NotificationsController::class, "getNotifications"]) Route::middleware(['web', 'auth:sanctum'])->get('/users/notifications', [NotificationsController::class, "getNotifications"]);
->whereNumber('id');
Route::middleware(['web', 'auth:sanctum'])->post("/users/{id}/create/notification", [NotificationsController::class, "createNotification"]) Route::middleware(['web', 'auth:sanctum'])->delete('/users/delete/notification/{notificationId}', [NotificationsController::class, 'deleteNotification'])
->whereNumber('id');
Route::middleware(['web', 'auth:sanctum'])->delete('/users/{userId}/delete/notification/{notificationId}', [NotificationsController::class, 'deleteNotification'])
->whereNumber('userId')
->whereNumber('notificationId'); ->whereNumber('notificationId');
Executable → Regular
View File
File mode changed.
Executable → Regular
View File
File mode changed.
Executable → Regular
View File
File mode changed.
Executable → Regular
View File
File mode changed.
View File
File mode changed.
View File
File mode changed.
View File
File mode changed.
View File
File mode changed.
View File
File mode changed.
Executable → Regular
View File
File mode changed.
@@ -1,27 +0,0 @@
meta {
name: Create notification
type: http
seq: 12
}
post {
url: {{url}}/api/users/{{id}}/create/notification
body: json
auth: inherit
}
body:json {
{
"content": "{{content}}"
}
}
vars:pre-request {
id: 12
content: test
}
settings {
encodeUrl: true
timeout: 0
}
@@ -5,14 +5,13 @@ meta {
} }
delete { delete {
url: {{url}}/api/users/{{userId}}/delete/notification/{{notificationId}} url: {{url}}/api/users/delete/notification/{{notificationId}}
body: none body: none
auth: inherit auth: inherit
} }
vars:pre-request { vars:pre-request {
userId: notificationId: 3
notificationId:
} }
settings { settings {
@@ -1,19 +1,15 @@
meta { meta {
name: Get user notifications name: Get user notifications
type: http type: http
seq: 12 seq: 2
} }
get { get {
url: {{url}}/api/users/{{id}}/notifications url: {{url}}/api/users/notifications
body: none body: none
auth: inherit auth: inherit
} }
vars:pre-request {
id: 12
}
settings { settings {
encodeUrl: true encodeUrl: true
timeout: 0 timeout: 0
+2 -2
View File
@@ -17,8 +17,8 @@ body:json {
} }
vars:pre-request { vars:pre-request {
role: role: 2
id: id: 12
} }
assert { assert {