GroupController.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <?php
  2. namespace App\Api\v1\Controllers;
  3. use App\Api\v1\Requests\GroupAssignRequest;
  4. use App\Api\v1\Requests\GroupStoreRequest;
  5. use App\Api\v1\Resources\GroupResource;
  6. use App\Api\v1\Resources\TwoFAccountCollection;
  7. use App\Facades\Groups;
  8. use App\Http\Controllers\Controller;
  9. use App\Models\Group;
  10. use App\Models\User;
  11. use Illuminate\Http\Request;
  12. class GroupController extends Controller
  13. {
  14. /**
  15. * Display all user groups.
  16. *
  17. * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
  18. */
  19. public function index(Request $request)
  20. {
  21. // Quick fix for #176
  22. if (config('auth.defaults.guard') === 'reverse-proxy-guard' && User::count() === 1) {
  23. if (Group::orphans()->exists()) {
  24. $groups = Group::orphans()->get();
  25. Groups::setUser($groups, $request->user());
  26. }
  27. }
  28. // We do not use fluent call all over the call chain to ease tests
  29. $user = $request->user();
  30. $groups = $user->groups()->withCount('twofaccounts')->get();
  31. return GroupResource::collection(Groups::prependTheAllGroup($groups, $request->user()));
  32. }
  33. /**
  34. * Store a newly created resource in storage.
  35. *
  36. * @return \Illuminate\Http\JsonResponse
  37. */
  38. public function store(GroupStoreRequest $request)
  39. {
  40. $this->authorize('create', Group::class);
  41. $validated = $request->validated();
  42. $group = $request->user()->groups()->create($validated);
  43. return (new GroupResource($group))
  44. ->response()
  45. ->setStatusCode(201);
  46. }
  47. /**
  48. * Display the specified resource.
  49. *
  50. * @return \App\Api\v1\Resources\GroupResource
  51. */
  52. public function show(Group $group)
  53. {
  54. $this->authorize('view', $group);
  55. return new GroupResource($group);
  56. }
  57. /**
  58. * Update the specified resource in storage.
  59. *
  60. * @return \App\Api\v1\Resources\GroupResource
  61. */
  62. public function update(GroupStoreRequest $request, Group $group)
  63. {
  64. $this->authorize('update', $group);
  65. $validated = $request->validated();
  66. $group->update($validated);
  67. return new GroupResource($group);
  68. }
  69. /**
  70. * Associate the specified accounts with the group
  71. *
  72. * @return \App\Api\v1\Resources\GroupResource
  73. */
  74. public function assignAccounts(GroupAssignRequest $request, Group $group)
  75. {
  76. $this->authorize('update', $group);
  77. $validated = $request->validated();
  78. Groups::assign($validated['ids'], $request->user(), $group);
  79. return new GroupResource($group);
  80. }
  81. /**
  82. * Get accounts assigned to the group
  83. *
  84. * @return \App\Api\v1\Resources\TwoFAccountCollection
  85. */
  86. public function accounts(Group $group)
  87. {
  88. $this->authorize('view', $group);
  89. return new TwoFAccountCollection($group->twofaccounts);
  90. }
  91. /**
  92. * Remove the specified resource from storage.
  93. *
  94. * @return \Illuminate\Http\JsonResponse
  95. */
  96. public function destroy(Group $group)
  97. {
  98. $this->authorize('delete', $group);
  99. $group->delete();
  100. return response()->json(null, 204);
  101. }
  102. }