RoleController.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\User;
  5. use Illuminate\Contracts\Pagination\LengthAwarePaginator;
  6. use Illuminate\Database\Eloquent\Collection;
  7. use Illuminate\Database\Eloquent\Model;
  8. use Illuminate\Http\Request;
  9. use Illuminate\Http\Response;
  10. use Illuminate\Validation\Rule;
  11. use Spatie\Permission\Models\Role;
  12. use Spatie\QueryBuilder\QueryBuilder;
  13. class RoleController extends Controller
  14. {
  15. const ALLOWED_INCLUDES = ['permissions', 'users'];
  16. const ALLOWED_FILTERS = ['name'];
  17. /**
  18. * Display a listing of the resource.
  19. *
  20. * @return LengthAwarePaginator
  21. */
  22. public function index(Request $request)
  23. {
  24. $query = QueryBuilder::for(Role::class)
  25. ->allowedIncludes(self::ALLOWED_INCLUDES)
  26. ->allowedFilters(self::ALLOWED_FILTERS);
  27. return $query->paginate($request->input('per_page') ?? 50);
  28. }
  29. /**
  30. * Show the form for creating a new resource.
  31. *
  32. * @return Response
  33. */
  34. public function create()
  35. {
  36. //
  37. }
  38. /**
  39. * Store a newly created resource in storage.
  40. *
  41. * @param Request $request
  42. * @return Response
  43. */
  44. public function store(Request $request)
  45. {
  46. $request->validate([
  47. 'name' => 'required|string|max:191',
  48. 'color' => [
  49. 'required',
  50. 'regex:/^#([a-f0-9]{6}|[a-f0-9]{3})$/i'
  51. ],
  52. 'power' => 'required',
  53. ]);
  54. $role = Role::create([
  55. 'name' => $request->name,
  56. 'color' => $request->color,
  57. 'power' => $request->power,
  58. ]);
  59. if ($request->permissions) {
  60. $permissions = explode(",",$request->permissions);
  61. foreach($permissions as $permission){
  62. $role->givePermissionTo($permission);
  63. }
  64. }
  65. return $role;
  66. }
  67. /**
  68. * Display the specified resource.
  69. *
  70. * @param int $id
  71. * @return Role|Collection|Model
  72. */
  73. public function show(int $id)
  74. {
  75. $query = QueryBuilder::for(Role::class)
  76. ->where('id', '=', $id)
  77. ->allowedIncludes(self::ALLOWED_INCLUDES);
  78. return $query->firstOrFail();
  79. }
  80. /**
  81. * Show the form for editing the specified resource.
  82. *
  83. * @param int $id
  84. * @return Response
  85. */
  86. public function edit($id)
  87. {
  88. //
  89. }
  90. /**
  91. * Update the specified resource in storage.
  92. *
  93. * @param Request $request
  94. * @param int $id
  95. * @return Response
  96. */
  97. public function update(Request $request, int $id)
  98. {
  99. $role = Role::findOrFail($id);
  100. $request->validate([
  101. 'name' => 'sometimes|string|max:191',
  102. 'color' => [
  103. 'sometimes',
  104. 'regex:/^#([a-f0-9]{6}|[a-f0-9]{3})$/i'
  105. ],
  106. 'power' => 'sometimes',
  107. ]);
  108. if ($request->permissions) {
  109. $permissions = explode(",",$request->permissions);
  110. $role->syncPermissions($permissions);
  111. }
  112. $role->update($request->except('permissions'));
  113. return $role;
  114. }
  115. /**
  116. * Remove the specified resource from storage.
  117. *
  118. * @param int $id
  119. * @return Response
  120. */
  121. public function destroy(int $id)
  122. {
  123. $role = Role::findOrFail($id);
  124. if($role->id == 1 || $role->id == 3|| $role->id == 4){ //cannot delete admin and User role
  125. return response()->json([
  126. 'error' => 'Not allowed to delete Admin, Client or Member'], 400);
  127. }
  128. $users = User::role($role)->get();
  129. foreach($users as $user){
  130. $user->syncRoles([4]);
  131. }
  132. $role->delete();
  133. return $role;
  134. }
  135. }