From d5a3eb4bdedd6feda7c1ba8f5213cfab96fae97a Mon Sep 17 00:00:00 2001 From: joddyabott Date: Tue, 29 Apr 2025 14:31:27 +0330 Subject: [PATCH] create controller and resorce and request for user and create controller and middelware for profile --- .../Admin/UserManagementController.php | 133 ++++++++++++++++++ .../Http/Controllers/ProfileController.php | 21 ++- .../app/Http/Middleware/SuperAdminCheck.php | 25 ++++ .../app/Http/Requests/Admin/StoreRequest.php | 40 ++++++ .../app/Http/Requests/Admin/UpdateRequest.php | 45 ++++++ .../Http/Requests/ChangePasswordRequest.php | 29 ++++ .../app/Http/Resource/Admin/UserResource.php | 34 +++++ laravel/routes/web.php | 18 ++- 8 files changed, 341 insertions(+), 4 deletions(-) create mode 100644 laravel/app/Http/Controllers/Admin/UserManagementController.php create mode 100644 laravel/app/Http/Middleware/SuperAdminCheck.php create mode 100644 laravel/app/Http/Requests/Admin/StoreRequest.php create mode 100644 laravel/app/Http/Requests/Admin/UpdateRequest.php create mode 100644 laravel/app/Http/Requests/ChangePasswordRequest.php create mode 100644 laravel/app/Http/Resource/Admin/UserResource.php diff --git a/laravel/app/Http/Controllers/Admin/UserManagementController.php b/laravel/app/Http/Controllers/Admin/UserManagementController.php new file mode 100644 index 0000000..920cc2b --- /dev/null +++ b/laravel/app/Http/Controllers/Admin/UserManagementController.php @@ -0,0 +1,133 @@ +where('username', "<>", "witel"); + + + $data = DataTableFacade::run( + $query, + $request, + allowedFilters: $allowedFilters, + allowedSortings: $allowedSortings, + allowedRelations: $allowedRelations); + + return response()->json($data); + } + + public function store(StoreRequest $request): JsonResponse + { + DB::transaction(function () use ($request) { + $province = Province::query()->find($request->province_id); + + $avatar = $request->avatar + ? FileFacade::save($request->file('avatar'), 'users/avatars/' . $request->username) + : null; + + $user = User::query()->create([ + 'full_name' => $request->full_name, + 'username' => $request->username, + 'position' => $request->position, + 'gender' => $request->gender, + 'national_id' => $request->national_id, + 'phone_number' => $request->phone_number, + 'province_id' => $province->id, + 'province_fa' => $province->name, + 'password' => Hash::make($request->password), + 'avatar' => $avatar, + 'email' => $request->email, + 'telephone_id' => $request->telephone_id, + ]); + + $user->syncRoles($request->roles); + }); + + return $this->successResponse(); + } + + public function show(User $user): JsonResponse + { + return $this->successResponse(new UserResource($user)); + } + + public function update(UpdateRequest $request, User $user): JsonResponse + { + DB::transaction(function () use ($request, $user) { + $province = Province::query()->find($request->province_id); + + $avatar = $request->avatar ? + FileFacade::save($request->file('avatar'), 'users/avatars/' . $request->username) + : null; + + $email = $request->email ?? null; + + $user->update([ + 'full_name' => $request->full_name, + 'username' => $request->username, + 'position' => $request->position, + 'gender' => $request->gender, + 'national_id' => $request->national_id, + 'phone_number' => $request->phone_number, + 'province_id' => $province->id, + 'province_fa' => $province->name, + 'avatar' => $avatar, + 'email' => $email, + 'telephone_id' => $request->telephone_id + ]); + + $user->syncRoles($request->roles); + }); + + return $this->successResponse(); + } + + public function destroy(User $user): JsonResponse + { + DB::transaction(function () use ($user) { + if ($user->avatar) { + FileFacade::delete($user->avatar, true); + } + + $user->syncRoles([]); + + $user->delete(); + }); + + return $this->successResponse(); + } + + + + +} diff --git a/laravel/app/Http/Controllers/ProfileController.php b/laravel/app/Http/Controllers/ProfileController.php index 15ff651..c657de4 100644 --- a/laravel/app/Http/Controllers/ProfileController.php +++ b/laravel/app/Http/Controllers/ProfileController.php @@ -2,10 +2,11 @@ namespace App\Http\Controllers; +use App\Http\Requests\ChangePasswordRequest; +use App\Http\Resource\Admin\UserResource; use App\Http\Traits\ApiResponse; -use App\Models\User; use Illuminate\Http\JsonResponse; -use Illuminate\Http\Request; +use Illuminate\Support\Facades\Hash; class ProfileController extends Controller { @@ -13,6 +14,20 @@ class ProfileController extends Controller public function info(): JsonResponse { - return $this->successResponse(User::query()->find(auth()->id())); + return $this->successResponse(new UserResource(auth()->user())); + } + public function changePassword(ChangePasswordRequest $request): JsonResponse + { + $user = auth()->user(); + if (! Hash::check($request->curent_pasword, $user->passwored)){ + return $this->errorResponse(__('messages.wrong_current_password')); + } + $user->update([ + 'password' => Hash::make($request->new_password) + ]); + + return $this->successResponse(); + } + } diff --git a/laravel/app/Http/Middleware/SuperAdminCheck.php b/laravel/app/Http/Middleware/SuperAdminCheck.php new file mode 100644 index 0000000..b01037f --- /dev/null +++ b/laravel/app/Http/Middleware/SuperAdminCheck.php @@ -0,0 +1,25 @@ +user; + if ($user->username == "witel") { + throw new AuthorizationException(); + } + return $next($request); + } +} diff --git a/laravel/app/Http/Requests/Admin/StoreRequest.php b/laravel/app/Http/Requests/Admin/StoreRequest.php new file mode 100644 index 0000000..405b257 --- /dev/null +++ b/laravel/app/Http/Requests/Admin/StoreRequest.php @@ -0,0 +1,40 @@ + + */ + public function rules(): array + { + return [ + 'full_name' => 'required|max:255|string', + 'username' => 'required|unique:users,username|string', + 'position' => 'required', + 'gender' => 'required|in:male,female', + 'national_id' => 'required|digits:10|unique:users,national_id', + 'phone_number' => 'required|numeric|digits:11|unique:users,phone_number|regex:/^09\d{9}$/', + 'province_id' => 'required|exists:provinces,id', + 'password' => 'required|regex:/^(?=.*[a-zA-Z])(?=.*\d).+$/|min:8', + 'roles' => 'required|exists:roles,id', + 'avatar' => 'mimes:png,jpg,pdf|max:2048', + 'email' => 'email|unique:users,email', + 'telephone_id' => 'required|string|unique:users,telephone_id' + ]; + } +} diff --git a/laravel/app/Http/Requests/Admin/UpdateRequest.php b/laravel/app/Http/Requests/Admin/UpdateRequest.php new file mode 100644 index 0000000..ea3b3fa --- /dev/null +++ b/laravel/app/Http/Requests/Admin/UpdateRequest.php @@ -0,0 +1,45 @@ + + */ + public function rules(): array + { + return [ + 'full_name' => 'required|max:255|string', + 'username' => ['required', 'string', Rule::unique('users', 'username')->ignore($this->user->id)], + 'position' => 'required', + 'gender' => 'required|in:male,female', + 'national_id' => ['required', 'digits:10', Rule::unique('users', 'national_id')->ignore($this->user->id)], + 'phone_number' => ['required', + 'numeric', + 'digits:11', + Rule::unique('users', 'phone_number')->ignore($this->user->id), + 'regex:/^09\d{9}$/' + ], + 'province_id' => 'required|exists:provinces,id', + 'roles' => 'required|exists:roles,id', + 'avatar' => 'mimes:png,jpg,pdf|max:2048', + 'email' => ['email', Rule::unique('users', 'email')->ignore($this->user->id)], + 'telephone_id' => ['required', 'string', Rule::unique('users', 'telephone_id')->ignore($this->user->id)] + ]; + } +} diff --git a/laravel/app/Http/Requests/ChangePasswordRequest.php b/laravel/app/Http/Requests/ChangePasswordRequest.php new file mode 100644 index 0000000..fb7d1e9 --- /dev/null +++ b/laravel/app/Http/Requests/ChangePasswordRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + 'current_password' => 'required|min:8|max:255', + 'new_password' => 'required|confirmed|regex:/^(?=.*[a-zA-Z])(?=.*\d).+$/|min:8|max:255', + ]; + } +} diff --git a/laravel/app/Http/Resource/Admin/UserResource.php b/laravel/app/Http/Resource/Admin/UserResource.php new file mode 100644 index 0000000..2689feb --- /dev/null +++ b/laravel/app/Http/Resource/Admin/UserResource.php @@ -0,0 +1,34 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'id' => $this->id, + 'full_name' => $this->full_name, + 'username' => $this->username, + 'gender' => $this->gender, + 'email' => $this->email, + 'phone_number' => $this->phone_number, + 'avatar' => $this->avatar, + 'national_id' => $this->national_id, + 'position' => $this->position, + 'province_id' => $this->province_id, + 'province_name' => $this->province_name, + 'role' => $this->getRoleNames()->first(), + 'permissions' => $this->getAllPermissions()->pluck('name'), + 'telephone_id' => $this->telephone_id + ]; + } +} diff --git a/laravel/routes/web.php b/laravel/routes/web.php index 373ade7..fa91e35 100644 --- a/laravel/routes/web.php +++ b/laravel/routes/web.php @@ -1,7 +1,9 @@ controller(ProfileController::class) ->group(function () { Route::get('/info', 'info')->middleware('auth:sanctum')->name('info'); - Route::post('/change_password', 'changePassword'); + Route::post('/change_password', 'changePassword')->middleware('auth:sanctum')->name('changePassword'); }); + + +Route::prefix('users') + ->name('users.') + ->middleware(['auth:sanctum', 'permission:manage_users']) + ->controller(UserManagementController::class) + ->group(function () { + Route::get('/', 'index')->name('index'); + Route::get('/{user}', 'show')->middleware([SuperAdminCheck::class])->name('show'); + Route::post('/', 'store')->name('store'); + Route::post('/{user}', 'update')->middleware([SuperAdminCheck::class])->name('update'); + Route::delete('/{user}', 'destroy')->middleware([SuperAdminCheck::class])->name('destroy'); + }); +