33namespace App \Http \Controllers ;
44
55use App \Data \UserData ;
6+ use App \Enums \Permissions ;
7+ use App \Enums \Roles ;
68use App \Models \User ;
9+ use Illuminate \Http \RedirectResponse ;
710use Illuminate \Http \Request ;
11+ use Illuminate \Validation \Rules ;
812use Inertia \Inertia ;
913use Inertia \Response ;
14+ use Illuminate \Support \Facades \Hash ;
15+ use Illuminate \Validation \Rule ;
1016
1117class UsersController extends Controller
1218{
19+ private array $ userValidationRules ;
20+
21+ public function __construct ()
22+ {
23+ $ this ->userValidationRules = [
24+ 'first_name ' => ['required ' , 'string ' , 'max:255 ' ],
25+ 'last_name ' => ['required ' , 'string ' , 'max:255 ' ],
26+ 'email ' => ['required ' , 'string ' , 'lowercase ' , 'email ' , 'max:255 ' , 'unique:users ' ],
27+ 'phone_number ' => ['required ' , 'string ' , 'max:12 ' ],
28+ 'password ' => ['required ' , Rules \Password::defaults ()],
29+ 'active ' => ['boolean ' ],
30+ 'roles ' => ['required ' , 'array ' ],
31+ ];
32+ }
33+
1334 public function list (Request $ request ): Response
1435 {
1536 $ page = intval ($ request ->get ('page ' , 1 ) ?: 1 );
@@ -36,41 +57,145 @@ public function list(Request $request): Response
3657 ]);
3758 }
3859
39- // public function show(User $user): Response
40- // {
41- // return Inertia::render('Users/Show', [
42- // 'user' => new UserResource($user),
43- // ]);
44- // }
45- //
46- // public function edit(User $user): Response
47- // {
48- // return Inertia::render('Users/Edit', [
49- // 'user' => new UserResource($user),
50- // ]);
51- // }
52- //
53- // public function update(User $user): Response
54- // {
55- // $user->update(
56- // request()->validate([
57- // 'name' => ['required', 'max:50'],
58- // 'email' => ['required', 'email'],
59- // ])
60- // );
61- //
62- // return redirect()->route('users.index');
63- // }
64- //
65- // public function destroy(User $user)
66- // {
67- // $user->delete();
68- //
69- // return redirect()->route('users.index');
70- // }
60+ /**
61+ * Display the specified user.
62+ */
63+ public function show (User $ user ): Response
64+ {
65+ if (! auth ()->user ()->hasPermissionTo (Permissions::ViewUsers)) {
66+ abort (403 , 'You do not have permission to view user details. ' );
67+ }
68+
69+ return Inertia::render ('Users/Show ' , [
70+ 'user ' => UserData::from ($ user ),
71+ ]);
72+ }
73+
74+ public function destroy (User $ user ): RedirectResponse
75+ {
76+ if (! auth ()->user ()->hasPermissionTo (Permissions::DeleteUsers)) {
77+ return back ()->withErrors (['error ' => 'You do not have permission to delete users. ' ]);
78+ }
79+ if (auth ()->id () === $ user ->id ) {
80+ return back ()->withErrors (['error ' => 'You cannot delete your own account. ' ]);
81+ }
82+
83+ $ user ->delete ();
84+
85+ return redirect ()->route ('users.list ' )->with ('toast ' , [
86+ 'type ' => 'success ' ,
87+ 'message ' => "User {$ user ->first_name } {$ user ->last_name } was successfully deleted. " ,
88+ ]);
89+ }
90+
91+ public function destroyMultiple (Request $ request ): RedirectResponse
92+ {
93+ if (! auth ()->user ()->hasPermissionTo (Permissions::DeleteUsers)) {
94+ return back ()->withErrors (['error ' => 'You do not have permission to delete users. ' ]);
95+ }
96+
97+ $ userIds = $ request ->input ('user_ids ' , []);
98+
99+ if (empty ($ userIds )) {
100+ return back ()->withErrors (['error ' => 'No users specified for deletion. ' ]);
101+ }
102+
103+ // Prevent deleting your own account
104+ if (in_array (auth ()->id (), $ userIds )) {
105+ return back ()->withErrors (['error ' => 'You cannot delete your own account. ' ]);
106+ }
107+
108+ $ users = User::whereIn ('id ' , $ userIds )->get ();
109+ $ count = $ users ->count ();
110+
111+ // Delete the users
112+ User::whereIn ('id ' , $ userIds )->delete ();
113+
114+ return back ()->with ('toast ' , [
115+ 'type ' => 'success ' ,
116+ 'message ' => "{$ count } " .($ count === 1 ? 'user ' : 'users ' ).' successfully deleted. ' ,
117+ ]);
118+ }
71119
72120 public function create (): Response
73121 {
74- return Inertia::render ('Users/Create ' );
122+ if (! auth ()->user ()->hasPermissionTo (Permissions::CreateUsers)) {
123+ abort (403 , 'You do not have permission to create users. ' );
124+ }
125+
126+ return Inertia::render ('Users/Create ' , [
127+ 'roles ' => Roles::cases (),
128+ ]);
129+ }
130+
131+ public function edit (User $ user ): Response
132+ {
133+ if (! auth ()->user ()->hasPermissionTo (Permissions::EditUsers)) {
134+ abort (403 , 'You do not have permission to edit users. ' );
135+ }
136+
137+ return Inertia::render ('Users/Edit ' , [
138+ 'user ' => UserData::from ($ user ),
139+ 'roles ' => Roles::cases (),
140+ ]);
141+ }
142+
143+ public function store (Request $ request ): RedirectResponse
144+ {
145+ if (! auth ()->user ()->hasPermissionTo (Permissions::CreateUsers)) {
146+ return back ()->withErrors (['error ' => 'You do not have permission to create users. ' ]);
147+ }
148+
149+ $ request ->validate ($ this ->userValidationRules );
150+
151+ $ user = User::create ([
152+ 'first_name ' => $ request ->first_name ,
153+ 'last_name ' => $ request ->last_name ,
154+ 'email ' => $ request ->email ,
155+ 'phone_number ' => $ request ->phone_number ,
156+ 'password ' => Hash::make ($ request ->password ),
157+ 'active ' => $ request ->active ,
158+ ]);
159+
160+ $ user ->syncRoles ($ request ->roles );
161+
162+ return redirect ()->route ('users.list ' )->with ('toast ' , [
163+ 'type ' => 'success ' ,
164+ 'message ' => "User {$ user ->first_name } {$ user ->last_name } was successfully created. " ,
165+ ]);
166+ }
167+
168+ public function update (Request $ request , User $ user ): RedirectResponse
169+ {
170+ if (! auth ()->user ()->hasPermissionTo (Permissions::EditUsers)) {
171+ return back ()->withErrors (['error ' => 'You do not have permission to edit users. ' ]);
172+ }
173+
174+ $ rules = $ this ->userValidationRules ;
175+ $ rules ['email ' ] = ['required ' , 'string ' , 'lowercase ' , 'email ' , 'max:255 ' , Rule::unique ('users ' )->ignore ($ user ->id )];
176+ $ rules ['password ' ] = ['nullable ' , Rules \Password::defaults ()];
177+
178+ $ request ->validate ($ rules );
179+
180+ $ user ->update ([
181+ 'first_name ' => $ request ->first_name ,
182+ 'last_name ' => $ request ->last_name ,
183+ 'email ' => $ request ->email ,
184+ 'phone_number ' => $ request ->phone_number ,
185+ 'active ' => $ request ->active ,
186+ ]);
187+
188+ if ($ request ->password ) {
189+ $ user ->update ([
190+ 'password ' => Hash::make ($ request ->password ),
191+ ]);
192+ }
193+
194+ $ user ->syncRoles ($ request ->roles );
195+
196+ return redirect ()->route ('users.list ' )->with ('toast ' , [
197+ 'type ' => 'success ' ,
198+ 'message ' => "User {$ user ->first_name } {$ user ->last_name } was successfully updated. " ,
199+ ]);
75200 }
76201}
0 commit comments