001package ca.uhn.fhir.jpa.subscription.match.deliver.email; 002 003/*- 004 * #%L 005 * HAPI FHIR Subscription Server 006 * %% 007 * Copyright (C) 2014 - 2022 Smile CDR, Inc. 008 * %% 009 * Licensed under the Apache License, Version 2.0 (the "License"); 010 * you may not use this file except in compliance with the License. 011 * You may obtain a copy of the License at 012 * 013 * http://www.apache.org/licenses/LICENSE-2.0 014 * 015 * Unless required by applicable law or agreed to in writing, software 016 * distributed under the License is distributed on an "AS IS" BASIS, 017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 018 * See the License for the specific language governing permissions and 019 * limitations under the License. 020 * #L% 021 */ 022 023import ca.uhn.fhir.i18n.Msg; 024import ca.uhn.fhir.rest.server.exceptions.InternalErrorException; 025import org.apache.commons.lang3.StringUtils; 026import org.hl7.fhir.instance.model.api.IIdType; 027import org.simplejavamail.api.email.Email; 028import org.simplejavamail.email.EmailBuilder; 029import org.thymeleaf.context.Context; 030import org.thymeleaf.spring5.SpringTemplateEngine; 031import org.thymeleaf.spring5.dialect.SpringStandardDialect; 032import org.thymeleaf.templatemode.TemplateMode; 033import org.thymeleaf.templateresolver.StringTemplateResolver; 034 035import javax.annotation.Nonnull; 036import java.util.List; 037import java.util.stream.Collectors; 038 039public class EmailDetails { 040 private final SpringTemplateEngine myTemplateEngine; 041 private final Context myContext; 042 043 private String mySubjectTemplate; 044 private String myBodyTemplate; 045 private List<String> myTo; 046 private String myFrom; 047 private IIdType mySubscription; 048 049 public EmailDetails() { 050 myTemplateEngine = makeTemplateEngine(); 051 myContext = new Context(); 052 } 053 054 public String getBody() { 055 return myTemplateEngine.process(myBodyTemplate, myContext); 056 } 057 058 public void setBodyTemplate(String theBodyTemplate) { 059 myBodyTemplate = theBodyTemplate; 060 } 061 062 public String getFrom() { 063 return StringUtils.trim(myFrom); 064 } 065 066 public void setFrom(String theFrom) { 067 myFrom = theFrom; 068 } 069 070 public String getSubject() { 071 return myTemplateEngine.process(mySubjectTemplate, myContext); 072 } 073 074 public void setSubjectTemplate(String theSubjectTemplate) { 075 mySubjectTemplate = theSubjectTemplate; 076 } 077 078 public String getSubscriptionId() { 079 return mySubscription.toUnqualifiedVersionless().getValue(); 080 } 081 082 public void setSubscription(IIdType theSubscription) { 083 mySubscription = theSubscription; 084 } 085 086 public String getTo() { 087 return myTo.stream().filter(StringUtils::isNotBlank).collect(Collectors.joining(",")); 088 } 089 090 public void setTo(List<String> theTo) { 091 myTo = theTo; 092 } 093 094 public Email toEmail() { 095 try { 096 return EmailBuilder.startingBlank() 097 .from(getFrom()) 098 .to(getTo()) 099 .withSubject(getSubject()) 100 .withPlainText(getBody()) 101 .withHeader("X-FHIR-Subscription", getSubscriptionId()) 102 .buildEmail(); 103 } catch (IllegalArgumentException e) { 104 throw new InternalErrorException(Msg.code(3) + "Failed to create email message", e); 105 } 106 } 107 108 @Nonnull 109 private SpringTemplateEngine makeTemplateEngine() { 110 StringTemplateResolver stringTemplateResolver = new StringTemplateResolver(); 111 stringTemplateResolver.setTemplateMode(TemplateMode.TEXT); 112 113 SpringStandardDialect springStandardDialect = new SpringStandardDialect(); 114 springStandardDialect.setEnableSpringELCompiler(true); 115 116 SpringTemplateEngine springTemplateEngine = new SpringTemplateEngine(); 117 springTemplateEngine.setDialect(springStandardDialect); 118 springTemplateEngine.setEnableSpringELCompiler(true); 119 springTemplateEngine.setTemplateResolver(stringTemplateResolver); 120 121 return springTemplateEngine; 122 } 123 124}