From 86e353749a0fd10b02288ade45533d74b54015e0 Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Mon, 18 May 2026 13:49:33 +0330 Subject: [PATCH 1/9] create profile for expert --- .../Admin/Controllers/ProfileController.php | 20 +++++ .../Admin/Requests/Profile/EditRequest.php | 78 +++++++++++++++++++ .../User/Controllers/ProfileController.php | 18 ++--- .../app/User/Requests/Profile/EditRequest.php | 42 +++++++++- .../database/seeders/PaymentStatusSeeder.php | 22 +++++- backend/routes/expert.php | 11 +++ 6 files changed, 176 insertions(+), 15 deletions(-) create mode 100755 backend/app/Admin/Requests/Profile/EditRequest.php diff --git a/backend/app/Admin/Controllers/ProfileController.php b/backend/app/Admin/Controllers/ProfileController.php index 5b825966..dde39f98 100755 --- a/backend/app/Admin/Controllers/ProfileController.php +++ b/backend/app/Admin/Controllers/ProfileController.php @@ -3,6 +3,7 @@ namespace App\Admin\Controllers; use App\Admin\Requests\Profile\ChangePasswordRequest; +use App\Admin\Requests\Profile\EditRequest; use App\Admin\Resources\ExpertResource; use App\Http\Controllers\Controller; use App\Traits\ApiResponse; @@ -19,6 +20,25 @@ class ProfileController extends Controller return $this->successResponse(new ExpertResource(Auth::guard('expert')->user())); } + public function edit(EditRequest $request): JsonResponse + { + $expert = $request->user('expert'); +// $expert->update($request->validated()); + + $expert->update([ + 'username' => $request->username, + 'first_name' => $request->first_name, + 'last_name' => $request->last_name, + 'email' => $expert->email, + 'national_id' => $request->national_id, + 'phone_number' => $request->phone_number, + 'province_id' => $request->province_id, + 'city_id' => $request->city_id, + ]); + + return $this->successResponse(); + } + public function changePassword(ChangePasswordRequest $request): JsonResponse { $expert = Auth::guard('expert')->user(); diff --git a/backend/app/Admin/Requests/Profile/EditRequest.php b/backend/app/Admin/Requests/Profile/EditRequest.php new file mode 100755 index 00000000..2e56b73f --- /dev/null +++ b/backend/app/Admin/Requests/Profile/EditRequest.php @@ -0,0 +1,78 @@ + + */ + public function rules(): array + { + $user = $this->user(); + return [ + 'first_name' => [ + Rule::prohibitedIf($user->kyc_status == 1), 'string', + ], + + 'last_name' => [ + Rule::prohibitedIf($user->kyc_status == 1), 'string', + ], + + 'national_id' => [ + Rule::prohibitedIf($user->kyc_status == 1), 'string', + ], + 'username' => 'string|max:255', + + 'email' => 'string|email|max:255', + 'phone_number' => 'string', + 'province_id' => 'string', + 'city_id' => 'string', + ]; + } + + public function after(): array + { + return [ + function (Validator $validator) { + $user = $this->user(); + + if (! $user) { + return; + } + + if ($user->kyc_status == 1) { + $lockedFields = [ + 'first_name', + 'last_name', + 'national_id', + ]; + + foreach ($lockedFields as $field) { + if ($this->filled($field)) { + $validator->errors()->add( + $field, + 'After KYC approval, you cannot change this field.' + ); + } + } + } + }, + ]; + } +} diff --git a/backend/app/User/Controllers/ProfileController.php b/backend/app/User/Controllers/ProfileController.php index 78f583c9..9afaa04a 100755 --- a/backend/app/User/Controllers/ProfileController.php +++ b/backend/app/User/Controllers/ProfileController.php @@ -24,17 +24,13 @@ class ProfileController extends Controller { $user = Auth::user(); - $user->update([ - 'first_name' => $request->first_name, - 'last_name' => $request->last_name, - 'national_id' => $request->national_id, - 'address' => $request->address, - 'postal_code' => $request->postal_code, - 'phone_number' => $request->phone_number, - 'province_id' => $request->province_id, - 'city_id' => $request->city_id, - 'status' => 1 - ]); + $data = $request->validated(); + + if ($user->kyc_status === 2) { + $data->safe()->except(['first_name', 'last_name' ,'national_id']); + } + + $user->update($data); return $this->successResponse(); } diff --git a/backend/app/User/Requests/Profile/EditRequest.php b/backend/app/User/Requests/Profile/EditRequest.php index 4eb93a4e..4b0e1eb4 100755 --- a/backend/app/User/Requests/Profile/EditRequest.php +++ b/backend/app/User/Requests/Profile/EditRequest.php @@ -4,6 +4,8 @@ namespace App\User\Requests\Profile; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Rule; +use Illuminate\Validation\Validator; class EditRequest extends FormRequest { @@ -22,10 +24,32 @@ class EditRequest extends FormRequest */ public function rules(): array { + $user = $this->user(); + $isKycApproved = (int) $user->kyc_status === 2; + return [ - 'first_name' => 'required|string', - 'last_name' => 'required|string', - 'national_id' => 'required', + 'first_name' => [ + Rule::prohibitedIf($isKycApproved), + 'required', + 'string', + 'max:255', + ], + + 'last_name' => [ + Rule::prohibitedIf($isKycApproved), + 'required', + 'string', + 'max:255', + ], + + 'national_id' => [ + Rule::prohibitedIf($isKycApproved), + 'required', + 'string', + 'max:20', + Rule::unique('users', 'national_id')->ignore($user->id), + ], + 'address' => 'required', 'postal_code' => 'required', 'phone_number' => 'required', @@ -33,4 +57,16 @@ class EditRequest extends FormRequest 'city_id' => 'required', ]; } + public function after(): array + { + return [ + function (Validator $validator) { + $user = $this->user(); + + if ( $user->kyc_status === 1) { + if + } + }, + ]; + } } diff --git a/backend/database/seeders/PaymentStatusSeeder.php b/backend/database/seeders/PaymentStatusSeeder.php index 5550baae..89ece425 100644 --- a/backend/database/seeders/PaymentStatusSeeder.php +++ b/backend/database/seeders/PaymentStatusSeeder.php @@ -4,6 +4,7 @@ namespace Database\Seeders; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; +use Illuminate\Support\Facades\DB; class PaymentStatusSeeder extends Seeder { @@ -12,6 +13,25 @@ class PaymentStatusSeeder extends Seeder */ public function run(): void { - // + DB::table('harim_states')->insert([ + ['id' => 1, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 2, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 3, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 4, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 5, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 6, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 7, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 8, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 9, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 10, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 11, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 12, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 13, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 14, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 15, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 16, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ['id' => 17, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], + ]); + } } diff --git a/backend/routes/expert.php b/backend/routes/expert.php index 50400564..a40d9dcd 100755 --- a/backend/routes/expert.php +++ b/backend/routes/expert.php @@ -4,6 +4,7 @@ use App\Admin\Controllers\AuthController; use App\Admin\Controllers\DocumentationController; use App\Admin\Controllers\ExpertManagementController; use App\Admin\Controllers\PermissionManagementController; +use App\Admin\Controllers\ProfileController; use App\Admin\Controllers\RoleManagementController; use App\Admin\Controllers\UserManagementController; @@ -71,3 +72,13 @@ Route::prefix('expert') Route::post('/{expert}', 'update')->name('update'); Route::delete('/{expert}', 'destroy')->name('destroy'); }); + +Route::prefix('profile') + ->name('profile.') + ->middleware('auth') + ->controller(ProfileController::class) + ->group(function () { + Route::get('info', 'info')->name('info'); + Route::post('edit', 'edit')->name('edit'); + Route::post('change_password', 'changePassword')->name('changePassword'); + }); From 2d8f2dbcc5abaa12306e641d459e3dca847a7d14 Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Mon, 18 May 2026 13:50:37 +0330 Subject: [PATCH 2/9] create profile for expert --- .../database/seeders/PaymentStatusSeeder.php | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/backend/database/seeders/PaymentStatusSeeder.php b/backend/database/seeders/PaymentStatusSeeder.php index 89ece425..3232c3c7 100644 --- a/backend/database/seeders/PaymentStatusSeeder.php +++ b/backend/database/seeders/PaymentStatusSeeder.php @@ -13,25 +13,6 @@ class PaymentStatusSeeder extends Seeder */ public function run(): void { - DB::table('harim_states')->insert([ - ['id' => 1, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 2, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 3, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 4, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 5, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 6, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 7, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 8, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 9, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 10, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 11, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 12, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 13, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 14, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 15, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 16, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ['id' => 17, 'name' => '', 'created_at' => now(), 'updated_at' => now(),], - ]); - + // } } From 60129f5abba112310889320bb43064d972a94863 Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Mon, 18 May 2026 13:57:03 +0330 Subject: [PATCH 3/9] create profile for expert --- backend/database/seeders/PaymentStatusSeeder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/database/seeders/PaymentStatusSeeder.php b/backend/database/seeders/PaymentStatusSeeder.php index 3232c3c7..4805963c 100644 --- a/backend/database/seeders/PaymentStatusSeeder.php +++ b/backend/database/seeders/PaymentStatusSeeder.php @@ -13,6 +13,6 @@ class PaymentStatusSeeder extends Seeder */ public function run(): void { - // + // } } From e9f6ee71faa901023693e1ccfa26c54d8d250d47 Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Mon, 18 May 2026 13:58:20 +0330 Subject: [PATCH 4/9] create profile for expert --- backend/database/seeders/PaymentStatusSeeder.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/database/seeders/PaymentStatusSeeder.php b/backend/database/seeders/PaymentStatusSeeder.php index 4805963c..adaa9b47 100644 --- a/backend/database/seeders/PaymentStatusSeeder.php +++ b/backend/database/seeders/PaymentStatusSeeder.php @@ -4,8 +4,6 @@ namespace Database\Seeders; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; -use Illuminate\Support\Facades\DB; - class PaymentStatusSeeder extends Seeder { /** From 3c61e279ec2135523234fa447a728c9b54ea5372 Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Mon, 18 May 2026 13:59:05 +0330 Subject: [PATCH 5/9] create profile for expert --- backend/database/seeders/PaymentStatusSeeder.php | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/database/seeders/PaymentStatusSeeder.php b/backend/database/seeders/PaymentStatusSeeder.php index adaa9b47..5550baae 100644 --- a/backend/database/seeders/PaymentStatusSeeder.php +++ b/backend/database/seeders/PaymentStatusSeeder.php @@ -4,6 +4,7 @@ namespace Database\Seeders; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; + class PaymentStatusSeeder extends Seeder { /** From d04637b1efea7a4e1b4eb95e82007c052d62a071 Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Mon, 18 May 2026 14:10:45 +0330 Subject: [PATCH 6/9] fix code --- .../Admin/Controllers/ProfileController.php | 1 - .../Admin/Requests/Profile/EditRequest.php | 45 ++----------------- .../User/Controllers/ProfileController.php | 8 +--- .../app/User/Requests/Profile/EditRequest.php | 38 ++++++++-------- 4 files changed, 22 insertions(+), 70 deletions(-) diff --git a/backend/app/Admin/Controllers/ProfileController.php b/backend/app/Admin/Controllers/ProfileController.php index dde39f98..23a80f7e 100755 --- a/backend/app/Admin/Controllers/ProfileController.php +++ b/backend/app/Admin/Controllers/ProfileController.php @@ -23,7 +23,6 @@ class ProfileController extends Controller public function edit(EditRequest $request): JsonResponse { $expert = $request->user('expert'); -// $expert->update($request->validated()); $expert->update([ 'username' => $request->username, diff --git a/backend/app/Admin/Requests/Profile/EditRequest.php b/backend/app/Admin/Requests/Profile/EditRequest.php index 2e56b73f..ccc056b4 100755 --- a/backend/app/Admin/Requests/Profile/EditRequest.php +++ b/backend/app/Admin/Requests/Profile/EditRequest.php @@ -26,53 +26,14 @@ class EditRequest extends FormRequest { $user = $this->user(); return [ - 'first_name' => [ - Rule::prohibitedIf($user->kyc_status == 1), 'string', - ], - - 'last_name' => [ - Rule::prohibitedIf($user->kyc_status == 1), 'string', - ], - - 'national_id' => [ - Rule::prohibitedIf($user->kyc_status == 1), 'string', - ], 'username' => 'string|max:255', - + 'first_name' => 'required|string', + 'last_name' => 'required|string', + 'national_id' => 'required', 'email' => 'string|email|max:255', 'phone_number' => 'string', 'province_id' => 'string', 'city_id' => 'string', ]; } - - public function after(): array - { - return [ - function (Validator $validator) { - $user = $this->user(); - - if (! $user) { - return; - } - - if ($user->kyc_status == 1) { - $lockedFields = [ - 'first_name', - 'last_name', - 'national_id', - ]; - - foreach ($lockedFields as $field) { - if ($this->filled($field)) { - $validator->errors()->add( - $field, - 'After KYC approval, you cannot change this field.' - ); - } - } - } - }, - ]; - } } diff --git a/backend/app/User/Controllers/ProfileController.php b/backend/app/User/Controllers/ProfileController.php index 9afaa04a..3d89e5dc 100755 --- a/backend/app/User/Controllers/ProfileController.php +++ b/backend/app/User/Controllers/ProfileController.php @@ -24,13 +24,7 @@ class ProfileController extends Controller { $user = Auth::user(); - $data = $request->validated(); - - if ($user->kyc_status === 2) { - $data->safe()->except(['first_name', 'last_name' ,'national_id']); - } - - $user->update($data); + $user->update($request->validated()); return $this->successResponse(); } diff --git a/backend/app/User/Requests/Profile/EditRequest.php b/backend/app/User/Requests/Profile/EditRequest.php index 4b0e1eb4..3f7468bd 100755 --- a/backend/app/User/Requests/Profile/EditRequest.php +++ b/backend/app/User/Requests/Profile/EditRequest.php @@ -25,31 +25,17 @@ class EditRequest extends FormRequest public function rules(): array { $user = $this->user(); - $isKycApproved = (int) $user->kyc_status === 2; - + return [ 'first_name' => [ - Rule::prohibitedIf($isKycApproved), - 'required', - 'string', - 'max:255', + Rule::prohibitedIf($user->kyc_status == 1), 'string', ], - 'last_name' => [ - Rule::prohibitedIf($isKycApproved), - 'required', - 'string', - 'max:255', + Rule::prohibitedIf($user->kyc_status == 1), 'string', ], - 'national_id' => [ - Rule::prohibitedIf($isKycApproved), - 'required', - 'string', - 'max:20', - Rule::unique('users', 'national_id')->ignore($user->id), + Rule::prohibitedIf($user->kyc_status == 1), 'string', ], - 'address' => 'required', 'postal_code' => 'required', 'phone_number' => 'required', @@ -62,9 +48,21 @@ class EditRequest extends FormRequest return [ function (Validator $validator) { $user = $this->user(); + if ($user->kyc_status == 1) { + $lockedFields = [ + 'first_name', + 'last_name', + 'national_id', + ]; - if ( $user->kyc_status === 1) { - if + foreach ($lockedFields as $field) { + if ($this->filled($field)) { + $validator->errors()->add( + $field, + 'you cannot change this field.' + ); + } + } } }, ]; From a7fa1097b7c6de60254ca64aef7cec5ca465e50a Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 20 May 2026 09:14:06 +0330 Subject: [PATCH 7/9] create user gateway controller --- .../ExpertManagementController.php | 1 - backend/app/Enums/BusinessTypeEnum.php | 23 +++++ .../GatewayManagementController.php | 87 +++++++++++++++++++ .../User/Requests/Gateway/StoreRequest.php | 36 ++++++++ .../User/Requests/Gateway/UpdateRequest.php | 32 +++++++ backend/routes/expert.php | 3 + backend/routes/web.php | 13 +++ 7 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 backend/app/User/Controllers/GatewayManagementController.php create mode 100644 backend/app/User/Requests/Gateway/StoreRequest.php create mode 100644 backend/app/User/Requests/Gateway/UpdateRequest.php diff --git a/backend/app/Admin/Controllers/ExpertManagementController.php b/backend/app/Admin/Controllers/ExpertManagementController.php index a3e0c989..f0edad53 100755 --- a/backend/app/Admin/Controllers/ExpertManagementController.php +++ b/backend/app/Admin/Controllers/ExpertManagementController.php @@ -4,7 +4,6 @@ namespace App\Admin\Controllers; use App\Admin\Requests\ExpertManagement\StoreRequest; use App\Admin\Requests\ExpertManagement\UpdateRequest; -use App\Admin\Resources\ExpertManagementResource; use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; use App\Models\City; diff --git a/backend/app/Enums/BusinessTypeEnum.php b/backend/app/Enums/BusinessTypeEnum.php index dcd453de..232cc49f 100644 --- a/backend/app/Enums/BusinessTypeEnum.php +++ b/backend/app/Enums/BusinessTypeEnum.php @@ -40,4 +40,27 @@ enum BusinessTypeEnum: int self::OTHER => 'other', }; } + + public function name($id): string + { + $mapArray = [ + 1 => 'medical', + 2 => 'legal', + 3 => 'engineering', + 4 => 'education', + 5 => 'consulting', + 6 => 'beauty', + 7 => 'technical_services', + 8 => 'financial', + 9 => 'real_estate', + 10 => 'restaurant', + 11 => 'shop', + 12 => 'transportation', + 13 => 'art', + 14 => 'sport', + 15 => 'other', + ]; + + return $mapArray[$id]; + } } diff --git a/backend/app/User/Controllers/GatewayManagementController.php b/backend/app/User/Controllers/GatewayManagementController.php new file mode 100644 index 00000000..41d62b8c --- /dev/null +++ b/backend/app/User/Controllers/GatewayManagementController.php @@ -0,0 +1,87 @@ +where('user_id', '=', Auth::guard('web')->id()), + $request, + allowedFilters: ['*'], + allowedSortings: ['*'], + allowedSelects: ['id', 'name', 'domain', 'tax_id', 'bank_name', 'account_holder', 'iban', 'business_type_id', 'business_type_name'], + ); + } + + public function store(StoreRequest $request): JsonResponse + { + $user = Auth::guard('web')->user(); + + $logo = $request->has('logo') ? FileFacade::save($request->file('logo'), "{$user->id}") : null; + + UserGateway::query()->create([ + 'user_id' => $user->id, + 'username' => $user->username, + 'name' => $request->name, + 'domain' => $request->domain, + 'tax_id' => $request->tax_id, + 'bank_name' => $request->bank_name, + 'account_holder' => $request->account_holder, + 'iban' => $request->iban, + 'business_type_id' => $request->business_type_id, + 'business_type_name' => BusinessTypeEnum::name($request->business_type_id), + 'logo' => $logo, + ]); + + return $this->successResponse(); + } + + public function show(UserGateway $gateway): JsonResponse + { + return $this->successResponse($gateway); + } + + public function update(UpdateRequest $request, UserGateway $gateway): JsonResponse + { + $logo = null; + $user = Auth::guard('web')->user(); + + if ($request->has('logo')) + { + FileFacade::delete($gateway->logo, true); + $logo = FileFacade::save(request()->file('logo'), "{$user->id}"); + } + + $gateway->update([ + 'name' => $request->name, + 'domain' => $request->domain, + 'business_type_id' => $request->business_type_id, + 'business_type_name' => BusinessTypeEnum::name($request->business_type_id), + 'logo' => $logo, + ]); + + return $this->successResponse(); + } + + public function destroy(UserGateway $gateway): JsonResponse + { + $gateway->delete(); + return $this->successResponse(); + } +} diff --git a/backend/app/User/Requests/Gateway/StoreRequest.php b/backend/app/User/Requests/Gateway/StoreRequest.php new file mode 100644 index 00000000..2dcc0faa --- /dev/null +++ b/backend/app/User/Requests/Gateway/StoreRequest.php @@ -0,0 +1,36 @@ + + */ + public function rules(): array + { + return [ + 'name' => 'required|string|max:255', + 'domain' => 'required|string|max:255', + 'tax_id' => 'required|string', + 'bank_name' => 'required|string|max:255', + 'account_holder' => 'required|string', + 'iban' => 'required|string|max:255', + 'logo' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'business_type_id' => 'required|string|exists:business_types,id', + ]; + } +} diff --git a/backend/app/User/Requests/Gateway/UpdateRequest.php b/backend/app/User/Requests/Gateway/UpdateRequest.php new file mode 100644 index 00000000..30db4db1 --- /dev/null +++ b/backend/app/User/Requests/Gateway/UpdateRequest.php @@ -0,0 +1,32 @@ + + */ + public function rules(): array + { + return [ + 'name' => 'required|string|max:255', + 'domain' => 'required|string|max:255', + 'business_type_id' => 'required|string|exists:business_types,id', + 'logo' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048', + ]; + } +} diff --git a/backend/routes/expert.php b/backend/routes/expert.php index 50400564..3597a42f 100755 --- a/backend/routes/expert.php +++ b/backend/routes/expert.php @@ -38,6 +38,7 @@ Route::prefix('user_management') Route::post('/{user}', 'update')->name('update'); Route::delete('/{user}', 'destroy')->name('destroy'); }); + Route::prefix('roles') ->name('roles.') ->middleware(['auth:expert', 'permission:role-management']) @@ -49,6 +50,7 @@ Route::prefix('roles') Route::post('/{role}', 'update')->name('update'); Route::delete('/{role}', 'destroy')->name('destroy'); }); + Route::prefix('permissions') ->name('permissions.') ->middleware(['auth:expert', 'permission:permission-management']) @@ -60,6 +62,7 @@ Route::prefix('permissions') Route::post('/{permission}', 'update')->name('update'); Route::delete('/{permission}', 'destroy')->name('destroy'); }); + Route::prefix('expert') ->name('expert.') ->middleware(['auth:expert', 'permission:expert-management']) diff --git a/backend/routes/web.php b/backend/routes/web.php index 28784019..b4048d81 100755 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -5,6 +5,7 @@ use App\Admin\Controllers\PermissionManagementController; use App\Admin\Controllers\RoleManagementController; use App\Admin\Controllers\UserManagementController; use App\User\Controllers\AuthController; +use App\User\Controllers\GatewayManagementController; use App\User\Controllers\ProfileController; use Illuminate\Support\Facades\Route; @@ -26,3 +27,15 @@ Route::prefix('profile') Route::post('edit', 'edit')->name('edit'); Route::post('change_password', 'changePassword')->name('changePassword'); }); + +Route::prefix('user_gateway') + ->name('userGateway.') + ->middleware(['auth']) + ->controller(GatewayManagementController::class) + ->group(function () { + Route::get('/', 'index')->name('index'); + Route::post('/', 'store')->name('store'); + Route::get('/{gateway}', 'show')->name('show'); + Route::post('/{gateway}', 'update')->name('update'); + Route::delete('/{gateway}', 'destroy')->name('destroy'); + }); From 76e6ab4e0cd14f89cb717aa1f12b3446cbd4d7b2 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 20 May 2026 09:53:05 +0330 Subject: [PATCH 8/9] change edit method --- .../Admin/Requests/Profile/EditRequest.php | 1 - .../GatewayManagementController.php | 36 +++++++++----- .../User/Controllers/ProfileController.php | 20 +++++++- .../User/Requests/Gateway/StoreRequest.php | 3 +- .../User/Requests/Gateway/UpdateRequest.php | 3 +- .../app/User/Requests/Profile/EditRequest.php | 47 +++++-------------- .../0001_01_01_000000_create_users_table.php | 1 - 7 files changed, 57 insertions(+), 54 deletions(-) diff --git a/backend/app/Admin/Requests/Profile/EditRequest.php b/backend/app/Admin/Requests/Profile/EditRequest.php index ccc056b4..6b997c9e 100755 --- a/backend/app/Admin/Requests/Profile/EditRequest.php +++ b/backend/app/Admin/Requests/Profile/EditRequest.php @@ -24,7 +24,6 @@ class EditRequest extends FormRequest */ public function rules(): array { - $user = $this->user(); return [ 'username' => 'string|max:255', 'first_name' => 'required|string', diff --git a/backend/app/User/Controllers/GatewayManagementController.php b/backend/app/User/Controllers/GatewayManagementController.php index 41d62b8c..690d364e 100644 --- a/backend/app/User/Controllers/GatewayManagementController.php +++ b/backend/app/User/Controllers/GatewayManagementController.php @@ -13,6 +13,8 @@ use App\User\Requests\Gateway\UpdateRequest; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\DB; +use Throwable; class GatewayManagementController extends Controller { @@ -29,25 +31,33 @@ class GatewayManagementController extends Controller ); } + /** + * @throws Throwable + */ public function store(StoreRequest $request): JsonResponse { $user = Auth::guard('web')->user(); $logo = $request->has('logo') ? FileFacade::save($request->file('logo'), "{$user->id}") : null; - UserGateway::query()->create([ - 'user_id' => $user->id, - 'username' => $user->username, - 'name' => $request->name, - 'domain' => $request->domain, - 'tax_id' => $request->tax_id, - 'bank_name' => $request->bank_name, - 'account_holder' => $request->account_holder, - 'iban' => $request->iban, - 'business_type_id' => $request->business_type_id, - 'business_type_name' => BusinessTypeEnum::name($request->business_type_id), - 'logo' => $logo, - ]); + DB::transaction(function () use ($user, $logo, $request) { + UserGateway::query()->create([ + 'user_id' => $user->id, + 'username' => $user->username, + 'name' => $request->name, + 'domain' => $request->domain, + 'tax_id' => $request->tax_id, + 'bank_name' => $request->bank_name, + 'account_holder' => $request->account_holder, + 'iban' => $request->iban, + 'business_type_id' => $request->business_type_id, + 'business_type_name' => BusinessTypeEnum::name($request->business_type_id), + 'logo' => $logo, + ]); + + $user->update(['authority_level' => 1]); + }); + return $this->successResponse(); } diff --git a/backend/app/User/Controllers/ProfileController.php b/backend/app/User/Controllers/ProfileController.php index 3d89e5dc..ef007a21 100755 --- a/backend/app/User/Controllers/ProfileController.php +++ b/backend/app/User/Controllers/ProfileController.php @@ -3,6 +3,8 @@ namespace App\User\Controllers; use App\Http\Controllers\Controller; +use App\Models\City; +use App\Models\Province; use App\Traits\ApiResponse; use App\User\Requests\Profile\ChangePasswordRequest; use App\User\Requests\Profile\EditRequest; @@ -23,8 +25,24 @@ class ProfileController extends Controller public function edit(EditRequest $request): JsonResponse { $user = Auth::user(); + $province = Province::query()->find($request->province_id); + $city = City::query()->find($request->city_id); - $user->update($request->validated()); + $user->update([ + 'first_name' => $request->first_name, + 'last_name' => $request->last_name, + 'national_id' => $request->national_id, + 'address' => $request->address, + 'postal_code' => $request->postal_code, + 'phone_number' => $request->phone_number, + 'province_id' => $province->id, + 'province_name' => $province->name, + 'city_id' => $city->id, + 'city_name' => $city->name, + 'birth_date' => $request->birth_date, + 'email' => $request->email, + 'kyc_status' => 1, + ]); return $this->successResponse(); } diff --git a/backend/app/User/Requests/Gateway/StoreRequest.php b/backend/app/User/Requests/Gateway/StoreRequest.php index 2dcc0faa..f7562dd8 100644 --- a/backend/app/User/Requests/Gateway/StoreRequest.php +++ b/backend/app/User/Requests/Gateway/StoreRequest.php @@ -4,6 +4,7 @@ namespace App\User\Requests\Gateway; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Support\Facades\Auth; class StoreRequest extends FormRequest { @@ -12,7 +13,7 @@ class StoreRequest extends FormRequest */ public function authorize(): bool { - return true; + return Auth::guard('web')->user()->kyc_status; } /** diff --git a/backend/app/User/Requests/Gateway/UpdateRequest.php b/backend/app/User/Requests/Gateway/UpdateRequest.php index 30db4db1..749eb4da 100644 --- a/backend/app/User/Requests/Gateway/UpdateRequest.php +++ b/backend/app/User/Requests/Gateway/UpdateRequest.php @@ -4,6 +4,7 @@ namespace App\User\Requests\Gateway; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Support\Facades\Auth; class UpdateRequest extends FormRequest { @@ -12,7 +13,7 @@ class UpdateRequest extends FormRequest */ public function authorize(): bool { - return true; + return Auth::guard('web')->user()->kyc_status; } /** diff --git a/backend/app/User/Requests/Profile/EditRequest.php b/backend/app/User/Requests/Profile/EditRequest.php index 3f7468bd..450ce3fa 100755 --- a/backend/app/User/Requests/Profile/EditRequest.php +++ b/backend/app/User/Requests/Profile/EditRequest.php @@ -4,6 +4,7 @@ namespace App\User\Requests\Profile; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Support\Facades\Auth; use Illuminate\Validation\Rule; use Illuminate\Validation\Validator; @@ -24,47 +25,21 @@ class EditRequest extends FormRequest */ public function rules(): array { - $user = $this->user(); + $user = Auth::guard('web')->user(); return [ - 'first_name' => [ - Rule::prohibitedIf($user->kyc_status == 1), 'string', - ], - 'last_name' => [ - Rule::prohibitedIf($user->kyc_status == 1), 'string', - ], + 'first_name' => 'required|string|max:255', + 'last_name' => 'required|string|max:255', 'national_id' => [ Rule::prohibitedIf($user->kyc_status == 1), 'string', ], - 'address' => 'required', - 'postal_code' => 'required', - 'phone_number' => 'required', - 'province_id' => 'required', - 'city_id' => 'required', - ]; - } - public function after(): array - { - return [ - function (Validator $validator) { - $user = $this->user(); - if ($user->kyc_status == 1) { - $lockedFields = [ - 'first_name', - 'last_name', - 'national_id', - ]; - - foreach ($lockedFields as $field) { - if ($this->filled($field)) { - $validator->errors()->add( - $field, - 'you cannot change this field.' - ); - } - } - } - }, + 'email' => 'required|email|max:255', + 'address' => 'required|string', + 'postal_code' => 'required|string', + 'phone_number' => 'required|string', + 'province_id' => 'required|exists:provinces,id', + 'city_id' => 'required|exists:cities,id', + 'birth_date' => 'required|date', ]; } } diff --git a/backend/database/migrations/0001_01_01_000000_create_users_table.php b/backend/database/migrations/0001_01_01_000000_create_users_table.php index 0ac11763..124ca19a 100755 --- a/backend/database/migrations/0001_01_01_000000_create_users_table.php +++ b/backend/database/migrations/0001_01_01_000000_create_users_table.php @@ -22,7 +22,6 @@ return new class extends Migration $table->string('national_id')->nullable(); $table->string('address')->nullable(); $table->string('postal_code')->nullable(); - $table->string('tax_id')->nullable(); $table->string('phone_number')->nullable(); $table->date('birth_date')->nullable(); $table->foreignId('province_id')->nullable()->constrained('provinces'); From 463ca3f006b794527e02e0a934bf9186ebe22f0c Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Wed, 20 May 2026 15:22:13 +0330 Subject: [PATCH 9/9] add id card to profile --- .../app/Services/FIB/AuthorizationService.php | 3 +- .../User/Controllers/ProfileController.php | 46 +++++++++++++------ .../app/User/Requests/Profile/EditRequest.php | 5 +- backend/app/User/Resources/UserResource.php | 12 +++++ backend/config/logging.php | 6 +++ ...05_18_095610_create_transactions_table.php | 2 +- 6 files changed, 53 insertions(+), 21 deletions(-) diff --git a/backend/app/Services/FIB/AuthorizationService.php b/backend/app/Services/FIB/AuthorizationService.php index 9867133f..8f1e40df 100755 --- a/backend/app/Services/FIB/AuthorizationService.php +++ b/backend/app/Services/FIB/AuthorizationService.php @@ -16,7 +16,7 @@ class AuthorizationService public function __construct() { $this->url = config('fib.authorization.url'); - $this->channelName = ''; + $this->channelName = 'fib_authorization'; $this->inputParameters = [ 'client_id' => config('fib.authorization.client_id'), 'client_secret' => config('fib.authorization.client_secret'), @@ -51,7 +51,6 @@ class AuthorizationService { return Http::asForm() ->throw() - ->withoutVerifying() ->post($this->url, $this->inputParameters) ->json(); } diff --git a/backend/app/User/Controllers/ProfileController.php b/backend/app/User/Controllers/ProfileController.php index ef007a21..f8fb83e2 100755 --- a/backend/app/User/Controllers/ProfileController.php +++ b/backend/app/User/Controllers/ProfileController.php @@ -2,6 +2,7 @@ namespace App\User\Controllers; +use App\Facades\File\FileFacade; use App\Http\Controllers\Controller; use App\Models\City; use App\Models\Province; @@ -11,7 +12,9 @@ use App\User\Requests\Profile\EditRequest; use App\User\Resources\UserResource; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; +use Throwable; class ProfileController extends Controller { @@ -22,27 +25,40 @@ class ProfileController extends Controller return $this->successResponse(new UserResource(Auth::user())); } + /** + * @throws Throwable + */ public function edit(EditRequest $request): JsonResponse { $user = Auth::user(); $province = Province::query()->find($request->province_id); $city = City::query()->find($request->city_id); - $user->update([ - 'first_name' => $request->first_name, - 'last_name' => $request->last_name, - 'national_id' => $request->national_id, - 'address' => $request->address, - 'postal_code' => $request->postal_code, - 'phone_number' => $request->phone_number, - 'province_id' => $province->id, - 'province_name' => $province->name, - 'city_id' => $city->id, - 'city_name' => $city->name, - 'birth_date' => $request->birth_date, - 'email' => $request->email, - 'kyc_status' => 1, - ]); + DB::transaction(function () use ($user, $province, $city, $request) { + if ($user->kyc_status == 0) + { + $user->documents()->create([ + 'title' => 'id_card', + 'url' => FileFacade::save($request->file('id_card'), "{$user->id}/"), + ]); + } + + $user->update([ + 'first_name' => $request->first_name, + 'last_name' => $request->last_name, + 'national_id' => $request->national_id, + 'address' => $request->address, + 'postal_code' => $request->postal_code, + 'phone_number' => $request->phone_number, + 'province_id' => $province->id, + 'province_name' => $province->name, + 'city_id' => $city->id, + 'city_name' => $city->name, + 'birth_date' => $request->birth_date, + 'email' => $request->email, + 'kyc_status' => 1, + ]); + }); return $this->successResponse(); } diff --git a/backend/app/User/Requests/Profile/EditRequest.php b/backend/app/User/Requests/Profile/EditRequest.php index 450ce3fa..0467ddc2 100755 --- a/backend/app/User/Requests/Profile/EditRequest.php +++ b/backend/app/User/Requests/Profile/EditRequest.php @@ -30,9 +30,7 @@ class EditRequest extends FormRequest return [ 'first_name' => 'required|string|max:255', 'last_name' => 'required|string|max:255', - 'national_id' => [ - Rule::prohibitedIf($user->kyc_status == 1), 'string', - ], + 'national_id' => [Rule::prohibitedIf($user->kyc_status == 1), 'string',], 'email' => 'required|email|max:255', 'address' => 'required|string', 'postal_code' => 'required|string', @@ -40,6 +38,7 @@ class EditRequest extends FormRequest 'province_id' => 'required|exists:provinces,id', 'city_id' => 'required|exists:cities,id', 'birth_date' => 'required|date', + 'id_card' => [Rule::prohibitedIf($user->kyc_status == 1), 'image', 'mimes:jpeg,png,jpg,gif,svg', 'max:2048'] ]; } } diff --git a/backend/app/User/Resources/UserResource.php b/backend/app/User/Resources/UserResource.php index 55f98563..d5df7636 100755 --- a/backend/app/User/Resources/UserResource.php +++ b/backend/app/User/Resources/UserResource.php @@ -18,6 +18,18 @@ class UserResource extends JsonResource 'id' => $this->id, 'username' => $this->username, 'email' => $this->email, + 'first_name' => $this->first_name, + 'last_name' => $this->last_name, + 'national_id' => $this->national_id, + 'address' => $this->address, + 'postal_code' => $this->postal_code, + 'phone_number' => $this->phone_number, + 'province_id' => $this->provonce_id, + 'province_name' => $this->province_name, + 'city_id' => $this->city_id, + 'city_name' => $this->city_name, + 'birth_date' => $this->birth_date, + 'kyc_status' => $this->kyc_status, ]; } } diff --git a/backend/config/logging.php b/backend/config/logging.php index b09cb25d..ee09ba9e 100755 --- a/backend/config/logging.php +++ b/backend/config/logging.php @@ -127,6 +127,12 @@ return [ 'path' => storage_path('logs/laravel.log'), ], + 'fib_authorization' => [ + 'driver' => 'single', + 'path' => storage_path('logs/fib/authorization.log'), + 'level' => 'error', + ], + ], ]; diff --git a/backend/database/migrations/2026_05_18_095610_create_transactions_table.php b/backend/database/migrations/2026_05_18_095610_create_transactions_table.php index 7176a51f..208f6f8e 100644 --- a/backend/database/migrations/2026_05_18_095610_create_transactions_table.php +++ b/backend/database/migrations/2026_05_18_095610_create_transactions_table.php @@ -21,7 +21,7 @@ return new class extends Migration $table->dateTime('expires_in'); $table->foreignId('payment_id')->constrained('payments'); $table->string('payment_track_id'); - $table->foreignId('gateway_id')->constrained('gateways'); + $table->foreignId('user_gateway_id')->constrained('user_gateways'); $table->integer('status'); $table->timestamps(); });