RoleController.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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' => 'nullable|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. $role->givePermissionTo($request->permissions);
  61. }
  62. return $role;
  63. }
  64. /**
  65. * Display the specified resource.
  66. *
  67. * @param int $id
  68. * @return Role|Collection|Model
  69. */
  70. public function show(int $id)
  71. {
  72. $query = QueryBuilder::for(Role::class)
  73. ->where('id', '=', $id)
  74. ->allowedIncludes(self::ALLOWED_INCLUDES);
  75. return $query->firstOrFail();
  76. }
  77. /**
  78. * Show the form for editing the specified resource.
  79. *
  80. * @param int $id
  81. * @return Response
  82. */
  83. public function edit($id)
  84. {
  85. //
  86. }
  87. /**
  88. * Update the specified resource in storage.
  89. *
  90. * @param Request $request
  91. * @param int $id
  92. * @return Response
  93. */
  94. public function update(Request $request, int $id)
  95. {
  96. $role = Role::findOrFail($id);
  97. $request->validate([
  98. 'name' => 'nullable|string|max:191',
  99. 'color' => [
  100. 'required',
  101. 'regex:/^#([a-f0-9]{6}|[a-f0-9]{3})$/i'
  102. ],
  103. 'power' => 'required',
  104. ]);
  105. if ($request->permissions) {
  106. $role->givePermissionTo($request->permissions);
  107. }
  108. $role->update($request->all());
  109. //TODO PERMISSIONS?
  110. return $role;
  111. }
  112. /**
  113. * Remove the specified resource from storage.
  114. *
  115. * @param int $id
  116. * @return Response
  117. */
  118. public function destroy(int $id)
  119. {
  120. $role = Role::findOrFail($id);
  121. if($role->id == 1 || $role->id == 3|| $role->id == 4){ //cannot delete admin and User role
  122. return response()->json([
  123. 'error' => 'Not allowed to delete Admin, Client or Member'], 400);
  124. }
  125. $users = User::role($role)->get();
  126. foreach($users as $user){
  127. $user->syncRoles([4]);
  128. }
  129. $role->delete();
  130. return $role;
  131. }
  132. }