Skip to content

Commit e70222e

Browse files
committed
Merge remote-tracking branch 'origin/uat'
# Conflicts: # src/main/java/it/gov/pagopa/idpay/transactions/controller/PointOfSaleTransactionControllerImpl.java # src/main/java/it/gov/pagopa/idpay/transactions/dto/RewardTransactionDTO.java # src/main/java/it/gov/pagopa/idpay/transactions/dto/mapper/RewardTransactionMapper.java # src/main/java/it/gov/pagopa/idpay/transactions/model/RewardTransaction.java # src/main/java/it/gov/pagopa/idpay/transactions/service/PointOfSaleTransactionServiceImpl.java # src/main/java/it/gov/pagopa/idpay/transactions/storage/InvoiceStorageClient.java # src/test/java/it/gov/pagopa/idpay/transactions/dto/mapper/RewardTransactionMapperTest.java # src/test/java/it/gov/pagopa/idpay/transactions/service/PointOfSaleTransactionServiceImplTest.java
2 parents 5d16cad + 3c18d6a commit e70222e

File tree

76 files changed

+8926
-979
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+8926
-979
lines changed

pom.xml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,26 @@
5454
<groupId>com.azure.spring</groupId>
5555
<artifactId>spring-cloud-azure-starter-storage-blob</artifactId>
5656
</dependency>
57+
<dependency>
58+
<groupId>org.springframework.boot</groupId>
59+
<artifactId>spring-boot-starter-data-redis</artifactId>
60+
</dependency>
61+
<dependency>
62+
<groupId>org.springframework.boot</groupId>
63+
<artifactId>spring-boot-starter-cache</artifactId>
64+
</dependency>
65+
<dependency>
66+
<groupId>it.ozimov</groupId>
67+
<artifactId>embedded-redis</artifactId>
68+
<version>0.7.3</version>
69+
<scope>test</scope>
70+
<exclusions>
71+
<exclusion>
72+
<groupId>org.slf4j</groupId>
73+
<artifactId>slf4j-simple</artifactId>
74+
</exclusion>
75+
</exclusions>
76+
</dependency>
5777

5878
<!--3rd party library-->
5979
<dependency>
@@ -126,6 +146,12 @@
126146
<groupId>net.minidev</groupId>
127147
<artifactId>json-smart</artifactId>
128148
</dependency>
149+
150+
<dependency>
151+
<groupId>com.google.guava</groupId>
152+
<artifactId>guava</artifactId>
153+
<version>33.5.0-jre</version>
154+
</dependency>
129155
</dependencies>
130156

131157
<dependencyManagement>

src/main/java/it/gov/pagopa/common/web/exception/ErrorManager.java

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,22 @@ protected ResponseEntity<ErrorDTO> handleRequestValueException(
3535
protected ResponseEntity<ErrorDTO> handleException(RuntimeException error, ServerWebExchange exchange) {
3636
logClientException(error, exchange);
3737

38-
if(error instanceof ClientExceptionNoBody clientExceptionNoBody){
39-
return ResponseEntity.status(clientExceptionNoBody.getHttpStatus()).build();
40-
}
41-
else {
42-
ErrorDTO errorDTO;
43-
HttpStatus httpStatus;
44-
if (error instanceof ClientExceptionWithBody clientExceptionWithBody){
45-
httpStatus=clientExceptionWithBody.getHttpStatus();
46-
errorDTO = new ErrorDTO(clientExceptionWithBody.getCode(), error.getMessage());
47-
}
48-
else {
49-
httpStatus=HttpStatus.INTERNAL_SERVER_ERROR;
50-
errorDTO = defaultErrorDTO;
51-
}
52-
return ResponseEntity.status(httpStatus)
53-
.contentType(MediaType.APPLICATION_JSON)
54-
.body(errorDTO);
55-
}
38+
return switch (error) {
39+
case ClientExceptionNoBody clientExceptionNoBody ->
40+
buildResponseEntity(clientExceptionNoBody.getHttpStatus(), null);
41+
case RewardBatchException rewardBatchException -> buildResponseEntity(rewardBatchException.getHttpStatus(),
42+
new ErrorDTO(rewardBatchException.getMessage(), rewardBatchException.getMessage()));
43+
case ClientExceptionWithBody clientExceptionWithBody ->
44+
buildResponseEntity(clientExceptionWithBody.getHttpStatus(),
45+
new ErrorDTO(clientExceptionWithBody.getCode(), error.getMessage()));
46+
case null, default -> buildResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR, defaultErrorDTO);
47+
};
48+
}
49+
50+
private ResponseEntity<ErrorDTO> buildResponseEntity(HttpStatus status, ErrorDTO errorDTO) {
51+
return ResponseEntity.status(status)
52+
.contentType(MediaType.APPLICATION_JSON)
53+
.body(errorDTO);
5654
}
5755

5856
public static void logClientException(RuntimeException error, ServerWebExchange exchange) {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package it.gov.pagopa.common.web.exception;
2+
3+
import lombok.Getter;
4+
import org.springframework.http.HttpStatus;
5+
6+
@Getter
7+
public class RewardBatchException extends RuntimeException{
8+
private final HttpStatus httpStatus;
9+
private final boolean printStackTrace;
10+
11+
public RewardBatchException(HttpStatus httpStatus, String message){
12+
this(httpStatus, message, null);
13+
}
14+
15+
public RewardBatchException(HttpStatus httpStatus, String message, Throwable ex){
16+
this(httpStatus, message, false, ex);
17+
}
18+
19+
public RewardBatchException(HttpStatus httpStatus, String message, boolean printStackTrace, Throwable ex){
20+
super(message, ex);
21+
this.httpStatus=httpStatus;
22+
this.printStackTrace=printStackTrace;
23+
}
24+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package it.gov.pagopa.common.web.exception;
2+
3+
public class RewardBatchNotFound extends ServiceException {
4+
5+
public RewardBatchNotFound(String code, String message) {
6+
this(code, message, false, null);
7+
}
8+
9+
public RewardBatchNotFound(String code, String message, boolean printStackTrace, Throwable ex) {
10+
super(code, message, printStackTrace, ex);
11+
}
12+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package it.gov.pagopa.common.web.exception;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public class ServiceException extends RuntimeException {
7+
private final String code;
8+
private final boolean printStackTrace;
9+
10+
public ServiceException(String code, String message) {
11+
this(code, message, false, null);
12+
}
13+
14+
public ServiceException(String code, String message, boolean printStackTrace, Throwable ex) {
15+
super(message, ex);
16+
this.code = code;
17+
this.printStackTrace = printStackTrace;
18+
}
19+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package it.gov.pagopa.common.web.exception;
2+
3+
import it.gov.pagopa.common.web.dto.ErrorDTO;
4+
import lombok.extern.slf4j.Slf4j;
5+
import org.springframework.core.Ordered;
6+
import org.springframework.core.annotation.Order;
7+
import org.springframework.http.HttpStatus;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.ExceptionHandler;
10+
import org.springframework.web.bind.annotation.RestControllerAdvice;
11+
import org.springframework.web.server.ServerWebExchange;
12+
13+
import java.util.Map;
14+
15+
@RestControllerAdvice
16+
@Slf4j
17+
@Order(Ordered.HIGHEST_PRECEDENCE)
18+
public class ServiceExceptionHandler {
19+
private final ErrorManager errorManager;
20+
private final Map<Class<? extends ServiceException>, HttpStatus> transcodeMap;
21+
22+
public ServiceExceptionHandler(ErrorManager errorManager, Map<Class<? extends ServiceException>, HttpStatus> transcodeMap) {
23+
this.errorManager = errorManager;
24+
this.transcodeMap = transcodeMap;
25+
}
26+
27+
@ExceptionHandler(ServiceException.class)
28+
protected ResponseEntity<ErrorDTO> handleException(ServiceException error, ServerWebExchange request) {
29+
return errorManager.handleException(transcodeException(error), request);
30+
}
31+
32+
private ClientException transcodeException(ServiceException error) {
33+
HttpStatus httpStatus = transcodeMap.get(error.getClass());
34+
35+
if (httpStatus == null) {
36+
log.warn("Unhandled exception: {}", error.getClass().getName());
37+
httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;
38+
}
39+
40+
return new ClientExceptionWithBody(httpStatus, error.getCode(), error.getMessage(), error.isPrintStackTrace(), error);
41+
}
42+
}

src/main/java/it/gov/pagopa/idpay/transactions/IdpayTransactionsApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.cache.annotation.EnableCaching;
56

67
@SpringBootApplication(scanBasePackages = "it.gov.pagopa")
8+
@EnableCaching
79
public class IdpayTransactionsApplication {
810

911
public static void main(String[] args) {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package it.gov.pagopa.idpay.transactions.config;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import it.gov.pagopa.idpay.transactions.connector.rest.dto.PointOfSaleDTO;
5+
import java.time.Duration;
6+
import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
import org.springframework.data.redis.cache.RedisCacheConfiguration;
10+
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
11+
import org.springframework.data.redis.serializer.RedisSerializationContext.SerializationPair;
12+
13+
@Configuration
14+
public class RedisConfig {
15+
@Bean
16+
public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {
17+
18+
ObjectMapper mapper = new ObjectMapper();
19+
mapper.findAndRegisterModules();
20+
21+
Jackson2JsonRedisSerializer<PointOfSaleDTO> serializer = new Jackson2JsonRedisSerializer<>(mapper, PointOfSaleDTO.class);
22+
23+
return builder -> builder
24+
.withCacheConfiguration("getPointOfSale",
25+
RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofDays(1))
26+
.serializeValuesWith(
27+
SerializationPair.fromSerializer(serializer)));
28+
}
29+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package it.gov.pagopa.idpay.transactions.config;
2+
3+
import it.gov.pagopa.common.web.exception.RewardBatchNotFound;
4+
import it.gov.pagopa.common.web.exception.ServiceException;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.http.HttpStatus;
8+
9+
import java.util.HashMap;
10+
import java.util.Map;
11+
12+
@Configuration
13+
public class ServiceExceptionConfig {
14+
@Bean
15+
public Map<Class<? extends ServiceException>, HttpStatus> serviceExceptionMapper() {
16+
Map<Class<? extends ServiceException>, HttpStatus> exceptionMap = new HashMap<>();
17+
18+
// BadRequest
19+
exceptionMap.put(RewardBatchNotFound.class, HttpStatus.BAD_REQUEST);
20+
21+
return exceptionMap;
22+
}
23+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package it.gov.pagopa.idpay.transactions.connector.rest;
2+
3+
import it.gov.pagopa.idpay.transactions.connector.rest.dto.PointOfSaleDTO;
4+
import reactor.core.publisher.Mono;
5+
6+
public interface MerchantRestClient {
7+
8+
Mono<PointOfSaleDTO> getPointOfSale(String merchantId, String pointOfSaleId);
9+
10+
}

0 commit comments

Comments
 (0)