diff --git a/app/Http/Controllers/RoleController.php b/app/Http/Controllers/RoleController.php index 50796ca..542de1e 100644 --- a/app/Http/Controllers/RoleController.php +++ b/app/Http/Controllers/RoleController.php @@ -2,7 +2,9 @@ namespace App\Http\Controllers; +use App\Http\Requests\StoreRoleRequest; use App\Models\Role; +use Illuminate\Http\RedirectResponse; use Illuminate\View\View; class RoleController extends Controller @@ -20,4 +22,24 @@ class RoleController extends Controller 'roles' => $roles, ]); } + + /** + * Show the form for creating a new role. + */ + public function create(): View + { + return view('role.create'); + } + + /** + * Store a newly created role. + */ + public function store(StoreRoleRequest $request): RedirectResponse + { + Role::create($request->validated()); + + return redirect() + ->route('role.index') + ->with('status', 'role-created'); + } } diff --git a/app/Http/Requests/StoreRoleRequest.php b/app/Http/Requests/StoreRoleRequest.php new file mode 100644 index 0000000..83e7624 --- /dev/null +++ b/app/Http/Requests/StoreRoleRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + 'name' => ['required', 'string', 'max:255', 'unique:roles,name'], + ]; + } +} diff --git a/resources/views/role/create.blade.php b/resources/views/role/create.blade.php new file mode 100644 index 0000000..0428483 --- /dev/null +++ b/resources/views/role/create.blade.php @@ -0,0 +1,33 @@ + + +

+ {{ __('Create Role') }} +

+
+ +
+
+
+
+
+ @csrf + +
+ + + +
+ +
+ {{ __('Save') }} + + + {{ __('Cancel') }} + +
+
+
+
+
+
+
\ No newline at end of file diff --git a/resources/views/role/index.blade.php b/resources/views/role/index.blade.php index e31be38..604e19f 100644 --- a/resources/views/role/index.blade.php +++ b/resources/views/role/index.blade.php @@ -1,14 +1,26 @@ -

- {{ __('Roles') }} -

+
+

+ {{ __('Roles') }} +

+ + + {{ __('New Role') }} + +
+ @if (session('status') === 'role-created') +
+ {{ __('Role created successfully.') }} +
+ @endif +
diff --git a/routes/web.php b/routes/web.php index 36af0fe..5ae45dd 100644 --- a/routes/web.php +++ b/routes/web.php @@ -14,6 +14,8 @@ Route::get('/dashboard', function () { Route::middleware('auth')->group(function () { Route::get('/role', [RoleController::class, 'index'])->name('role.index'); + Route::get('/role/create', [RoleController::class, 'create'])->name('role.create'); + Route::post('/role', [RoleController::class, 'store'])->name('role.store'); Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); diff --git a/tests/Feature/RoleIndexTest.php b/tests/Feature/RoleIndexTest.php index 8381cd4..2458028 100644 --- a/tests/Feature/RoleIndexTest.php +++ b/tests/Feature/RoleIndexTest.php @@ -21,3 +21,18 @@ test('authenticated users can view the role index', function () { ->assertSee('Admin') ->assertSee('Editor'); }); + +test('authenticated users can create a role', function () { + $response = $this + ->actingAs(User::factory()->create()) + ->post('/role', [ + 'name' => 'Manager', + ]); + + $response + ->assertRedirect('/role'); + + $this->assertDatabaseHas('roles', [ + 'name' => 'Manager', + ]); +});