Skip to content

Commit

Permalink
added connector,modified model,dto,mapper,repository, added pattern o…
Browse files Browse the repository at this point in the history
…n controller
  • Loading branch information
DanieleRanaldo committed Oct 30, 2024
1 parent 3aed12c commit ff16d30
Show file tree
Hide file tree
Showing 26 changed files with 562 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@ public ExceptionMap() {
message
)
);

exceptions.put(CitizenConstants.ExceptionName.TPP_NOT_FOUND, message ->
new ClientExceptionWithBody(
HttpStatus.NOT_FOUND,
CitizenConstants.ExceptionCode.TPP_NOT_FOUND,
message
)
);
}

public RuntimeException throwException(String exceptionKey, String message) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package it.gov.pagopa.onboarding.citizen.connector.tpp;

import it.gov.pagopa.onboarding.citizen.dto.TppDTO;
import reactor.core.publisher.Mono;

public interface TppConnector {
Mono<TppDTO> get(String tppId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package it.gov.pagopa.onboarding.citizen.connector.tpp;

import it.gov.pagopa.onboarding.citizen.dto.TppDTO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

@Service
public class TppConnectorImpl implements TppConnector {
private final WebClient webClient;

public TppConnectorImpl(WebClient.Builder webClientBuilder,
@Value("${rest-client.tpp.baseUrl}") String baseUrl) {
this.webClient = webClientBuilder.baseUrl(baseUrl).build();
}

@Override
public Mono<TppDTO> get(String tppId) {
return webClient.get()
.uri("/emd/tpp/" + tppId)
.retrieve()
.bodyToMono(new ParameterizedTypeReference<>() {
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ public static final class ExceptionCode {

public static final String CITIZEN_NOT_ONBOARDED = "CITIZEN_NOT_ONBOARDED";
public static final String GENERIC_ERROR = "GENERIC_ERROR";
public static final String TPP_NOT_FOUND = "TPP_NOT_FOUND";

private ExceptionCode() {}
}

Expand All @@ -19,9 +21,18 @@ public static final class ExceptionName {

public static final String CITIZEN_NOT_ONBOARDED = "CITIZEN_NOT_ONBOARDED";
public static final String GENERIC_ERROR = "GENERIC_ERROR";
public static final String TPP_NOT_FOUND = "TPP_NOT_FOUND";

private ExceptionName() {}
}

public static final class ValidationRegex {

public static final String FISCAL_CODE_STRUCTURE_REGEX = "(^([A-Za-z]{6}[0-9lmnpqrstuvLMNPQRSTUV]{2}[abcdehlmprstABCDEHLMPRST][0-9lmnpqrstuvLMNPQRSTUV]{2}[A-Za-z][0-9lmnpqrstuvLMNPQRSTUV]{3}[A-Za-z])$)|(^(\\d{11})$)";

private ValidationRegex() {}
}


private CitizenConstants() {}
}
Original file line number Diff line number Diff line change
@@ -1,30 +1,25 @@
package it.gov.pagopa.onboarding.citizen.controller;

import it.gov.pagopa.onboarding.citizen.dto.CitizenConsentDTO;
import it.gov.pagopa.onboarding.citizen.dto.CitizenConsentStateUpdateDTO;
import jakarta.validation.Valid;

import jakarta.validation.constraints.Pattern;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;

import java.util.List;

import static it.gov.pagopa.onboarding.citizen.constants.CitizenConstants.ValidationRegex.FISCAL_CODE_STRUCTURE_REGEX;


@RequestMapping("/emd/citizen")
public interface CitizenController {

@PostMapping("")
Mono<ResponseEntity<CitizenConsentDTO>> saveCitizenConsent(@Valid @RequestBody CitizenConsentDTO citizenConsentDTO);

/**
* Update the state of a citizen's consent.
*
* @param citizenConsentDTO contains the hashedFiscalCode, channelId, and channelState to update
* @return the updated citizen consents
*/
@PutMapping("/stateUpdate")
Mono<ResponseEntity<CitizenConsentDTO>> stateUpdate(@Valid @RequestBody CitizenConsentDTO citizenConsentDTO);

/**
* Get the consent status for a specific citizen and channel.
*
Expand All @@ -33,7 +28,16 @@ public interface CitizenController {
* @return the citizen consent status
*/
@GetMapping("/{fiscalCode}/{tppId}")
Mono<ResponseEntity<CitizenConsentDTO>> getConsentStatus(@PathVariable String fiscalCode, @PathVariable String tppId);
Mono<ResponseEntity<CitizenConsentDTO>> getConsentStatus(@PathVariable @Pattern(regexp = FISCAL_CODE_STRUCTURE_REGEX, message = "Invalid fiscal code format") String fiscalCode, @PathVariable String tppId);

/**
* Update the state of a citizen's consent.
*
* @param citizenConsentStateUpdateDTO contains the hashedFiscalCode, channelId, and channelState to update
* @return the updated citizen consents
*/
@PutMapping("/stateUpdate")
Mono<ResponseEntity<CitizenConsentDTO>> stateUpdate(@Valid @RequestBody CitizenConsentStateUpdateDTO citizenConsentStateUpdateDTO);

/**
* List all channels with enabled consents for a specific citizen.
Expand All @@ -42,7 +46,7 @@ public interface CitizenController {
* @return a list of channels with enabled consents
*/
@GetMapping("/list/{fiscalCode}/enabled")
Mono<ResponseEntity<List<CitizenConsentDTO>>> getCitizenConsentsEnabled(@PathVariable String fiscalCode);
Mono<ResponseEntity<List<CitizenConsentDTO>>> getCitizenConsentsEnabled(@PathVariable @Pattern(regexp = FISCAL_CODE_STRUCTURE_REGEX, message = "Invalid fiscal code format") String fiscalCode);

/**
* List all channels and their consent status for a specific citizen.
Expand All @@ -51,6 +55,6 @@ public interface CitizenController {
* @return a list of all channels with their consent statuses
*/
@GetMapping("/list/{fiscalCode}")
Mono<ResponseEntity<List<CitizenConsentDTO>>> getCitizenConsents(@PathVariable String fiscalCode);
Mono<ResponseEntity<List<CitizenConsentDTO>>> getCitizenConsents(@PathVariable @Pattern(regexp = FISCAL_CODE_STRUCTURE_REGEX, message = "Invalid fiscal code format") String fiscalCode);

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package it.gov.pagopa.onboarding.citizen.controller;

import it.gov.pagopa.onboarding.citizen.dto.CitizenConsentDTO;
import it.gov.pagopa.onboarding.citizen.dto.CitizenConsentStateUpdateDTO;
import it.gov.pagopa.onboarding.citizen.service.CitizenServiceImpl;
import jakarta.validation.Valid;
import org.springframework.http.ResponseEntity;
Expand All @@ -25,11 +26,11 @@ public Mono<ResponseEntity<CitizenConsentDTO>> saveCitizenConsent(@Valid Citizen
}

@Override
public Mono<ResponseEntity<CitizenConsentDTO>> stateUpdate(@Valid CitizenConsentDTO citizenConsentDTO) {
public Mono<ResponseEntity<CitizenConsentDTO>> stateUpdate(@Valid CitizenConsentStateUpdateDTO citizenConsentStateUpdateDTO) {
return citizenService.updateChannelState(
citizenConsentDTO.getHashedFiscalCode(), //at this stage the fiscalCode has not yet been hashed
citizenConsentDTO.getTppId(),
citizenConsentDTO.getTppState())
citizenConsentStateUpdateDTO.getHashedFiscalCode(),
citizenConsentStateUpdateDTO.getTppId(),
citizenConsentStateUpdateDTO.getTppState())
.map(ResponseEntity::ok);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import lombok.experimental.SuperBuilder;

import java.time.LocalDateTime;
import java.util.Map;

@Data
@SuperBuilder
Expand All @@ -15,8 +16,16 @@
public class CitizenConsentDTO {
@JsonAlias("fiscalCode")
private String hashedFiscalCode;
private String tppId;
private Boolean tppState;
private LocalDateTime creationDate;
private LocalDateTime lastUpdateDate;
private Map<String, ConsentDTO> consents;

@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public static class ConsentDTO {
private Boolean tc;
private Boolean tppState;
private LocalDateTime creationDate;
private LocalDateTime lastUpdateDate;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package it.gov.pagopa.onboarding.citizen.dto;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.experimental.SuperBuilder;

@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class CitizenConsentStateUpdateDTO {
private String hashedFiscalCode;
private String tppId;
private Boolean tppState;
}
15 changes: 15 additions & 0 deletions src/main/java/it/gov/pagopa/onboarding/citizen/dto/Contact.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package it.gov.pagopa.onboarding.citizen.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Contact {

private String name;
private String number;
private String email;
}
26 changes: 26 additions & 0 deletions src/main/java/it/gov/pagopa/onboarding/citizen/dto/TppDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package it.gov.pagopa.onboarding.citizen.dto;


import it.gov.pagopa.onboarding.citizen.enums.AuthenticationType;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

@Data
@SuperBuilder
@NoArgsConstructor
public class TppDTO {
@NotNull
private String tppId;
private String entityId;
private String businessName;
private String messageUrl;
private String authenticationUrl;
private AuthenticationType authenticationType;
private Contact contact;
private Boolean state;



}
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
package it.gov.pagopa.onboarding.citizen.dto.mapper;


import it.gov.pagopa.onboarding.citizen.dto.CitizenConsentDTO;
import it.gov.pagopa.onboarding.citizen.dto.CitizenConsentDTO.ConsentDTO;
import it.gov.pagopa.onboarding.citizen.model.CitizenConsent;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class CitizenConsentObjectToDTOMapper {

public CitizenConsentDTO map(CitizenConsent citizenConsent){
public CitizenConsentDTO map(CitizenConsent citizenConsent) {
Map<String, ConsentDTO> consentsDTO = new HashMap<>();

citizenConsent.getConsents().forEach((tppId, consentDetails) -> consentsDTO.put(tppId, ConsentDTO.builder()
.tc(consentDetails.getTc())
.tppState(consentDetails.getTppState())
.creationDate(consentDetails.getCreationDate())
.lastUpdateDate(consentDetails.getLastUpdateDate())
.build()));

return CitizenConsentDTO.builder()
.hashedFiscalCode(citizenConsent.getHashedFiscalCode())
.tppState(citizenConsent.getTppState())
.tppId(citizenConsent.getTppId())
.creationDate(citizenConsent.getCreationDate())
.lastUpdateDate(citizenConsent.getLastUpdateDate())
.consents(consentsDTO)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package it.gov.pagopa.onboarding.citizen.enums;

import lombok.Getter;

@Getter
public enum AuthenticationType {
OAUTH2("OAUTH2");


private final String status;

AuthenticationType(String status) {
this.status = status;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import lombok.experimental.SuperBuilder;
import org.springframework.data.mongodb.core.mapping.Document;

import java.time.LocalDateTime;
import java.util.Map;

@Document(collection = "citizen_consents")
@Data
Expand All @@ -15,9 +15,7 @@ public class CitizenConsent {

private String id;
private String hashedFiscalCode;
private String tppId;
private Boolean tppState;
private LocalDateTime creationDate;
private LocalDateTime lastUpdateDate;
private Map<String, ConsentDetails> consents;

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package it.gov.pagopa.onboarding.citizen.model;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import java.time.LocalDateTime;

@Data
@NoArgsConstructor
@SuperBuilder
public class ConsentDetails {
private Boolean tc;
private Boolean tppState;
private LocalDateTime creationDate;
private LocalDateTime lastTcUpdateDate;
private LocalDateTime lastUpdateDate;
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,29 @@
package it.gov.pagopa.onboarding.citizen.model.mapper;


import it.gov.pagopa.onboarding.citizen.dto.CitizenConsentDTO;
import it.gov.pagopa.onboarding.citizen.model.CitizenConsent;
import it.gov.pagopa.onboarding.citizen.model.ConsentDetails;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class CitizenConsentDTOToObjectMapper {

public CitizenConsent map(CitizenConsentDTO citizenConsentDTO){
public CitizenConsent map(CitizenConsentDTO citizenConsentDTO) {
Map<String, ConsentDetails> consents = new HashMap<>();

citizenConsentDTO.getConsents().forEach((tppId, consentDTO) -> consents.put(tppId, ConsentDetails.builder()
.tc(consentDTO.getTc())
.tppState(consentDTO.getTppState())
.creationDate(consentDTO.getCreationDate())
.lastTcUpdateDate(consentDTO.getLastUpdateDate())
.build()));

return CitizenConsent.builder()
.tppState(true)
.tppId(citizenConsentDTO.getTppId())
.hashedFiscalCode(citizenConsentDTO.getHashedFiscalCode())
.consents(consents)
.build();
}
}
Loading

0 comments on commit ff16d30

Please sign in to comment.