diff --git a/backend/app/Admin/Controllers/AuthController.php b/backend/app/Admin/Controllers/AuthController.php index 5c794ff5..4ea69b0a 100644 --- a/backend/app/Admin/Controllers/AuthController.php +++ b/backend/app/Admin/Controllers/AuthController.php @@ -2,26 +2,34 @@ namespace App\Admin\Controllers; +use App\Admin\Requests\Auth\LoginRequest; +use App\Admin\Requests\Auth\RegisterRequest; use App\Http\Controllers\Controller; +use App\Models\Expert; use App\Traits\ApiResponse; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Hash; class AuthController extends Controller { use ApiResponse; - public function register(Request $request): JsonResponse + public function register(RegisterRequest $request): JsonResponse { -// Expert::query()->create(); + Expert::query()->create([ + 'username' => $request->username, + 'email' => $request->email, + 'password' => Hash::make($request->password), + ]); $request->session()->regenerate(); return $this->successResponse(); } - public function login(Request $request): JsonResponse + public function login(LoginRequest $request): JsonResponse { $credentials = ['password' => $request->password]; @@ -35,13 +43,7 @@ class AuthController extends Controller { $request->session()->regenerate(); - $user = Auth::user(); - - return $this->successResponse([ - 'id' => $user->id, - 'username' => $user->username, - 'email' => $user->email, - ]); + return $this->successResponse(); } return $this->errorResponse(__('messages.incorrect_or_username_password')); @@ -49,7 +51,7 @@ class AuthController extends Controller public function logout(Request $request): JsonResponse { - Auth::logout(); + Auth::guard('expert')->logout(); $request->session()->invalidate(); diff --git a/backend/app/Admin/Controllers/DocumentationController.php b/backend/app/Admin/Controllers/DocumentationController.php index d1de7b04..54e374e5 100644 --- a/backend/app/Admin/Controllers/DocumentationController.php +++ b/backend/app/Admin/Controllers/DocumentationController.php @@ -2,6 +2,7 @@ namespace App\Admin\Controllers; +use App\Admin\Requests\Documentation\RejectRequest; use App\Facades\DataTable\DataTableFacade; use App\Http\Controllers\Controller; use App\Models\User; @@ -36,16 +37,17 @@ class DocumentationController extends Controller public function confirm(User $user): JsonResponse { $user->update([ - + 'authority_level' => 1 ]); return $this->successResponse(); } - public function reject(User $user): JsonResponse + public function reject(RejectRequest $request, User $user): JsonResponse { $user->update([ - + 'kyc_status' => 0, + 'kyc_reject_reason' => $request->kyc_reject_reason ]); return $this->successResponse(); diff --git a/backend/app/Admin/Controllers/ProfileController.php b/backend/app/Admin/Controllers/ProfileController.php index 39d81669..5b825966 100644 --- a/backend/app/Admin/Controllers/ProfileController.php +++ b/backend/app/Admin/Controllers/ProfileController.php @@ -2,11 +2,13 @@ namespace App\Admin\Controllers; +use App\Admin\Requests\Profile\ChangePasswordRequest; use App\Admin\Resources\ExpertResource; use App\Http\Controllers\Controller; use App\Traits\ApiResponse; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Hash; class ProfileController extends Controller { @@ -14,6 +16,22 @@ class ProfileController extends Controller public function info(): JsonResponse { - return $this->successResponse(new ExpertResource(Auth::user())); + return $this->successResponse(new ExpertResource(Auth::guard('expert')->user())); + } + + public function changePassword(ChangePasswordRequest $request): JsonResponse + { + $expert = Auth::guard('expert')->user(); + + if (! Hash::check($request->current_password, $expert->password)) + { + return $this->errorResponse(__('messages.incorrect_current_password')); + } + + $expert->update([ + 'password' => Hash::make($request->new_password) + ]); + + return $this->successResponse(); } } diff --git a/backend/app/Admin/Requests/Auth/LoginRequest.php b/backend/app/Admin/Requests/Auth/LoginRequest.php new file mode 100644 index 00000000..16c27d74 --- /dev/null +++ b/backend/app/Admin/Requests/Auth/LoginRequest.php @@ -0,0 +1,30 @@ + + */ + public function rules(): array + { + return [ + 'login' => 'required|string', + 'password' => 'required|string', + ]; + } +} diff --git a/backend/app/Admin/Requests/Auth/RegisterRequest.php b/backend/app/Admin/Requests/Auth/RegisterRequest.php new file mode 100644 index 00000000..be5ffa9a --- /dev/null +++ b/backend/app/Admin/Requests/Auth/RegisterRequest.php @@ -0,0 +1,31 @@ + + */ + public function rules(): array + { + return [ + 'username' => 'required|unique:experts,username', + 'email' => 'required|email|unique:experts,email', + 'password' => 'required|string|regex:/^(?=.*[a-zA-Z])(?=.*\d).+$/|min:6|confirmed', + ]; + } +} diff --git a/backend/app/Admin/Requests/Documentation/RejectRequest.php b/backend/app/Admin/Requests/Documentation/RejectRequest.php new file mode 100644 index 00000000..0a65ebdf --- /dev/null +++ b/backend/app/Admin/Requests/Documentation/RejectRequest.php @@ -0,0 +1,29 @@ + + */ + public function rules(): array + { + return [ + 'kyc_reject_reason' => 'required|string', + ]; + } +} diff --git a/backend/app/Admin/Requests/Profile/ChangePasswordRequest.php b/backend/app/Admin/Requests/Profile/ChangePasswordRequest.php new file mode 100644 index 00000000..f4f0953e --- /dev/null +++ b/backend/app/Admin/Requests/Profile/ChangePasswordRequest.php @@ -0,0 +1,30 @@ + + */ + public function rules(): array + { + return [ + 'current_password' => 'required|string|regex:/^(?=.*[a-zA-Z])(?=.*\d).+$/|min:8', + 'new_password' => 'required|string|regex:/^(?=.*[a-zA-Z])(?=.*\d).+$/|min:8', + ]; + } +} diff --git a/backend/app/User/Controllers/AuthController.php b/backend/app/User/Controllers/AuthController.php index a967436c..433624cc 100644 --- a/backend/app/User/Controllers/AuthController.php +++ b/backend/app/User/Controllers/AuthController.php @@ -18,12 +18,14 @@ class AuthController extends Controller public function register(RegisterRequest $request): JsonResponse { - User::query()->create([ + $user = User::query()->create([ 'username' => $request->username, 'email' => $request->email, 'password' => Hash::make($request->password), ]); + Auth::guard('web')->login($user); + $request->session()->regenerate(); return $this->successResponse(); @@ -43,13 +45,7 @@ class AuthController extends Controller { $request->session()->regenerate(); - $user = Auth::user(); - - return $this->successResponse([ - 'id' => $user->id, - 'username' => $user->username, - 'email' => $user->email, - ]); + return $this->successResponse(); } return $this->errorResponse(__('messages.incorrect_or_username_password')); @@ -57,7 +53,7 @@ class AuthController extends Controller public function logout(Request $request): JsonResponse { - Auth::logout(); + Auth::guard('web')->logout(); $request->session()->invalidate(); diff --git a/backend/database/migrations/2026_05_13_054404_add_column_to_users_table.php b/backend/database/migrations/2026_05_13_054404_add_column_to_users_table.php new file mode 100644 index 00000000..dcc326de --- /dev/null +++ b/backend/database/migrations/2026_05_13_054404_add_column_to_users_table.php @@ -0,0 +1,28 @@ +string('kyc_reject_reason')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('kyc_reject_reason'); + }); + } +}; diff --git a/backend/routes/expert.php b/backend/routes/expert.php index efe53012..db005e64 100755 --- a/backend/routes/expert.php +++ b/backend/routes/expert.php @@ -1,10 +1,20 @@ name('auth.') + ->controller(AuthController::class) + ->group(function () { + Route::post('register', 'register')->name('register'); + Route::post('login', 'login')->name('login'); + Route::post('logout', 'logout')->name('logout'); +}); + Route::prefix('documents') ->name('documents.') - ->middleware('auth') + ->middleware('auth:expert') ->controller(DocumentationController::class) ->group(function () { Route::get('/', 'index')->name('index');