Feature: create a new API endpoint for my workflows in Cc

This commit is contained in:
nobohan 2023-03-23 10:14:40 +01:00
parent 1789a75216
commit a992c45720
3 changed files with 94 additions and 0 deletions

View File

@ -93,6 +93,45 @@ class WorkflowApiController
); );
} }
/**
* Return a list of workflow which are waiting an action for the user.
*
* @Route("/api/1.0/main/workflow/my-cc", methods={"GET"})
*/
public function myWorkflowCc(Request $request): JsonResponse
{
if (!$this->security->isGranted('ROLE_USER') || !$this->security->getUser() instanceof User) {
throw new AccessDeniedException();
}
$total = $this->entityWorkflowRepository->countByCc($this->security->getUser());
if ($request->query->getBoolean('countOnly', false)) {
return new JsonResponse(
$this->serializer->serialize(new Counter($total), 'json'),
JsonResponse::HTTP_OK,
[],
true
);
}
$paginator = $this->paginatorFactory->create($total);
$workflows = $this->entityWorkflowRepository->findByCc(
$this->security->getUser(),
['id' => 'DESC'],
$paginator->getItemsPerPage(),
$paginator->getCurrentPageFirstItemNumber()
);
return new JsonResponse(
$this->serializer->serialize(new Collection($workflows, $paginator), 'json', ['groups' => ['read']]),
JsonResponse::HTTP_OK,
[],
true
);
}
/** /**
* @Route("/api/1.0/main/workflow/{id}/subscribe", methods={"POST"}) * @Route("/api/1.0/main/workflow/{id}/subscribe", methods={"POST"})
*/ */

View File

@ -27,6 +27,13 @@ class EntityWorkflowRepository implements ObjectRepository
$this->repository = $entityManager->getRepository(EntityWorkflow::class); $this->repository = $entityManager->getRepository(EntityWorkflow::class);
} }
public function countByCc(User $user): int
{
$qb = $this->buildQueryByCc($user)->select('count(ew)');
return (int) $qb->getQuery()->getSingleScalarResult();
}
public function countByDest(User $user): int public function countByDest(User $user): int
{ {
$qb = $this->buildQueryByDest($user)->select('count(ew)'); $qb = $this->buildQueryByDest($user)->select('count(ew)');
@ -103,6 +110,19 @@ class EntityWorkflowRepository implements ObjectRepository
return $this->repository->findBy($criteria, $orderBy, $limit, $offset); return $this->repository->findBy($criteria, $orderBy, $limit, $offset);
} }
public function findByCc(User $user, ?array $orderBy = null, $limit = null, $offset = null): array
{
$qb = $this->buildQueryByCc($user)->select('ew');
foreach ($orderBy as $key => $sort) {
$qb->addOrderBy('ew.' . $key, $sort);
}
$qb->setMaxResults($limit)->setFirstResult($offset);
return $qb->getQuery()->getResult();
}
public function findByDest(User $user, ?array $orderBy = null, $limit = null, $offset = null): array public function findByDest(User $user, ?array $orderBy = null, $limit = null, $offset = null): array
{ {
$qb = $this->buildQueryByDest($user)->select('ew'); $qb = $this->buildQueryByDest($user)->select('ew');
@ -165,6 +185,25 @@ class EntityWorkflowRepository implements ObjectRepository
return EntityWorkflow::class; return EntityWorkflow::class;
} }
private function buildQueryByCc(User $user): QueryBuilder
{
$qb = $this->repository->createQueryBuilder('ew');
$qb->join('ew.steps', 'step');
$qb->where(
$qb->expr()->andX(
$qb->expr()->isMemberOf(':user', 'step.ccUser'),
$qb->expr()->isNull('step.transitionAfter'),
$qb->expr()->eq('step.isFinal', "'FALSE'")
)
);
$qb->setParameter('user', $user);
return $qb;
}
private function buildQueryByDest(User $user): QueryBuilder private function buildQueryByDest(User $user): QueryBuilder
{ {
$qb = $this->repository->createQueryBuilder('ew'); $qb = $this->repository->createQueryBuilder('ew');

View File

@ -826,4 +826,20 @@ paths:
$ref: '#/components/schemas/Workflow' $ref: '#/components/schemas/Workflow'
403: 403:
description: "Unauthorized" description: "Unauthorized"
/1.0/main/workflow/my-cc:
get:
tags:
- workflow
summary: Return a list of workflows for which user was notified in Cc
responses:
200:
description: "ok"
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Workflow'
403:
description: "Unauthorized"