get('/user', function (Request $request) { /** * @OA\Get( * path="/api/user", * summary="Dapatkan butiran pengguna yang sedang disahkan.", * tags={"Pengguna"}, * security={{"sanctum":{}}}, * @OA\Response( * response=200, * description="Berjaya mendapatkan butiran pengguna.", * @OA\JsonContent( * @OA\Property(property="id", type="integer", example="1"), * @OA\Property(property="name", type="string", example="Nama Pengguna"), * @OA\Property(property="email", type="string", example="user@example.com"), * // ... tambah sifat pengguna lain di sini * ) * ), * @OA\Response( * response=401, * description="Tidak disahkan." * ) * ) */ return $request->user(); }); // --- Laluan Pengesahan (Authentication Routes) --- // Dikendalikan oleh RegisterController untuk pendaftaran, log masuk, dan log keluar. Route::controller(RegisterController::class)->group(function(){ /** * @OA\Post( * path="/api/register", * summary="Daftar pengguna baru.", * tags={"Pengesahan"}, * @OA\RequestBody( * required=true, * @OA\JsonContent( * @OA\Property(property="name", type="string", example="John Doe", description="Nama pengguna."), * @OA\Property(property="email", type="string", format="email", example="john@example.com", description="Alamat emel unik."), * @OA\Property(property="password", type="string", format="password", example="password123", description="Kata laluan pengguna (min 8 aksara)."), * @OA\Property(property="c_password", type="string", format="password", example="password123", description="Pengesahan kata laluan, mesti sama dengan 'password'.") * ) * ), * @OA\Response( * response=200, * description="Pendaftaran pengguna berjaya.", * @OA\JsonContent( * @OA\Property(property="token", type="string", example="1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"), * @OA\Property(property="name", type="string", example="John Doe") * ) * ), * @OA\Response( * response=422, * description="Ralat pengesahan." * ) * ) */ Route::post('register', 'register'); /** * @OA\Post( * path="/api/login", * summary="Log masuk pengguna dan dapatkan token API.", * tags={"Pengesahan"}, * @OA\RequestBody( * required=true, * @OA\JsonContent( * @OA\Property(property="nokp", type="string", example="800101015000", description="Nombor Kad Pengenalan pengguna."), * @OA\Property(property="password", type="string", format="password", example="password123", description="Kata laluan pengguna.") * ) * ), * @OA\Response( * response=200, * description="Log masuk pengguna berjaya.", * @OA\JsonContent( * @OA\Property(property="token", type="string", example="1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"), * @OA\Property(property="nama", type="string", example="John Doe"), * @OA\Property(property="jawatan", type="string", example="Pembangun"), * @OA\Property(property="email", type="string", example="john@example.com"), * @OA\Property(property="nokp", type="string", example="800101015000") * ) * ), * @OA\Response( * response=401, * description="Tidak sah." * ), * @OA\Response( * response=422, * description="Ralat pengesahan." * ) * ) */ Route::post('login', 'login'); /** * @OA\Post( * path="/api/logout", * summary="Log keluar pengguna yang sedang disahkan.", * description="Menyebabkan token Sanctum semasa pengguna dibatalkan.", * tags={"Pengesahan"}, * security={{"sanctum":{}}}, * @OA\Response( * response=200, * description="Log keluar berjaya.", * @OA\JsonContent( * @OA\Property(property="message", type="string", example="Logged out successfully") * ) * ), * @OA\Response( * response=401, * description="Tidak disahkan." * ) * ) */ // Catatan: Laluan 'logout' ini perlu dilindungi oleh middleware 'auth:sanctum' // agar `request()->user()` tersedia dan token dapat dihapus. // Sekiranya ia berada di luar kumpulan middleware, ia akan berfungsi hanya // jika pengguna sudah di autentikasi dalam sesi web, yang tidak sesuai untuk API token. Route::post('logout', 'logout')->name('logout'); }); // --- Laluan Lupa Kata Laluan (Forgot Password Routes) --- /** * @OA\Post( * path="/api/forgot-password", * summary="Hantar pautan set semula kata laluan ke emel pengguna.", * tags={"Pengesahan"}, * @OA\RequestBody( * required=true, * @OA\JsonContent( * @OA\Property(property="email", type="string", format="email", example="user@example.com", description="Alamat emel pengguna.") * ) * ), * @OA\Response( * response=200, * description="Pautan set semula kata laluan berjaya dihantar." * ), * @OA\Response( * response=422, * description="Ralat pengesahan (cth. emel tidak wujud)." * ) * ) */ Route::post('forgot-password', [ForgotPasswordController::class, 'sendResetLink']); /** * @OA\Post( * path="/api/reset-password", * summary="Set semula kata laluan menggunakan token set semula.", * tags={"Pengesahan"}, * @OA\RequestBody( * required=true, * @OA\JsonContent( * @OA\Property(property="email", type="string", format="email", example="user@example.com", description="Alamat emel pengguna."), * @OA\Property(property="token", type="string", example="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", description="Token set semula kata laluan yang diterima melalui emel."), * @OA\Property(property="password", type="string", format="password", example="new_password123", description="Kata laluan baru (min 8 aksara)."), * @OA\Property(property="password_confirmation", type="string", format="password", example="new_password123", description="Pengesahan kata laluan baru, mesti sama dengan 'password'.") * ) * ), * @OA\Response( * response=200, * description="Kata laluan berjaya diset semula." * ), * @OA\Response( * response=422, * description="Ralat pengesahan (cth. token tidak sah, kata laluan tidak sepadan)." * ) * ) */ Route::post('reset-password', [ResetPasswordController::class, 'reset']); // --- Laluan yang Dilindungi Sanctum (Sanctum Protected Routes) --- // Semua laluan dalam kumpulan ini memerlukan pengguna yang disahkan. Route::middleware('auth:sanctum')->group( function () { // Pengurusan Produk Route::resource('products', ProductController::class); // Pengurusan Profil dan Kata Laluan Pengguna Route::put('user/profile', [UserController::class, 'updateProfile']); Route::put('user/password', [UserController::class, 'updatePassword']); Route::put('user/force-password', [UserController::class, 'forceUpdatePassword']); }); /** * @OA\Get( * path="/api/me", * summary="Dapatkan maklumat ringkas pengguna semasa", * tags={"Pengguna"}, * security={{"sanctum":{}}}, * @OA\Response( * response=200, * description="Berjaya", * ), * @OA\Response( * response=401, * description="Tidak disahkan." * ) * ) */ Route::middleware('auth:sanctum')->get('/me', function (Request $request) { return response()->json([ 'id' => $request->user()->id, 'user' => $request->user(), ]); });