getUser(); $query = new ActivityQuery(); $query->loadTeams(); $query->setCurrentUser($user); $order = $paramFetcher->get('order'); if (\is_string($order) && $order !== '') { $query->setOrder($order); } $orderBy = $paramFetcher->get('orderBy'); if (\is_string($orderBy) && $orderBy !== '') { $query->setOrderBy($orderBy); } if (null !== $paramFetcher->get('globals')) { $query->setGlobalsOnly(true); } /** @var array $projects */ $projects = $paramFetcher->get('projects'); $project = $paramFetcher->get('project'); if (\is_string($project) && $project !== '') { $projects[] = $project; } foreach (array_unique($projects) as $projectId) { $project = $projectRepository->find($projectId); if ($project === null) { throw $this->createNotFoundException('Unknown project: ' . $projectId); } $query->addProject($project); } $visible = $paramFetcher->get('visible'); if (\is_string($visible) && $visible !== '') { $query->setVisibility((int) $visible); } $term = $paramFetcher->get('term'); if (\is_string($term) && $term !== '') { $query->setSearchTerm(new SearchTerm($term)); } $query->setIsApiCall(true); $data = $this->repository->getActivitiesForQuery($query); $view = new View($data, 200); $view->getContext()->setGroups(self::GROUPS_COLLECTION); return $this->viewHandler->handle($view); } /** * Returns one activity */ #[OA\Response(response: 200, description: 'Returns one activity entity', content: new OA\JsonContent(ref: '#/components/schemas/ActivityEntity'))] #[OA\Parameter(name: 'id', in: 'path', description: 'Activity ID to fetch', required: true)] #[Route(methods: ['GET'], path: '/{id}', name: 'get_activity', requirements: ['id' => '\d+'])] #[IsGranted('view', 'activity')] public function getAction(Activity $activity): Response { $view = new View($activity, 200); $view->getContext()->setGroups(self::GROUPS_ENTITY); return $this->viewHandler->handle($view); } /** * Creates a new activity */ #[OA\Post(description: 'Creates a new activity and returns it afterwards', responses: [new OA\Response(response: 200, description: 'Returns the new created activity', content: new OA\JsonContent(ref: '#/components/schemas/ActivityEntity'))])] #[OA\RequestBody(required: true, content: new OA\JsonContent(ref: '#/components/schemas/ActivityEditForm'))] #[Route(methods: ['POST'], path: '', name: 'post_activity')] public function postAction(Request $request): Response { if (!$this->isGranted('create_activity')) { throw $this->createAccessDeniedException('User cannot create activities'); } $activity = new Activity(); $event = new ActivityMetaDefinitionEvent($activity); $this->dispatcher->dispatch($event); $form = $this->createForm(ActivityApiEditForm::class, $activity, [ 'include_budget' => $this->isGranted('budget', $activity), 'include_time' => $this->isGranted('time', $activity), ]); $form->submit($request->request->all()); if ($form->isValid()) { $this->repository->saveActivity($activity); $view = new View($activity, 200); $view->getContext()->setGroups(self::GROUPS_ENTITY); return $this->viewHandler->handle($view); } $view = new View($form); $view->getContext()->setGroups(self::GROUPS_FORM); return $this->viewHandler->handle($view); } /** * Update an existing activity */ #[IsGranted('edit', 'activity')] #[OA\Patch(description: 'Update an existing activity, you can pass all or just a subset of all attributes', responses: [new OA\Response(response: 200, description: 'Returns the updated activity', content: new OA\JsonContent(ref: '#/components/schemas/ActivityEntity'))])] #[OA\RequestBody(required: true, content: new OA\JsonContent(ref: '#/components/schemas/ActivityEditForm'))] #[OA\Parameter(name: 'id', in: 'path', description: 'Activity ID to update', required: true)] #[Route(methods: ['PATCH'], path: '/{id}', name: 'patch_activity', requirements: ['id' => '\d+'])] public function patchAction(Request $request, Activity $activity): Response { $event = new ActivityMetaDefinitionEvent($activity); $this->dispatcher->dispatch($event); $form = $this->createForm(ActivityApiEditForm::class, $activity, [ 'include_budget' => $this->isGranted('budget', $activity), 'include_time' => $this->isGranted('time', $activity), ]); $form->setData($activity); $form->submit($request->request->all(), false); if (false === $form->isValid()) { $view = new View($form, Response::HTTP_OK); $view->getContext()->setGroups(self::GROUPS_FORM); return $this->viewHandler->handle($view); } $this->repository->saveActivity($activity); $view = new View($activity, Response::HTTP_OK); $view->getContext()->setGroups(self::GROUPS_ENTITY); return $this->viewHandler->handle($view); } /** * Sets the value of a meta-field for an existing activity */ #[IsGranted('edit', 'activity')] #[OA\Response(response: 200, description: 'Sets the value of an existing/configured meta-field. You cannot create unknown meta-fields, if the given name is not a configured meta-field, this will return an exception.', content: new OA\JsonContent(ref: '#/components/schemas/ActivityEntity'))] #[OA\Parameter(name: 'id', in: 'path', description: 'Activity record ID to set the meta-field value for', required: true)] #[Route(methods: ['PATCH'], path: '/{id}/meta', requirements: ['id' => '\d+'])] #[Rest\RequestParam(name: 'name', strict: true, nullable: false, description: 'The meta-field name')] #[Rest\RequestParam(name: 'value', strict: true, nullable: false, description: 'The meta-field value')] public function metaAction(Activity $activity, ParamFetcherInterface $paramFetcher): Response { $event = new ActivityMetaDefinitionEvent($activity); $this->dispatcher->dispatch($event); $name = $paramFetcher->get('name'); $value = $paramFetcher->get('value'); if (null === ($meta = $activity->getMetaField($name))) { throw $this->createNotFoundException('Unknown meta-field requested'); } $meta->setValue($value); $this->repository->saveActivity($activity); $view = new View($activity, 200); $view->getContext()->setGroups(self::GROUPS_ENTITY); return $this->viewHandler->handle($view); } /** * Returns a collection of all rates for one activity */ #[IsGranted('edit', 'activity')] #[OA\Response(response: 200, description: 'Returns a collection of activity rate entities', content: new OA\JsonContent(type: 'array', items: new OA\Items(ref: '#/components/schemas/ActivityRate')))] #[OA\Parameter(name: 'id', in: 'path', description: 'The activity whose rates will be returned', required: true)] #[Route(methods: ['GET'], path: '/{id}/rates', name: 'get_activity_rates', requirements: ['id' => '\d+'])] public function getRatesAction(Activity $activity): Response { $rates = $this->activityRateRepository->getRatesForActivity($activity); $view = new View($rates, 200); $view->getContext()->setGroups(self::GROUPS_RATE); return $this->viewHandler->handle($view); } /** * Deletes one rate for an activity */ #[IsGranted('edit', 'activity')] #[OA\Delete(responses: [new OA\Response(response: 204, description: 'Returns no content: 204 on successful delete')])] #[OA\Parameter(name: 'id', in: 'path', description: 'The activity whose rate will be removed', required: true)] #[OA\Parameter(name: 'rateId', in: 'path', description: 'The rate to remove', required: true)] #[Route(methods: ['DELETE'], path: '/{id}/rates/{rateId}', name: 'delete_activity_rate', requirements: ['id' => '\d+', 'rateId' => '\d+'])] public function deleteRateAction(Activity $activity, #[MapEntity(mapping: ['rateId' => 'id'])] ActivityRate $rate): Response { if ($rate->getActivity() !== $activity) { throw $this->createNotFoundException(); } $this->activityRateRepository->deleteRate($rate); $view = new View(null, Response::HTTP_NO_CONTENT); return $this->viewHandler->handle($view); } /** * Adds a new rate to an activity */ #[IsGranted('edit', 'activity')] #[OA\Post(responses: [new OA\Response(response: 200, description: 'Returns the new created rate', content: new OA\JsonContent(ref: '#/components/schemas/ActivityRate'))])] #[OA\Parameter(name: 'id', in: 'path', description: 'The activity to add the rate for', required: true)] #[OA\RequestBody(required: true, content: new OA\JsonContent(ref: '#/components/schemas/ActivityRateForm'))] #[Route(methods: ['POST'], path: '/{id}/rates', name: 'post_activity_rate', requirements: ['id' => '\d+'])] public function postRateAction(Activity $activity, Request $request): Response { $rate = new ActivityRate(); $rate->setActivity($activity); $form = $this->createForm(ActivityRateApiForm::class, $rate, [ 'method' => 'POST', ]); $form->setData($rate); $form->submit($request->request->all(), false); if (false === $form->isValid()) { $view = new View($form, Response::HTTP_OK); $view->getContext()->setGroups(self::GROUPS_RATE); return $this->viewHandler->handle($view); } $this->activityRateRepository->saveRate($rate); $view = new View($rate, Response::HTTP_OK); $view->getContext()->setGroups(self::GROUPS_RATE); return $this->viewHandler->handle($view); } }