organization_id !== $organization->id) { throw new AuthorizationException('Project does not belong to organization'); } if ($projectMember !== null && $projectMember->project->organization_id !== $organization->id) { throw new AuthorizationException('Project member does not belong to organization'); } } /** * Get project members for project * * @return ProjectMemberCollection * * @throws AuthorizationException * * @operationId getProjectMembers */ public function index(Organization $organization, Project $project): ProjectMemberCollection { $this->checkPermission($organization, 'project-members:view', $project); $projectMembers = ProjectMember::query() ->whereBelongsTo($project, 'project') ->paginate(); return new ProjectMemberCollection($projectMembers); } /** * Add project member to project * * @throws AuthorizationException|InactiveUserCanNotBeUsedApiException|UserIsAlreadyMemberOfProjectApiException * * @operationId createProjectMember */ public function store(Organization $organization, Project $project, ProjectMemberStoreRequest $request): JsonResource { $this->checkPermission($organization, 'project-members:create', $project); $user = User::findOrFail((string) $request->input('user_id')); if ($user->is_placeholder) { throw new InactiveUserCanNotBeUsedApiException(); } if (ProjectMember::whereBelongsTo($project, 'project')->whereBelongsTo($user, 'user')->exists()) { throw new UserIsAlreadyMemberOfProjectApiException(); } $projectMember = new ProjectMember(); $projectMember->billable_rate = $request->input('billable_rate'); $projectMember->user()->associate($user); $projectMember->project()->associate($project); $projectMember->save(); return new ProjectMemberResource($projectMember); } /** * Update project member * * @throws AuthorizationException * * @operationId updateProjectMember */ public function update(Organization $organization, ProjectMember $projectMember, ProjectMemberUpdateRequest $request): JsonResource { $this->checkPermission($organization, 'project-members:update', projectMember: $projectMember); $projectMember->billable_rate = $request->input('billable_rate'); $projectMember->save(); return new ProjectMemberResource($projectMember); } /** * Delete project member * * @throws AuthorizationException * * @operationId deleteProjectMember */ public function destroy(Organization $organization, ProjectMember $projectMember): JsonResponse { $this->checkPermission($organization, 'project-members:delete', projectMember: $projectMember); $projectMember->delete(); return response() ->json(null, 204); } }