Skip to content

Commit 5a8752f

Browse files
committed
refactor(persistence): move entity-model conversion to adapters
improve docs refactor products by category list to use name
1 parent e31aa82 commit 5a8752f

File tree

21 files changed

+269
-174
lines changed

21 files changed

+269
-174
lines changed

techchallenge/src/main/java/br/com/grupo63/techchallenge/adapter/in/controller/client/ClientController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import br.com.grupo63.techchallenge.adapter.in.controller.AbstractController;
44
import br.com.grupo63.techchallenge.adapter.in.controller.dto.DefaultResponseDTO;
55
import br.com.grupo63.techchallenge.core.application.usecase.client.ClientUseCase;
6+
import br.com.grupo63.techchallenge.core.application.usecase.client.IClientUseCase;
67
import br.com.grupo63.techchallenge.core.application.usecase.dto.ClientDTO;
78
import br.com.grupo63.techchallenge.core.application.usecase.exception.NotFoundException;
89
import io.swagger.v3.oas.annotations.Operation;
@@ -22,7 +23,7 @@
2223
@RequestMapping("/clientes")
2324
public class ClientController extends AbstractController {
2425

25-
private final ClientUseCase useCase;
26+
private final IClientUseCase useCase;
2627

2728
@Operation(
2829
summary = "Find a client by their national id",
@@ -37,7 +38,7 @@ public ClientDTO findByNationalId(@PathVariable String nationalId) throws NotFou
3738
summary = "Identificação: Identifica um cliente",
3839
description = "Registra um cliente com seu CPF")
3940
@PostMapping("/criar")
40-
public ResponseEntity<ClientDTO> create(@RequestParam String nationalId) {
41+
public ResponseEntity<ClientDTO> create(@RequestParam String nationalId) throws NotFoundException {
4142
ClientDTO clientDTO = new ClientDTO(nationalId);
4243
return ResponseEntity.ok(useCase.create(clientDTO));
4344
}

techchallenge/src/main/java/br/com/grupo63/techchallenge/adapter/in/controller/order/OrderController.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@
2323
@RequestMapping("/pedidos")
2424
public class OrderController extends AbstractController {
2525

26-
private final IOrderUseCase orderUseCase;
26+
private final IOrderUseCase useCase;
2727

2828
@Operation(
2929
tags = "5ª chamada - fluxo principal",
3030
summary = "Listar pedidos pagos porém não finalizados.",
3131
description = "Seria utilizado pelo monitor no restaurante para exibir os pedidos em preparação e prontos")
3232
@GetMapping("/listar-fila")
3333
public ResponseEntity<List<OrderDTO>> listUnfinishedOrders() {
34-
return ResponseEntity.ok(orderUseCase.listUnfinishedOrders());
34+
return ResponseEntity.ok(useCase.listUnfinishedOrders());
3535
}
3636

3737
@Operation(
@@ -41,7 +41,7 @@ public ResponseEntity<List<OrderDTO>> listUnfinishedOrders() {
4141
@PostMapping("/avancar-estado")
4242
@ResponseStatus(HttpStatus.OK)
4343
public void advanceOrderStatusFromOrderId(@Parameter(description = "Id do pedido.") @RequestParam Long orderId) throws NotFoundException, ValidationException {
44-
orderUseCase.advanceStatus(orderId);
44+
useCase.advanceStatus(orderId);
4545
}
4646

4747
@Operation(
@@ -52,7 +52,7 @@ public void advanceOrderStatusFromOrderId(@Parameter(description = "Id do pedido
5252
public ResponseEntity<OrderDTO> create(@RequestParam Long clientId,
5353
@RequestBody CreateOrderRequestDTO createOrderRequestDTO) throws NotFoundException {
5454

55-
return ResponseEntity.ok(orderUseCase.create(createOrderRequestDTO.toDomainDto(clientId)));
55+
return ResponseEntity.ok(useCase.create(createOrderRequestDTO.toDomainDto(clientId)));
5656
}
5757

5858
@Operation(
@@ -61,31 +61,31 @@ public ResponseEntity<OrderDTO> create(@RequestParam Long clientId,
6161
description = "Find a order by their id.")
6262
@GetMapping("/{id}")
6363
public ResponseEntity<OrderDTO> read(@PathVariable("id") Long id) throws NotFoundException {
64-
return ResponseEntity.ok(orderUseCase.read(id));
64+
return ResponseEntity.ok(useCase.read(id));
6565
}
6666

6767
@Operation(
6868
summary = "List all order",
6969
description = "List all orders.")
7070
@GetMapping("/listar")
7171
public ResponseEntity<List<OrderDTO>> list() {
72-
return ResponseEntity.ok(orderUseCase.list());
72+
return ResponseEntity.ok(useCase.list());
7373
}
7474

7575
@Operation(
7676
summary = "Update an order",
7777
description = "Update an order in the database with the DTO data.")
7878
// @PutMapping("/{id}")
7979
public ResponseEntity<OrderDTO> update(@RequestBody OrderDTO dto, @PathVariable("id") Long id) throws NotFoundException {
80-
return ResponseEntity.ok(orderUseCase.update(dto, id));
80+
return ResponseEntity.ok(useCase.update(dto, id));
8181
}
8282

8383
@Operation(
8484
summary = "Delete a client",
8585
description = "Delete a client in the database by their id.")
8686
@DeleteMapping("/{id}")
8787
public ResponseEntity<DefaultResponseDTO> delete(@PathVariable("id") Long id) throws NotFoundException {
88-
orderUseCase.delete(id);
88+
useCase.delete(id);
8989
return ResponseEntity.ok().build();
9090
}
9191

techchallenge/src/main/java/br/com/grupo63/techchallenge/adapter/in/controller/payment/PaymentController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
@RequestMapping("/pagamentos")
2121
public class PaymentController extends AbstractController {
2222

23-
private final IPaymentUseCase paymentUseCase;
23+
private final IPaymentUseCase useCase;
2424

2525
@Operation(
2626
tags = "3ª chamada - fluxo principal",
@@ -30,7 +30,7 @@ public class PaymentController extends AbstractController {
3030
public QRCodeResponseDTO startPayment(
3131
@Parameter(description = "Id do pedido") @RequestParam Long orderId
3232
) throws NotFoundException, ValidationException {
33-
String qrData = paymentUseCase.startPayment(orderId);
33+
String qrData = useCase.startPayment(orderId);
3434
return new QRCodeResponseDTO(qrData);
3535
}
3636

@@ -42,7 +42,7 @@ public QRCodeResponseDTO startPayment(
4242
@ResponseStatus(HttpStatus.OK)
4343
public void confirmPaymentFromOrderId(@Parameter(description = "Id do pedido associado ao pagamento")
4444
@RequestParam Long orderId) throws ValidationException, NotFoundException {
45-
paymentUseCase.finishPayment(orderId);
45+
useCase.finishPayment(orderId);
4646
}
4747

4848
@Operation(
@@ -52,7 +52,7 @@ public void confirmPaymentFromOrderId(@Parameter(description = "Id do pedido ass
5252
@GetMapping("/status")
5353
public PaymentStatusResponseDTO getStatusByOrderId(@Parameter(description = "Id do pedido associado ao pagamento")
5454
@RequestParam Long orderId) throws NotFoundException, ValidationException {
55-
PaymentStatus status = paymentUseCase.getPaymentStatus(orderId);
55+
PaymentStatus status = useCase.getPaymentStatus(orderId);
5656
return new PaymentStatusResponseDTO(status);
5757
}
5858

techchallenge/src/main/java/br/com/grupo63/techchallenge/adapter/in/controller/product/ProductController.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import br.com.grupo63.techchallenge.adapter.in.controller.dto.DefaultResponseDTO;
55
import br.com.grupo63.techchallenge.core.application.usecase.dto.ProductDTO;
66
import br.com.grupo63.techchallenge.core.application.usecase.exception.NotFoundException;
7+
import br.com.grupo63.techchallenge.core.application.usecase.product.IProductUseCase;
78
import br.com.grupo63.techchallenge.core.application.usecase.product.ProductUseCase;
89
import io.swagger.v3.oas.annotations.Operation;
10+
import io.swagger.v3.oas.annotations.media.Schema;
911
import io.swagger.v3.oas.annotations.tags.Tag;
1012
import jakarta.validation.Valid;
1113
import lombok.RequiredArgsConstructor;
@@ -20,13 +22,14 @@
2022
@RequestMapping("/produtos")
2123
public class ProductController extends AbstractController {
2224

23-
private final ProductUseCase useCase;
25+
private final IProductUseCase useCase;
2426

2527
@Operation(
26-
summary = "Registers a product",
27-
description = "Register a new product in the database with the DTO data.")
28+
summary = "Criar um produto",
29+
description = "Cria um produto com nome, preço, estoque inicial e categoria. Possíveis categorias (IDs): " +
30+
"1 - Lanche, 2 - Acompanhamento, 3 - Bebida, 4 - Sobremesa")
2831
@PostMapping("/criar")
29-
public ResponseEntity<ProductDTO> create(@Valid @RequestBody ProductDTO dto) {
32+
public ResponseEntity<ProductDTO> create(@Valid @RequestBody ProductDTO dto) throws NotFoundException {
3033
return ResponseEntity.ok(useCase.create(dto));
3134
}
3235

@@ -64,10 +67,12 @@ public ResponseEntity<DefaultResponseDTO> delete(@PathVariable("id") Long id) th
6467
}
6568

6669
@Operation(
67-
summary = "List all products by category",
68-
description = "List all products by category.")
70+
summary = "Listar produtos por categoria",
71+
description = "Lista todos os produtos por nome da categoria")
6972
@GetMapping("/listar-por-categoria")
70-
public ResponseEntity<List<ProductDTO>> listByCategoryId(@RequestParam(value = "categoria") String categoryId) throws NotFoundException {
71-
return ResponseEntity.ok(useCase.listByCategoryId(Long.valueOf(categoryId)));
73+
public ResponseEntity<List<ProductDTO>> listByCategoryName(
74+
@Schema(allowableValues = {"Lanche", "Acompanhamento", "Bebida", "Sobremesa"})
75+
@RequestParam(value = "categoria") String categoryName) {
76+
return ResponseEntity.ok(useCase.listByCategoryName(categoryName));
7277
}
7378
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package br.com.grupo63.techchallenge.adapter.out.repository;
2+
3+
import br.com.grupo63.techchallenge.adapter.out.repository.product.entity.ProductEntity;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
import java.util.List;
7+
import java.util.Optional;
8+
9+
public interface IJpaRepository<E> {
10+
11+
Optional<E> findByIdAndDeletedFalse(Long id);
12+
13+
List<E> findByDeletedFalse();
14+
15+
16+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package br.com.grupo63.techchallenge.adapter.out.repository.client;
2+
3+
import br.com.grupo63.techchallenge.adapter.out.repository.client.entity.ClientEntity;
4+
import br.com.grupo63.techchallenge.core.application.repository.IClientRepository;
5+
import br.com.grupo63.techchallenge.core.domain.model.client.Client;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.stereotype.Component;
8+
9+
import java.util.List;
10+
import java.util.Optional;
11+
import java.util.stream.Collectors;
12+
13+
@Component
14+
@RequiredArgsConstructor
15+
public class ClientJpaAdapter implements IClientRepository {
16+
17+
private final ClientJpaRepository jpaRepository;
18+
19+
@Override
20+
public List<Client> findByDeletedFalse() {
21+
return jpaRepository.findByDeletedFalse().stream()
22+
.map(ClientEntity::toModel)
23+
.collect(Collectors.toList());
24+
}
25+
26+
@Override
27+
public Client saveAndFlush(Client client) {
28+
ClientEntity entity = new ClientEntity(client);
29+
30+
entity = jpaRepository.saveAndFlush(entity);
31+
32+
return entity.toModel();
33+
}
34+
35+
@Override
36+
public Optional<Client> findByNationalId(String nationalId) {
37+
return jpaRepository.findByNationalIdAndDeletedFalse(nationalId)
38+
.map(ClientEntity::toModel);
39+
}
40+
41+
@Override
42+
public Optional<Client> findByIdAndDeletedFalse(Long id) {
43+
return jpaRepository.findByIdAndDeletedFalse(id)
44+
.map(ClientEntity::toModel);
45+
}
46+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package br.com.grupo63.techchallenge.adapter.out.repository.client;
2+
3+
import br.com.grupo63.techchallenge.adapter.out.repository.IJpaRepository;
4+
import br.com.grupo63.techchallenge.adapter.out.repository.client.entity.ClientEntity;
5+
import br.com.grupo63.techchallenge.core.domain.model.client.Client;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.stereotype.Repository;
8+
9+
import java.util.Optional;
10+
11+
@Repository
12+
public interface ClientJpaRepository extends JpaRepository<ClientEntity, Long>, IJpaRepository<ClientEntity> {
13+
14+
Optional<ClientEntity> findByNationalIdAndDeletedFalse(String nationalId);
15+
16+
}

techchallenge/src/main/java/br/com/grupo63/techchallenge/adapter/out/repository/client/ClientRepository.java

Lines changed: 0 additions & 36 deletions
This file was deleted.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package br.com.grupo63.techchallenge.adapter.out.repository.order;
2+
3+
import br.com.grupo63.techchallenge.adapter.out.repository.order.entity.OrderEntity;
4+
import br.com.grupo63.techchallenge.core.application.repository.IOrderRepository;
5+
import br.com.grupo63.techchallenge.core.domain.model.order.Order;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.stereotype.Component;
8+
import org.springframework.transaction.annotation.Transactional;
9+
10+
import java.util.List;
11+
import java.util.Optional;
12+
import java.util.stream.Collectors;
13+
14+
@Component
15+
@RequiredArgsConstructor
16+
public class OrderJpaAdapter implements IOrderRepository {
17+
18+
private final OrderJpaRepository jpaRepository;
19+
20+
@Override
21+
public List<Order> findByStatusNotFinishedAndDeletedOrderByCreationDate() {
22+
return jpaRepository.findByStatusNotFinishedAndDeletedOrderByCreationDate().stream()
23+
.map(OrderEntity::toModel)
24+
.collect(Collectors.toList());
25+
}
26+
27+
@Override
28+
public Optional<Order> findByIdAndDeletedFalse(Long id) {
29+
return jpaRepository.findByIdAndDeletedFalse(id)
30+
.map(OrderEntity::toModel);
31+
}
32+
33+
@Override
34+
@Transactional
35+
public Order saveAndFlush(Order order) {
36+
OrderEntity entity = new OrderEntity(order);
37+
38+
entity = jpaRepository.saveAndFlush(entity);
39+
40+
return entity.toModel();
41+
}
42+
43+
@Override
44+
public List<Order> findByDeletedFalse() {
45+
return jpaRepository.findByDeletedFalse().stream()
46+
.map(OrderEntity::toModel)
47+
.toList();
48+
}
49+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package br.com.grupo63.techchallenge.adapter.out.repository.order;
2+
3+
import br.com.grupo63.techchallenge.adapter.out.repository.IJpaRepository;
4+
import br.com.grupo63.techchallenge.adapter.out.repository.order.entity.OrderEntity;
5+
import br.com.grupo63.techchallenge.core.domain.model.order.Order;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Query;
8+
import org.springframework.stereotype.Repository;
9+
import org.springframework.transaction.annotation.Transactional;
10+
11+
import java.util.List;
12+
import java.util.Optional;
13+
14+
@Repository
15+
public interface OrderJpaRepository extends JpaRepository<OrderEntity, Long>, IJpaRepository<OrderEntity> {
16+
17+
@Query("SELECT " +
18+
" order " +
19+
"FROM " +
20+
" OrderEntity order " +
21+
"WHERE " +
22+
" order.status IN ('RECEIVED', 'PREPARING', 'READY') " +
23+
" AND order.deleted = false " +
24+
"ORDER BY " +
25+
" order.creationDate")
26+
List<OrderEntity> findByStatusNotFinishedAndDeletedOrderByCreationDate();
27+
28+
}

0 commit comments

Comments
 (0)