RoleController.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\User;
  5. use Exception;
  6. use Illuminate\Contracts\Foundation\Application;
  7. use Illuminate\Contracts\View\Factory;
  8. use Illuminate\Contracts\View\View;
  9. use Illuminate\Http\RedirectResponse;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Facades\Auth;
  12. use App\Models\Permission;
  13. use App\Models\Role;
  14. class RoleController extends Controller
  15. {
  16. const READ_PERMISSION = "admin.roles.read";
  17. const CREATE_PERMISSION = "admin.roles.create";
  18. const EDIT_PERMISSION = "admin.roles.edit";
  19. const DELETE_PERMISSION = "admin.roles.delete";
  20. /**
  21. * Display a listing of the resource.
  22. *
  23. * @param Request $request
  24. * @return mixed
  25. * @throws Exception
  26. */
  27. public function index(Request $request)
  28. {
  29. $this->checkPermission(self::READ_PERMISSION);
  30. //datatables
  31. if ($request->ajax()) {
  32. return $this->dataTableQuery();
  33. }
  34. $html = $this->dataTable();
  35. return view('admin.roles.index', compact('html'));
  36. }
  37. /**
  38. * Show the form for creating a new resource.
  39. *
  40. * @return Application|Factory|View
  41. */
  42. public function create()
  43. {
  44. $this->checkPermission(self::CREATE_PERMISSION);
  45. $permissions = Permission::all();
  46. return view('admin.roles.edit', compact('permissions'));
  47. }
  48. /**
  49. * Store a newly created resource in storage.
  50. *
  51. * @return RedirectResponse
  52. */
  53. public function store(Request $request): RedirectResponse
  54. {
  55. $this->checkPermission(self::CREATE_PERMISSION);
  56. $role = Role::create([
  57. 'name' => $request->name,
  58. 'color' => $request->color,
  59. 'power' => $request->power
  60. ]);
  61. if ($request->permissions) {
  62. $role->givePermissionTo($request->permissions);
  63. }
  64. return redirect()
  65. ->route('admin.roles.index')
  66. ->with('success', __('Role saved'));
  67. }
  68. /**
  69. * Display the specified resource.
  70. */
  71. public function show()
  72. {
  73. abort(404);
  74. }
  75. /**
  76. * Show the form for editing the specified resource.
  77. *
  78. * @param Role $role
  79. * @return Application|Factory|View
  80. */
  81. public function edit(Role $role)
  82. {
  83. $this->checkPermission(self::EDIT_PERMISSION);
  84. if(Auth::user()->roles[0]->power < $role->power){
  85. return back()->with("error","You dont have enough Power to edit that Role");
  86. }
  87. $permissions = Permission::all();
  88. return view('admin.roles.edit', compact('role', 'permissions'));
  89. }
  90. /**
  91. * Update the specified resource in storage.
  92. *
  93. * @param Role $role
  94. * @return RedirectResponse
  95. */
  96. public function update(Request $request, Role $role)
  97. {
  98. $this->checkPermission(self::EDIT_PERMISSION);
  99. if(Auth::user()->roles[0]->power < $role->power){
  100. return back()->with("error","You dont have enough Power to edit that Role");
  101. }
  102. if ($request->permissions) {
  103. if($role->id != 1){ //disable admin permissions change
  104. $role->syncPermissions($request->permissions);
  105. }
  106. }
  107. //if($role->id == 1 || $role->id == 3 || $role->id == 4){ //dont let the user change the names of these roles
  108. // $role->update([
  109. // 'color' => $request->color
  110. // ]);
  111. //}else{
  112. $role->update([
  113. 'name' => $request->name,
  114. 'color' => $request->color
  115. ]);
  116. //}
  117. //if($role->id == 1){
  118. // return redirect()->route('admin.roles.index')->with('success', __('Role updated. Name and Permissions of this Role cannot be changed'));
  119. //}elseif($role->id == 4 || $role->id == 3){
  120. // return redirect()->route('admin.roles.index')->with('success', __('Role updated. Name of this Role cannot be changed'));
  121. // }else{
  122. return redirect()
  123. ->route('admin.roles.index')
  124. ->with('success', __('Role saved'));
  125. //}
  126. }
  127. /**
  128. * Remove the specified resource from storage.
  129. *
  130. * @return RedirectResponse
  131. */
  132. public function destroy(Role $role)
  133. {
  134. $this->checkPermission(self::DELETE_PERMISSION);
  135. if($role->id == 1 || $role->id == 3 || $role->id == 4){ //cannot delete the hard coded roles
  136. return back()->with("error","You cannot delete that role");
  137. }
  138. $users = User::role($role)->get();
  139. foreach($users as $user){
  140. //$user->syncRoles(['Member']);
  141. $user->syncRoles(4);
  142. }
  143. $role->delete();
  144. return redirect()
  145. ->route('admin.roles.index')
  146. ->with('success', __('Role removed'));
  147. }
  148. /**
  149. * @return mixed
  150. * @throws Exception
  151. */
  152. public function dataTable()
  153. {
  154. $query = Role::query()->withCount(['users', 'permissions'])->get();
  155. return datatables($query)
  156. ->editColumn('id', function (Role $role) {
  157. return $role->id;
  158. })
  159. ->addColumn('actions', function (Role $role) {
  160. return '
  161. <a title="Edit" href="'.route("admin.roles.edit", $role).'" class="btn btn-sm btn-info"><i
  162. class="fa fas fa-edit"></i></a>
  163. <form class="d-inline" method="post" action="'.route("admin.roles.destroy", $role).'">
  164. ' . csrf_field() . '
  165. ' . method_field("DELETE") . '
  166. <button title="Delete" type="submit" class="btn btn-sm btn-danger confirm"><i
  167. class="fa fas fa-trash"></i></button>
  168. </form>
  169. ';
  170. })
  171. ->editColumn('name', function (Role $role) {
  172. return "<span style='background-color: $role->color' class='badge'>$role->name</span>";
  173. })
  174. ->editColumn('users_count', function ($query) {
  175. return $query->users_count;
  176. })
  177. ->editColumn('permissions_count', function ($query){
  178. return $query->permissions_count;
  179. })
  180. ->editColumn('power', function (Role $role){
  181. return $role->power;
  182. })
  183. ->rawColumns(['actions', 'name'])
  184. ->make(true);
  185. }
  186. }