diff --git a/app/Http/Controllers/Api/Konfigurasi/AuthController.php b/app/Http/Controllers/Api/Konfigurasi/AuthController.php index d9e6ff0..b38d507 100644 --- a/app/Http/Controllers/Api/Konfigurasi/AuthController.php +++ b/app/Http/Controllers/Api/Konfigurasi/AuthController.php @@ -13,7 +13,7 @@ use App\Http\Resources\UserResource; class AuthController extends Controller { - public function login(Request $request): JSONResponse + public function login(Request $request): JsonResponse { $credentials = $request->validate([ 'email' => ['required', 'email'], @@ -27,6 +27,13 @@ class AuthController extends Controller } $user = Auth::user(); + + if ($user->status === 'pending') { + return response()->json([ + 'message' => 'Akun Anda masih berstatus pending. Silakan tunggu verifikasi dari Super Admin.' + ], 403); + } + $user->tokens()->delete(); $token = $user->createToken('mobile-token')->plainTextToken; @@ -37,14 +44,13 @@ class AuthController extends Controller ]); } - public function signup(Request $request): JSONResponse + public function signup(Request $request): JsonResponse { $credentials = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'string', 'min:8', 'confirmed'], 'username' => ['required', 'string', 'max:255'], - 'role' => ['string'], 'uid' => ['required','string', 'unique:users'], ]); @@ -53,35 +59,27 @@ class AuthController extends Controller 'email' => $credentials['email'], 'password' => Hash::make($credentials['password']), 'username' => $credentials['username'], - 'role' => $credentials['role'], 'uid' => $credentials['uid'], + 'role' => null, + 'status' => 'pending', ]); $profile = Profile::create([ 'nama' => $credentials['name'], 'email' => $credentials['email'], - 'role' => $credentials['role'], 'user_uid' => $credentials['uid'], 'user_id' => $user->id, 'created_by' => $user->id, 'updated_by' => $user->id, + + + 'role' => null, ]); - if (!Auth::attempt($credentials)) { - return response()->json([ - 'message' => 'Email dan/atau password tidak sesuai' - ], 401); - } - - $user = Auth::user(); - $user->tokens()->delete(); - - $token = $user->createToken('mobile-token')->plainTextToken; - + return response()->json([ - 'access_token' => $token, - 'token_type' => 'Bearer', - ]); + 'message' => 'Registrasi berhasil. Akun Anda berstatus pending dan sedang menunggu verifikasi Super Admin.' + ], 201); } public function me(Request $request): JSONResponse diff --git a/app/Http/Controllers/Web/Dashboard/SummaryController.php b/app/Http/Controllers/Web/Dashboard/SummaryController.php index 9326b5b..43a0eee 100644 --- a/app/Http/Controllers/Web/Dashboard/SummaryController.php +++ b/app/Http/Controllers/Web/Dashboard/SummaryController.php @@ -25,8 +25,8 @@ class SummaryController extends Controller public function produktivitas(Request $request) { - if (!Gate::allows('super_admin') && !Gate::allows('admin')) { - abort(403); + if (!Gate::allows('super_admin') && !Gate::allows('admin') && !Gate::allows('fasilitator')) { + abort(403); } $title = 'Produktivitas Dashboard'; diff --git a/app/Http/Controllers/Web/Konfigurasi/AuthController.php b/app/Http/Controllers/Web/Konfigurasi/AuthController.php index ec89fc6..67f2662 100644 --- a/app/Http/Controllers/Web/Konfigurasi/AuthController.php +++ b/app/Http/Controllers/Web/Konfigurasi/AuthController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Web\Konfigurasi; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Models\User; +use Illuminate\Support\Str; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; @@ -34,15 +35,19 @@ class AuthController extends Controller User::create([ 'name' => $request->name, + 'username' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), + 'uid' => Str::uuid(), + 'status' => 'pending', + 'role' => null, 'email_verified_at' => null, 'created_by' => null, 'updated_by' => null, 'deleted_by' => null, ]); - - return redirect()->route('auth.login')->with('success', 'Account created successfully. Please login.'); + + return redirect('/login')->with('success', 'Account created successfully. Please login.'); } public function verify(User $user) diff --git a/app/Http/Controllers/Web/Konfigurasi/UserController.php b/app/Http/Controllers/Web/Konfigurasi/UserController.php index d9bfc73..68cc751 100644 --- a/app/Http/Controllers/Web/Konfigurasi/UserController.php +++ b/app/Http/Controllers/Web/Konfigurasi/UserController.php @@ -49,23 +49,42 @@ class UserController extends Controller return view('konfigurasi.user.index', compact('users', 'totalUsers', 'activeUsers', 'pendingUsers', 'roles', 'tab')); } - public function verify($id) + public function verify(Request $request, $id) { + $request->validate([ + 'role' => ['required', 'string'], + ]); + try { $user = User::findOrFail($id); + $user->email_verified_at = now(); + $user->status = 'verified'; + $user->role = $request->role; $user->save(); - return response()->json([ - 'status' => 'success', - 'message' => 'User berhasil diverifikasi dan diaktifkan.' + Profile::where('user_id', $user->id)->update([ + 'role' => $request->role ]); + + if ($request->expectsJson()) { + return response()->json([ + 'status' => 'success', + 'message' => 'User ' . $user->name . ' berhasil diverifikasi sebagai ' . $request->role . '.' + ]); + } + + return redirect()->back()->with('success', 'User ' . $user->name . ' berhasil diverifikasi sebagai ' . $request->role . '.'); } catch (\Exception $e) { - return response()->json([ - 'status' => 'error', - 'message' => 'Gagal verifikasi user.' - ], 500); + if ($request->expectsJson()) { + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal verifikasi user: ' . $e->getMessage() + ], 500); + } + + return back()->with('error', 'Gagal verifikasi user: ' . $e->getMessage()); } } diff --git a/app/Models/User.php b/app/Models/User.php index ae21e48..0fb0634 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -22,7 +22,8 @@ class User extends Authenticatable 'email_verified_at', 'role', 'username', - 'uid' + 'uid', + 'status' ]; protected $hidden = [ diff --git a/database/migrations/2026_07_09_110145_add_status_and_role_to_users_table.php b/database/migrations/2026_07_09_110145_add_status_and_role_to_users_table.php new file mode 100644 index 0000000..1999ccd --- /dev/null +++ b/database/migrations/2026_07_09_110145_add_status_and_role_to_users_table.php @@ -0,0 +1,30 @@ +string('status')->default('pending')->after('password'); + + if (!Schema::hasColumn('users', 'role')) { + $table->string('role')->nullable()->after('status'); + } + }); + } + + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('status'); + $table->dropColumn('role'); + }); + } +}; diff --git a/resources/views/konfigurasi/user/index.blade.php b/resources/views/konfigurasi/user/index.blade.php index 1b7cd67..c4405ef 100644 --- a/resources/views/konfigurasi/user/index.blade.php +++ b/resources/views/konfigurasi/user/index.blade.php @@ -178,20 +178,30 @@ Verified @else Pending -
- + + @endif -Tentukan role akses untuk pengguna ini agar dapat masuk ke dalam sistem AgroMonev.
+ +