use of se.inera.intyg.webcert.common.service.exception.WebCertServiceException in project webcert by sklintyg.
the class IntygServiceImpl method getIntygData.
/**
* Builds a IntygContentHolder by first trying to get the Intyg from intygstjansten. If
* not found or the Intygstjanst couldn't be reached, the local Utkast - if available -
* will be used instead.
* <p>
* Note that even when found, we check if we need to decorate the response with data from the utkast in order
* to mitigate async send states. (E.g. a send may be in resend due to 3rd party issues, in that case decorate with
* data about sent state from the Utkast)
*
* @param relations
*/
private IntygContentHolder getIntygData(String intygId, String typ, boolean relations) {
try {
CertificateResponse certificate = modelFacade.getCertificate(intygId, typ);
String internalIntygJsonModel = certificate.getInternalModel();
final Personnummer personId = certificate.getUtlatande().getGrundData().getPatient().getPersonId();
// INTYG-4086: Patient object populated according to ruleset for the intygstyp at hand.
// Since an FK-intyg never will have anything other than personId, try to fetch all using ruleset
Patient newPatientData = patientDetailsResolver.resolvePatient(personId, typ);
Utlatande utlatande = null;
boolean patientNameChanged = false;
boolean patientAddressChanged = false;
try {
utlatande = moduleRegistry.getModuleApi(typ).getUtlatandeFromJson(internalIntygJsonModel);
patientNameChanged = patientDetailsResolver.isPatientNamedChanged(utlatande.getGrundData().getPatient(), newPatientData);
patientAddressChanged = patientDetailsResolver.isPatientAddressChanged(utlatande.getGrundData().getPatient(), newPatientData);
} catch (IOException e) {
LOG.error("Failed to getUtlatandeFromJson intygsId {} while checking for updated patient information", intygId);
}
// parameters were available.
if (newPatientData != null) {
// Get the module api and use the "updateBeforeSave" to update the outbound "model" with the
// Patient object.
ModuleApi moduleApi = moduleRegistry.getModuleApi(typ);
// INTYG-5354, INTYG-5380: Don't use incomplete address from external data sources (PU/js).
if (!completeAddressProvided(newPatientData)) {
// Use the old address data.
Patient oldPatientData = utlatande.getGrundData().getPatient();
copyOldAddressToNewPatientData(oldPatientData, newPatientData);
}
internalIntygJsonModel = moduleApi.updateBeforeSave(internalIntygJsonModel, newPatientData);
}
utkastIntygDecorator.decorateWithUtkastStatus(certificate);
Relations certificateRelations = intygRelationHelper.getRelationsForIntyg(intygId);
final SekretessStatus sekretessStatus = patientDetailsResolver.getSekretessStatus(personId);
if (SekretessStatus.UNDEFINED.equals(sekretessStatus)) {
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.PU_PROBLEM, "Sekretesstatus could not be fetched from the PU service");
}
final boolean sekretessmarkering = SekretessStatus.TRUE.equals(sekretessStatus);
Utkast utkast = utkastRepository.findOneByIntygsIdAndIntygsTyp(intygId, typ);
final LocalDateTime created = utkast != null ? utkast.getSkapad() : null;
return IntygContentHolder.builder().setContents(internalIntygJsonModel).setUtlatande(certificate.getUtlatande()).setStatuses(certificate.getMetaData().getStatus()).setRevoked(certificate.isRevoked()).setRelations(certificateRelations).setCreated(created).setDeceased(isDeceased(personId)).setSekretessmarkering(sekretessmarkering).setPatientNameChangedInPU(patientNameChanged).setPatientAddressChangedInPU(patientAddressChanged).build();
} catch (IntygModuleFacadeException me) {
// It's possible the Intygstjanst hasn't received the Intyg yet, look for it locally before rethrowing
// exception
Utkast utkast = utkastRepository.findOneByIntygsIdAndIntygsTyp(intygId, typ);
if (utkast == null) {
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.MODULE_PROBLEM, me);
}
return buildIntygContentHolderForUtkast(utkast, relations);
} catch (WebServiceException wse) {
// Something went wrong communication-wise, try to find a matching Utkast instead.
Utkast utkast = utkastRepository.findOneByIntygsIdAndIntygsTyp(intygId, typ);
if (utkast == null) {
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.DATA_NOT_FOUND, "Cannot get intyg. Intygstjansten was not reachable and the Utkast could " + "not be found, perhaps it was issued by a non-webcert system?");
}
return buildIntygContentHolderForUtkast(utkast, relations);
} catch (ModuleNotFoundException | ModuleException e) {
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.MODULE_PROBLEM, e);
}
}
use of se.inera.intyg.webcert.common.service.exception.WebCertServiceException in project webcert by sklintyg.
the class IntygServiceImpl method sendIntyg.
@Override
public IntygServiceResult sendIntyg(String intygsId, String typ, String recipient, boolean delay) {
Utlatande intyg = getUtlatandeForIntyg(intygsId, typ);
verifyEnhetsAuth(intyg, true);
if (isRevoked(intygsId, typ, false)) {
LOG.debug("Cannot send certificate with id '{}', the certificate is revoked", intygsId);
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.INVALID_STATE, "Certificate is revoked");
}
verifyNotReplacedBySignedIntyg(intygsId, "send");
// WC-US-SM-001 - vi får ej skicka FK-intyg för sekretessmarkerad patient som innehåller personuppgifter.
verifyNoExposureOfSekretessmarkeradPatient(intyg);
SendIntygConfiguration sendConfig = new SendIntygConfiguration(recipient, webCertUserService.getUser());
monitoringService.logIntygSent(intygsId, recipient);
// send PDL log event
LogRequest logRequest = LogRequestFactory.createLogRequestFromUtlatande(intyg);
logRequest.setAdditionalInfo(sendConfig.getPatientConsentMessage());
logService.logSendIntygToRecipient(logRequest);
markUtkastWithSendDateAndRecipient(intygsId, recipient);
return sendIntygToCertificateSender(sendConfig, intyg, delay);
}
use of se.inera.intyg.webcert.common.service.exception.WebCertServiceException in project webcert by sklintyg.
the class IntygServiceImpl method getIntygsTyp.
@Override
public String getIntygsTyp(String intygsId) {
GetCertificateTypeType requestType = new GetCertificateTypeType();
requestType.setIntygsId(intygsId);
try {
GetCertificateTypeResponseType responseType = getCertificateTypeService.getCertificateType(logicalAddress, requestType);
return responseType.getTyp().getCode();
} catch (WebCertServiceException e) {
LOG.error("Failed to decide on the type of certificate");
if (e.getErrorCode() == WebCertServiceErrorCodeEnum.DATA_NOT_FOUND) {
return null;
}
throw e;
}
}
use of se.inera.intyg.webcert.common.service.exception.WebCertServiceException in project webcert by sklintyg.
the class SignaturServiceImpl method clientNiasSignature.
@Override
public SignaturTicket clientNiasSignature(String ticketId, SignatureType signatureType, String niasCertificate, WebCertUser user) {
// Lookup signature ticket
SignaturTicket ticket = ticketTracker.getTicket(ticketId);
if (ticket == null) {
LOG.warn("Ticket '{}' hittades ej", ticketId);
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.INVALID_STATE, "Biljett " + ticketId + " hittades ej");
}
LOG.debug("Klientsignering ticket '{}' intyg '{}'", ticket.getId(), ticket.getIntygsId());
// Fetch the draft
Utkast utkast = getUtkastForSignering(ticket.getIntygsId(), ticket.getVersion(), user);
// Create and persist the new signature
StringWriter sw = new StringWriter();
JAXB.marshal(signatureType, sw);
String rawSignaturXml = sw.toString();
ticket = createAndPersistSignature(utkast, ticket, rawSignaturXml, user);
monitoringService.logIntygSigned(utkast.getIntygsId(), utkast.getIntygsTyp(), user.getHsaId(), user.getAuthenticationScheme(), utkast.getRelationKod());
// Notify stakeholders when certificate has been signed
notificationService.sendNotificationForDraftSigned(utkast);
LogRequest logRequest = LogRequestFactory.createLogRequestFromUtkast(utkast);
// Note that we explictly supplies the WebCertUser here. The NIAS finalization is not executed in a HTTP
// request context and thus we need to supply the user instance manually.
logService.logSignIntyg(logRequest, logService.getLogUser(user));
intygService.handleAfterSigned(utkast);
return ticketTracker.updateStatus(ticket.getId(), SignaturTicket.Status.SIGNERAD);
}
use of se.inera.intyg.webcert.common.service.exception.WebCertServiceException in project webcert by sklintyg.
the class SignaturServiceImpl method createDraftHash.
/**
* Called from the Controller when initiating a client (e.g. NetID) signature. Rewritten in INTYG-5048 so
* <i>starting</i> a signature process does NOT mutate the Utkast in any way. Instead, a temporary intyg JSON model
* including the signatureDate and signing identity is stored in a {@link PagaendeSignering} entity.
* <p>
* Once the signing has been completed
* (see {@link SignaturServiceImpl#createAndPersistSignature(Utkast, SignaturTicket, String, WebCertUser)}) the
* hash, intygsId and version from the JSON model in the PagaendeSignatur is validated and if everything works out,
* the final state is written to the Utkast table.
* <p>
* If the user for some reason failed to finish the signing (cancelled in NetID etc.), the Utkast table won't be
* affected or contain a signingDate even though it wasn't signed. A stale entry may remain in PAGAENDE_SIGNERING
* but since those cannot be reused such entries can remain there indefinitely or until cleaned up by a janitor
* task.
*
* @param intygId The id of the draft to generate signing ticket for
* @param version version
* @return
*/
@Override
@Transactional("jpaTransactionManager")
public SignaturTicket createDraftHash(String intygId, long version) {
LOG.debug("Hash for clientsignature of draft '{}'", intygId);
// Fetch Webcert user
WebCertUser user = getWebcertUserForSignering();
// Fetch the certificate draft
Utkast utkast = getUtkastForSignering(intygId, version, user);
LocalDateTime signeringstid = LocalDateTime.now();
try {
VardpersonReferens vardpersonReferens = UpdateUserUtil.createVardpersonFromWebCertUser(user);
ModuleApi moduleApi = moduleRegistry.getModuleApi(utkast.getIntygsTyp());
Vardenhet vardenhetFromJson = moduleApi.getUtlatandeFromJson(utkast.getModel()).getGrundData().getSkapadAv().getVardenhet();
String updatedInternal = moduleApi.updateBeforeSigning(utkast.getModel(), IntygConverterUtil.buildHosPersonalFromWebCertUser(user, vardenhetFromJson), signeringstid);
// Skapa ny PagaendeSignering
PagaendeSignering pagaendeSignering = new PagaendeSignering();
pagaendeSignering.setIntygData(updatedInternal);
pagaendeSignering.setIntygsId(utkast.getIntygsId());
pagaendeSignering.setSigneradAvHsaId(vardpersonReferens.getHsaId());
pagaendeSignering.setSigneradAvNamn(vardpersonReferens.getNamn());
pagaendeSignering.setSigneringsDatum(signeringstid);
pagaendeSignering = pagaendeSigneringRepository.save(pagaendeSignering);
return createSignaturTicket(utkast.getIntygsId(), pagaendeSignering.getInternReferens(), utkast.getVersion(), updatedInternal, signeringstid);
} catch (ModuleNotFoundException | IOException | ModuleException e) {
throw new WebCertServiceException(WebCertServiceErrorCodeEnum.INTERNAL_PROBLEM, "Unable to sign certificate: " + e.getMessage());
}
}
Aggregations