Skip to content

Commit a87ed15

Browse files
authored
Adds endpoints for listing, retrieving, and deleting ActivityArea. (#658)
1 parent e3e98d9 commit a87ed15

20 files changed

+376
-4
lines changed

config/routes/api.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ api_example:
33
prefix: /api
44
name_prefix: api_example_
55

6+
api_activity_area:
7+
resource: 'api/activity-area.yaml'
8+
prefix: /api/activity-areas
9+
name_prefix: api_activity_area_
10+
trailing_slash_on_root: false
11+
612
api_agents:
713
resource: 'api/agent.yaml'
814
prefix: /api/agents

config/routes/api/activity-area.yaml

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
get:
2+
path: /{id}
3+
controller: App\Controller\Api\ActivityAreaApiController::get
4+
methods: ['GET']
5+
6+
list:
7+
path: /
8+
controller: App\Controller\Api\ActivityAreaApiController::list
9+
methods: ['GET']
10+
11+
remove:
12+
path: /{id}
13+
controller: App\Controller\Api\ActivityAreaApiController::remove
14+
methods: ['DELETE']
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
get:
2+
tags:
3+
- Áreas de Atividade
4+
summary: Recupera uma lista de áreas de atividade
5+
responses:
6+
'200':
7+
description: Lista de áreas de atividade
8+
content:
9+
application/json:
10+
schema:
11+
type: array
12+
items:
13+
allOf:
14+
- $ref: '../../responses/activity-area/ActivityAreaGetCollectionResponse.yaml'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
get:
2+
parameters:
3+
- $ref: '../../parameters/path/id.yaml'
4+
tags:
5+
- Áreas de Atividade
6+
summary: Recupera uma única área de atividade
7+
responses:
8+
'200':
9+
description: Área de atividade encontrada
10+
content:
11+
application/json:
12+
schema:
13+
$ref: '../../responses/activity-area/ActivityAreaGetItemResponse.yaml'
14+
'404':
15+
description: Área de atividade não encontrada
16+
content:
17+
application/json:
18+
schema:
19+
$ref: '../../responses/activity-area/ActivityAreaNotFound.yaml'
20+
21+
delete:
22+
parameters:
23+
- $ref: '../../parameters/path/id.yaml'
24+
tags:
25+
- Áreas de Atividade
26+
summary: Remove uma única área de atividade
27+
responses:
28+
'204':
29+
description: Não possui conteúdo de resposta
30+
content:
31+
application/json: {}
32+
'404':
33+
description: Área de atividade não encontrada
34+
content:
35+
application/json:
36+
schema:
37+
$ref: '../../responses/activity-area/ActivityAreaNotFound.yaml'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
type: object
2+
allOf:
3+
- $ref: './CommonDefinitions.yaml#/ActivityAreaBase'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
type: object
2+
allOf:
3+
- $ref: './CommonDefinitions.yaml#/ActivityAreaBase'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
type: object
2+
properties:
3+
error_message:
4+
type: string
5+
default: "not_found"
6+
error_details:
7+
type: object
8+
properties:
9+
description:
10+
type: string
11+
default: "The requested ActivityArea was not found."
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
ActivityAreaBase:
2+
type: object
3+
properties:
4+
id:
5+
type: string
6+
format: uuid
7+
description: "Identificador único da área de atividade."
8+
example: "123e4567-e89b-12d3-a456-426614174000"
9+
name:
10+
type: string
11+
maxLength: 20
12+
description: "Nome da área de atividade."
13+
example: "Teatro"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
type: object
2+
properties:
3+
id:
4+
type: string
5+
format: uuid
6+
description: "Identificador único da área de atividade."
7+
example: "123e4567-e89b-12d3-a456-426614174000"
8+
name:
9+
type: string
10+
maxLength: 20
11+
description: "Nome da área de atividade."
12+
example: "Teatro"

public/docs/openapi.yaml

+9
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ info:
44
description: |-
55
API responsável por praticamente todas as funcionalidades de gerenciamento:
66
- Agentes
7+
- Áreas de atividade
78
- Espaços
89
- Eventos
910
- Faqs
@@ -30,6 +31,8 @@ tags:
3031
description: Endpoints relacionados a autorização
3132
- name: Agentes
3233
description: Endpoints relacionados aos agentes
34+
- name: Áreas de Atividade
35+
description: Endpoints relacionados às áreas de atividade
3336
- name: Espaços
3437
description: Endpoints relacionados aos espaços
3538
- name: Eventos
@@ -53,6 +56,10 @@ tags:
5356
- name: Usuários
5457
description: Endpoints relacionados aos usuários
5558
paths:
59+
/activity-areas:
60+
$ref: './components/paths/activity-area/Collection.yaml'
61+
/activity-areas/{id}:
62+
$ref: './components/paths/activity-area/Item.yaml'
5663
/agents:
5764
$ref: './components/paths/agent/Collection.yaml'
5865
/agents/{id}:
@@ -117,6 +124,8 @@ paths:
117124
$ref: './components/paths/user/Item.yaml'
118125
components:
119126
schemas:
127+
ActivityArea:
128+
$ref: './components/schemas/activity-area.yaml'
120129
Agent:
121130
$ref: './components/schemas/agent.yaml'
122131
Event:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Controller\Api;
6+
7+
use App\Helper\EntityIdNormalizerHelper;
8+
use App\Service\Interface\ActivityAreaServiceInterface;
9+
use Symfony\Component\HttpFoundation\JsonResponse;
10+
use Symfony\Component\HttpFoundation\Response;
11+
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
12+
use Symfony\Component\Uid\Uuid;
13+
14+
class ActivityAreaApiController extends AbstractApiController
15+
{
16+
public function __construct(
17+
private readonly ActivityAreaServiceInterface $service,
18+
) {
19+
}
20+
21+
public function get(?Uuid $id): JsonResponse
22+
{
23+
$activityArea = $this->service->get($id);
24+
25+
return $this->json($activityArea, context: ['groups' => ['activity-area.get', 'activity-area.get.item']]);
26+
}
27+
28+
public function list(): JsonResponse
29+
{
30+
return $this->json($this->service->list(), context: [
31+
'groups' => 'activity-area.get',
32+
AbstractNormalizer::CALLBACKS => [
33+
'parent' => [EntityIdNormalizerHelper::class, 'normalizeEntityId'],
34+
],
35+
]);
36+
}
37+
38+
public function remove(?Uuid $id): JsonResponse
39+
{
40+
$this->service->remove($id);
41+
42+
return $this->json(data: [], status: Response::HTTP_NO_CONTENT);
43+
}
44+
}

src/DataFixtures/Entity/ActivityAreaFixtures.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ private function createActivityAreas(ObjectManager $manager): void
8585
{
8686
foreach (self::ACTIVITY_AREAS as $activityAreaData) {
8787
$activityArea = $this->serializer->denormalize($activityAreaData, ActivityArea::class);
88-
$this->setReference(self::ACTIVITY_AREA_ID_PREFIX.$activityAreaData['id'], $activityArea);
88+
89+
$this->setReference(sprintf('%s-%s', self::ACTIVITY_AREA_ID_PREFIX, $activityAreaData['id']), $activityArea);
90+
8991
$manager->persist($activityArea);
9092
}
9193

src/Entity/ActivityArea.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ class ActivityArea
1515
{
1616
#[ORM\Id]
1717
#[ORM\Column(type: UuidType::NAME)]
18-
#[Groups(['space.get', 'space.get.item', 'activity_area.get'])]
18+
#[Groups(['space.get', 'space.get.item', 'activity-area.get', 'activity-area.get.item'])]
1919
private ?Uuid $id = null;
2020

2121
#[ORM\Column(length: 20)]
22-
#[Groups(['space.get', 'space.get.item', 'activity_area.get'])]
22+
#[Groups(['space.get', 'space.get.item', 'activity-area.get', 'activity-area.get.item'])]
2323
private ?string $name = null;
2424

2525
public function getId(): ?Uuid

src/Entity/Space.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class Space extends AbstractEntity
2222
{
2323
#[ORM\Id]
2424
#[ORM\Column(type: UuidType::NAME)]
25-
#[Groups(['event.get', 'initiative.get', 'opportunity.get', 'space.get', 'activity_area.get'])]
25+
#[Groups(['event.get', 'initiative.get', 'opportunity.get', 'space.get', 'activity-area.get'])]
2626
private ?Uuid $id = null;
2727

2828
#[ORM\Column(length: 100)]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Exception\ActivityArea;
6+
7+
use App\Exception\ResourceNotFoundException;
8+
9+
class ActivityAreaResourceNotFoundException extends ResourceNotFoundException
10+
{
11+
protected const string RESOURCE = 'ActivityArea';
12+
}

src/Repository/ActivityAreaRepository.php

+6
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,10 @@ public function save(ActivityArea $activityArea): ActivityArea
2222

2323
return $activityArea;
2424
}
25+
26+
public function remove(ActivityArea $activityArea): void
27+
{
28+
$this->getEntityManager()->remove($activityArea);
29+
$this->getEntityManager()->flush();
30+
}
2531
}

src/Repository/Interface/ActivityAreaRepositoryInterface.php

+2
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@
99
interface ActivityAreaRepositoryInterface
1010
{
1111
public function save(ActivityArea $activityArea): ActivityArea;
12+
13+
public function remove(ActivityArea $activityArea);
1214
}

src/Service/ActivityAreaService.php

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Service;
6+
7+
use App\Entity\ActivityArea;
8+
use App\Exception\ActivityArea\ActivityAreaResourceNotFoundException;
9+
use App\Repository\Interface\ActivityAreaRepositoryInterface;
10+
use App\Service\Interface\ActivityAreaServiceInterface;
11+
use Symfony\Bundle\SecurityBundle\Security;
12+
use Symfony\Component\Uid\Uuid;
13+
14+
readonly class ActivityAreaService extends AbstractEntityService implements ActivityAreaServiceInterface
15+
{
16+
public function __construct(
17+
private ActivityAreaRepositoryInterface $repository,
18+
private Security $security,
19+
) {
20+
parent::__construct($this->security);
21+
}
22+
23+
public function get(Uuid $id): ActivityArea
24+
{
25+
$activityArea = $this->findOneBy(['id' => $id]);
26+
27+
if (null === $activityArea) {
28+
throw new ActivityAreaResourceNotFoundException();
29+
}
30+
31+
return $activityArea;
32+
}
33+
34+
public function list(int $limit = 50, array $params = []): array
35+
{
36+
return $this->repository->findBy(
37+
$params,
38+
['name' => 'ASC'],
39+
$limit
40+
);
41+
}
42+
43+
public function remove(Uuid $id): void
44+
{
45+
$activityArea = $this->findOneBy(['id' => $id]);
46+
47+
if (null === $activityArea) {
48+
throw new ActivityAreaResourceNotFoundException();
49+
}
50+
51+
$this->repository->remove($activityArea);
52+
}
53+
54+
private function findOneBy(array $array): ?ActivityArea
55+
{
56+
return $this->repository->findOneBy($array);
57+
}
58+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Service\Interface;
6+
7+
use App\Entity\ActivityArea;
8+
use Symfony\Component\Uid\Uuid;
9+
10+
interface ActivityAreaServiceInterface
11+
{
12+
public function get(Uuid $id): ActivityArea;
13+
14+
public function list(int $limit = 50): array;
15+
16+
public function remove(Uuid $id): void;
17+
}

0 commit comments

Comments
 (0)