Merge pull request 'create expert login resources' (#13) from feature/ExpertLogin into develop

Reviewed-on: #13
This commit was merged in pull request #13.
This commit is contained in:
2026-05-13 10:16:51 +00:00
10 changed files with 201 additions and 25 deletions

View File

@@ -2,26 +2,34 @@
namespace App\Admin\Controllers; namespace App\Admin\Controllers;
use App\Admin\Requests\Auth\LoginRequest;
use App\Admin\Requests\Auth\RegisterRequest;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Expert;
use App\Traits\ApiResponse; use App\Traits\ApiResponse;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller class AuthController extends Controller
{ {
use ApiResponse; 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(); $request->session()->regenerate();
return $this->successResponse(); return $this->successResponse();
} }
public function login(Request $request): JsonResponse public function login(LoginRequest $request): JsonResponse
{ {
$credentials = ['password' => $request->password]; $credentials = ['password' => $request->password];
@@ -35,13 +43,7 @@ class AuthController extends Controller
{ {
$request->session()->regenerate(); $request->session()->regenerate();
$user = Auth::user(); return $this->successResponse();
return $this->successResponse([
'id' => $user->id,
'username' => $user->username,
'email' => $user->email,
]);
} }
return $this->errorResponse(__('messages.incorrect_or_username_password')); return $this->errorResponse(__('messages.incorrect_or_username_password'));
@@ -49,7 +51,7 @@ class AuthController extends Controller
public function logout(Request $request): JsonResponse public function logout(Request $request): JsonResponse
{ {
Auth::logout(); Auth::guard('expert')->logout();
$request->session()->invalidate(); $request->session()->invalidate();

View File

@@ -2,6 +2,7 @@
namespace App\Admin\Controllers; namespace App\Admin\Controllers;
use App\Admin\Requests\Documentation\RejectRequest;
use App\Facades\DataTable\DataTableFacade; use App\Facades\DataTable\DataTableFacade;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\User; use App\Models\User;
@@ -36,16 +37,17 @@ class DocumentationController extends Controller
public function confirm(User $user): JsonResponse public function confirm(User $user): JsonResponse
{ {
$user->update([ $user->update([
'authority_level' => 1
]); ]);
return $this->successResponse(); return $this->successResponse();
} }
public function reject(User $user): JsonResponse public function reject(RejectRequest $request, User $user): JsonResponse
{ {
$user->update([ $user->update([
'kyc_status' => 0,
'kyc_reject_reason' => $request->kyc_reject_reason
]); ]);
return $this->successResponse(); return $this->successResponse();

View File

@@ -2,11 +2,13 @@
namespace App\Admin\Controllers; namespace App\Admin\Controllers;
use App\Admin\Requests\Profile\ChangePasswordRequest;
use App\Admin\Resources\ExpertResource; use App\Admin\Resources\ExpertResource;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Traits\ApiResponse; use App\Traits\ApiResponse;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class ProfileController extends Controller class ProfileController extends Controller
{ {
@@ -14,6 +16,22 @@ class ProfileController extends Controller
public function info(): JsonResponse 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();
} }
} }

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Admin\Requests\Auth;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class LoginRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{
return [
'login' => 'required|string',
'password' => 'required|string',
];
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Admin\Requests\Auth;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class RegisterRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
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',
];
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Admin\Requests\Documentation;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class RejectRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{
return [
'kyc_reject_reason' => 'required|string',
];
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Admin\Requests\Profile;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class ChangePasswordRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
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',
];
}
}

View File

@@ -18,12 +18,14 @@ class AuthController extends Controller
public function register(RegisterRequest $request): JsonResponse public function register(RegisterRequest $request): JsonResponse
{ {
User::query()->create([ $user = User::query()->create([
'username' => $request->username, 'username' => $request->username,
'email' => $request->email, 'email' => $request->email,
'password' => Hash::make($request->password), 'password' => Hash::make($request->password),
]); ]);
Auth::guard('web')->login($user);
$request->session()->regenerate(); $request->session()->regenerate();
return $this->successResponse(); return $this->successResponse();
@@ -43,13 +45,7 @@ class AuthController extends Controller
{ {
$request->session()->regenerate(); $request->session()->regenerate();
$user = Auth::user(); return $this->successResponse();
return $this->successResponse([
'id' => $user->id,
'username' => $user->username,
'email' => $user->email,
]);
} }
return $this->errorResponse(__('messages.incorrect_or_username_password')); return $this->errorResponse(__('messages.incorrect_or_username_password'));
@@ -57,7 +53,7 @@ class AuthController extends Controller
public function logout(Request $request): JsonResponse public function logout(Request $request): JsonResponse
{ {
Auth::logout(); Auth::guard('web')->logout();
$request->session()->invalidate(); $request->session()->invalidate();

View File

@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('kyc_reject_reason')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('kyc_reject_reason');
});
}
};

View File

@@ -1,10 +1,20 @@
<?php <?php
use App\Admin\Controllers\AuthController;
use App\Admin\Controllers\DocumentationController; use App\Admin\Controllers\DocumentationController;
Route::prefix('auth')
->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') Route::prefix('documents')
->name('documents.') ->name('documents.')
->middleware('auth') ->middleware('auth:expert')
->controller(DocumentationController::class) ->controller(DocumentationController::class)
->group(function () { ->group(function () {
Route::get('/', 'index')->name('index'); Route::get('/', 'index')->name('index');