Skip to content

Commit 3414ded

Browse files
committed
fix: small fixes and some missing configs
1 parent 6e9622b commit 3414ded

File tree

22 files changed

+192
-18
lines changed

22 files changed

+192
-18
lines changed

src/main/java/br/com/grupo63/serviceorder/ServiceOrderApplication.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
11
package br.com.grupo63.serviceorder;
22

3+
import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn;
4+
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
5+
import io.swagger.v3.oas.annotations.security.SecurityScheme;
36
import org.springframework.boot.SpringApplication;
47
import org.springframework.boot.autoconfigure.SpringBootApplication;
58
import org.springframework.cloud.openfeign.EnableFeignClients;
69

10+
@SecurityScheme(
11+
name = "bearerAuth",
12+
type = SecuritySchemeType.HTTP,
13+
scheme = "bearer",
14+
bearerFormat = "JWT",
15+
in = SecuritySchemeIn.HEADER
16+
)
717
@SpringBootApplication
818
@EnableFeignClients
919
public class ServiceOrderApplication {

src/main/java/br/com/grupo63/serviceorder/adapter/OrderAdapter.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ public static void fillEntity(OrderControllerDTO dto, Order entity) {
3838
}).toList());
3939

4040
entity.setClientId(dto.getClientId());
41-
entity.setPaymentId(dto.getPaymentId());
4241
}
4342

4443
}

src/main/java/br/com/grupo63/serviceorder/api/controller/order/OrderAPIController.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,26 @@ public ResponseEntity<OrderControllerDTO> create(@Valid @RequestBody CreateOrder
4242
@Operation(
4343
tags = {"3ª chamada - Fluxo principal - Pagamento", "5ª chamada - Fluxo principal - Acompanhamento e entrega"},
4444
summary = "Recupera pedido",
45-
description = "Exibe os dados de um pedido a partir de seu id")
45+
description = "Exibe os dados de um pedido a partir de seu id",
46+
security = @SecurityRequirement(name = "bearerAuth"))
4647
@GetMapping("/{id}")
4748
public ResponseEntity<OrderControllerDTO> read(@PathVariable("id") Long id) throws NotFoundException {
4849
return ResponseEntity.ok(controller.read(id));
4950
}
5051

5152
@Operation(
5253
summary = "Listar pedidos",
53-
description = "Lista todos os pedidos")
54+
description = "Lista todos os pedidos",
55+
security = @SecurityRequirement(name = "bearerAuth"))
5456
@GetMapping
5557
public ResponseEntity<List<OrderControllerDTO>> list() {
5658
return ResponseEntity.ok(controller.list());
5759
}
5860

5961
@Operation(
6062
summary = "Excluir pedido",
61-
description = "Exclui um pedido por id")
63+
description = "Exclui um pedido por id",
64+
security = @SecurityRequirement(name = "bearerAuth"))
6265
@DeleteMapping("/{id}")
6366
public ResponseEntity<DefaultResponseDTO> delete(@PathVariable("id") Long id) throws NotFoundException {
6467
controller.delete(id);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package br.com.grupo63.serviceorder.config;
2+
3+
import br.com.grupo63.serviceorder.ServiceOrderApplication;
4+
import io.jsonwebtoken.Claims;
5+
import jakarta.servlet.*;
6+
import jakarta.servlet.http.HttpServletRequest;
7+
import jakarta.servlet.http.HttpServletResponse;
8+
import lombok.RequiredArgsConstructor;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
import org.springframework.util.StringUtils;
12+
13+
import java.io.IOException;
14+
import java.security.GeneralSecurityException;
15+
16+
@RequiredArgsConstructor
17+
public class JwtFilter implements Filter {
18+
19+
private final JwtService jwtService;
20+
private static Logger logger = LoggerFactory.getLogger(ServiceOrderApplication.class);
21+
22+
@Override
23+
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
24+
try {
25+
String authHeader = ((HttpServletRequest) request).getHeader("Authorization");
26+
logger.info("Auth header: " + authHeader);
27+
if (!StringUtils.hasLength(authHeader) || !StringUtils.startsWithIgnoreCase(authHeader, "Bearer ")) {
28+
throw new GeneralSecurityException("Missing or invalid authorization header");
29+
}
30+
String jwt = authHeader.substring(7);
31+
Claims claims = jwtService.getClaims(jwt);
32+
request.setAttribute("clientId", claims.get("sub"));
33+
filterChain.doFilter(request, response);
34+
} catch (Exception e) {
35+
((HttpServletResponse) response).setStatus(HttpServletResponse.SC_UNAUTHORIZED);
36+
response.getWriter().write("Unauthorized: Missing or incorrect JWT Token.");
37+
logger.info("Unauthorized: " + e.getMessage());
38+
}
39+
}
40+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package br.com.grupo63.serviceorder.config;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.boot.web.servlet.FilterRegistrationBean;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
8+
import java.util.List;
9+
10+
@Configuration
11+
public class JwtFilterConfig {
12+
13+
@Autowired
14+
private JwtService jwtService;
15+
16+
@Bean
17+
public FilterRegistrationBean<JwtFilter> jwtFilterFilterRegistrationBean() {
18+
FilterRegistrationBean<JwtFilter> jwtFilterFilterRegistrationBean = new FilterRegistrationBean<>();
19+
jwtFilterFilterRegistrationBean.setFilter(new JwtFilter(jwtService));
20+
jwtFilterFilterRegistrationBean.setUrlPatterns(List.of("/orders"));
21+
return jwtFilterFilterRegistrationBean;
22+
}
23+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package br.com.grupo63.serviceorder.config;
2+
3+
import io.jsonwebtoken.Claims;
4+
import io.jsonwebtoken.Jwts;
5+
import io.jsonwebtoken.io.Decoders;
6+
import org.springframework.beans.factory.annotation.Value;
7+
import org.springframework.stereotype.Service;
8+
9+
import java.security.Key;
10+
import java.security.KeyFactory;
11+
import java.security.NoSuchAlgorithmException;
12+
import java.security.spec.InvalidKeySpecException;
13+
import java.security.spec.X509EncodedKeySpec;
14+
15+
@Service
16+
public class JwtService {
17+
18+
@Value("${jwt.token.key.public}")
19+
private String jwtSigningKey;
20+
21+
public Claims getClaims(String token) throws NoSuchAlgorithmException, InvalidKeySpecException {
22+
return Jwts.parser().setSigningKey(getSigningKey()).build().parseClaimsJws(token)
23+
.getBody();
24+
}
25+
26+
private Key getSigningKey() throws NoSuchAlgorithmException, InvalidKeySpecException {
27+
byte[] keyBytes = Decoders.BASE64.decode(jwtSigningKey);
28+
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
29+
KeyFactory kf = KeyFactory.getInstance("RSA");
30+
return kf.generatePublic(spec);
31+
}
32+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package br.com.grupo63.serviceorder.config;
2+
3+
import org.springframework.context.MessageSource;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.context.support.ResourceBundleMessageSource;
7+
import org.springframework.web.servlet.LocaleResolver;
8+
import org.springframework.web.servlet.i18n.FixedLocaleResolver;
9+
10+
import java.util.Locale;
11+
12+
@Configuration
13+
public class ValidationConfig {
14+
15+
@Bean
16+
public MessageSource messageSource() {
17+
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
18+
source.setBasename("messages");
19+
source.setDefaultEncoding("UTF-8");
20+
return source;
21+
}
22+
23+
@Bean
24+
public LocaleResolver localeResolver() {
25+
FixedLocaleResolver localeResolver = new FixedLocaleResolver();
26+
localeResolver.setDefaultLocale(new Locale("pt", "BR")); // Default locale is Portuguese Brazil
27+
return localeResolver;
28+
}
29+
}

src/main/java/br/com/grupo63/serviceorder/controller/dto/OrderControllerDTO.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,5 @@ public class OrderControllerDTO extends AbstractControllerDTO {
1818
private Double totalPrice;
1919
private Long clientId;
2020
private List<OrderItemControllerDTO> items = new ArrayList<>();
21-
private Long paymentId;
2221

2322
}

src/main/java/br/com/grupo63/serviceorder/entity/order/Order.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,12 @@ public class Order extends Entity {
1818
private Double totalPrice;
1919
private Long clientId;
2020
private List<OrderItem> items = new ArrayList<>();
21-
private Long paymentId;
2221

23-
public Order(Long id, boolean deleted, Double totalPrice, Long clientId, List<OrderItem> items, Long paymentId) {
22+
public Order(Long id, boolean deleted, Double totalPrice, Long clientId, List<OrderItem> items) {
2423
super(id, deleted);
2524
this.totalPrice = totalPrice;
2625
this.clientId = clientId;
2726
this.items = items;
28-
this.paymentId = paymentId;
2927
}
3028

3129
public OrderItem getByProductId(Long id) {

src/main/java/br/com/grupo63/serviceorder/gateway/order/entity/OrderPersistenceEntity.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@ public class OrderPersistenceEntity extends PersistenceEntity {
3131
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "order")
3232
private List<OrderItemPersistenceEntity> items = new ArrayList<>();
3333

34-
@Basic
35-
@Column(name = "ord_payment", nullable = false)
36-
private Long paymentId;
37-
3834
public OrderPersistenceEntity(Long id) {
3935
this.id = id;
4036
}
@@ -43,7 +39,6 @@ public OrderPersistenceEntity(Order order) {
4339
super(order);
4440
this.totalPrice = order.getTotalPrice();
4541
this.clientId = order.getClientId();
46-
this.paymentId = order.getPaymentId();
4742
this.items = order.getItems().stream().map(item -> new OrderItemPersistenceEntity(item, this)).toList();
4843
}
4944

@@ -53,8 +48,7 @@ public Order toModel() {
5348
this.isDeleted(),
5449
this.getTotalPrice(),
5550
this.getClientId(),
56-
this.getItems().stream().map(OrderItemPersistenceEntity::toModel).toList(),
57-
this.getPaymentId());
51+
this.getItems().stream().map(OrderItemPersistenceEntity::toModel).toList());
5852
}
5953

6054
}

0 commit comments

Comments
 (0)