Skip to content

Commit d4df49f

Browse files
committed
update for better usage
1 parent c1affa7 commit d4df49f

21 files changed

Lines changed: 483 additions & 191 deletions

pom.xml

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
<properties>
1919
<java.version>17</java.version>
20+
<mapstruct.version>1.5.3.Final</mapstruct.version>
2021
</properties>
2122

2223
<dependencies>
@@ -51,25 +52,79 @@
5152
<artifactId>spring-boot-configuration-processor</artifactId>
5253
<optional>true</optional>
5354
</dependency>
55+
<dependency>
56+
<groupId>org.mapstruct</groupId>
57+
<artifactId>mapstruct</artifactId>
58+
<version>${mapstruct.version}</version>
59+
</dependency>
5460
</dependencies>
5561

56-
<!--<build>
62+
<build>
5763
<plugins>
5864
<plugin>
59-
<groupId>com.github.spotbugs</groupId>
60-
<artifactId>spotbugs-maven-plugin</artifactId>
61-
<version>4.5.2.0</version>
65+
<groupId>org.apache.maven.plugins</groupId>
66+
<artifactId>maven-compiler-plugin</artifactId>
67+
<version>3.11.0</version>
68+
<configuration>
69+
<source>${java.version}</source>
70+
<target>${java.version}</target>
71+
<annotationProcessorPaths>
72+
<path>
73+
<groupId>org.mapstruct</groupId>
74+
<artifactId>mapstruct-processor</artifactId>
75+
<version>${mapstruct.version}</version>
76+
</path>
77+
<path>
78+
<groupId>org.projectlombok</groupId>
79+
<artifactId>lombok</artifactId>
80+
<version>${lombok.version}</version>
81+
</path>
82+
<path>
83+
<groupId>org.projectlombok</groupId>
84+
<artifactId>lombok-mapstruct-binding</artifactId>
85+
<version>0.2.0</version>
86+
</path>
87+
</annotationProcessorPaths>
88+
<compilerArgs>
89+
<arg>-Amapstruct.defaultComponentModel=spring</arg>
90+
<arg>-Amapstruct.unmappedTargetPolicy=ERROR</arg>
91+
</compilerArgs>
92+
</configuration>
93+
</plugin>
94+
<plugin>
95+
<groupId>org.apache.maven.plugins</groupId>
96+
<artifactId>maven-checkstyle-plugin</artifactId>
97+
<version>3.2.1</version>
98+
<configuration>
99+
<configLocation>checkstyle.xml</configLocation>
100+
<suppressionsFileExpression>
101+
checkstyle-suppressions.xml
102+
</suppressionsFileExpression>
103+
<includeTestSourceDirectory>true</includeTestSourceDirectory>
104+
<!--<encoding>UTF-8</encoding>-->
105+
<consoleOutput>true</consoleOutput>
106+
<failsOnError>true</failsOnError>
107+
<linkXRef>false</linkXRef>
108+
</configuration>
109+
<executions>
110+
<execution>
111+
<id>validate</id>
112+
<phase>validate</phase>
113+
<goals>
114+
<goal>check</goal>
115+
</goals>
116+
</execution>
117+
</executions>
62118
<dependencies>
63-
&lt;!&ndash; overwrite dependency on spotbugs if you want to specify the version of spotbugs &ndash;&gt;
64119
<dependency>
65-
<groupId>com.github.spotbugs</groupId>
66-
<artifactId>spotbugs</artifactId>
67-
<version>4.5.3</version>
120+
<groupId>com.puppycrawl.tools</groupId>
121+
<artifactId>checkstyle</artifactId>
122+
<version>10.3.4</version>
68123
</dependency>
69124
</dependencies>
70125
</plugin>
71126
</plugins>
72-
</build>-->
127+
</build>
73128

74129
<distributionManagement>
75130
<repository>

readme.md

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,27 @@ If you want to receive a report after each run of the scheduler, create a Bean i
5858

5959
### Configuration
6060

61-
You will have to enable `EntityScanning` for the package as well as your main package. You must also add it to the base packages for Spring to scan.
61+
To enable this service just add `@EnableEmailService` to your main class. You must also enable `@EnableScheduling` to allow the email queue to be processed.
6262

6363
```java
64-
@SpringBootApplication(scanBasePackages = {"the.main.package", "it.aboutbits.springboot.emailservice"})
65-
@EntityScan({"the.main.package", "it.aboutbits.springboot.emailservice"})
64+
65+
@SpringBootApplication
66+
@EnableEmailService
67+
@EnableScheduling
68+
public class App {
69+
public static void main(final String[] args) {
70+
SpringApplication.run(App.class, args);
71+
}
72+
}
6673
```
6774

6875
The following configuration options are available:
6976

70-
| Name | Default | Description |
71-
|--------------------------------------------|-------------|-------------------------------------------------------------------------|
72-
| `lib.emailservice.scheduling.enabled` | true | Enables the scheduler sending the emails. |
73-
| `lib.emailservice.scheduling.interval` | 30000 | Specifies the milliseconds delay between runs of the scheduler. |
77+
| Name | Default | Description |
78+
|--------------------------------------------|-------------|--------------------------------------------------------------------------------------------------------------------------|
79+
| `lib.emailservice.liquibase.enabled` | true | Enables liquibase migrations. **attention** `classpath:db/changelog/master.yml` will be run first and must be present! |
80+
| `lib.emailservice.scheduling.enabled` | true | Enables the scheduler sending the emails. |
81+
| `lib.emailservice.scheduling.interval` | 30000 | Specifies the milliseconds delay between runs of the scheduler. |
7482

7583
## Building and releasing a new version:
7684

src/main/java/it/aboutbits/springboot/emailservice/EmailServiceAutoConfiguration.java renamed to src/main/java/it/aboutbits/springboot/emailservice/EmailServiceConfiguration.java

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,48 +2,56 @@
22

33
import it.aboutbits.springboot.emailservice.lib.AttachmentDataSource;
44
import it.aboutbits.springboot.emailservice.lib.EmailSchedulerCallback;
5+
import it.aboutbits.springboot.emailservice.lib.application.EmailAttachmentMapper;
6+
import it.aboutbits.springboot.emailservice.lib.application.EmailAttachmentMapperImpl;
7+
import it.aboutbits.springboot.emailservice.lib.application.EmailMapper;
8+
import it.aboutbits.springboot.emailservice.lib.application.EmailMapperImpl;
59
import it.aboutbits.springboot.emailservice.lib.application.ManageEmail;
610
import it.aboutbits.springboot.emailservice.lib.application.QueryEmail;
711
import it.aboutbits.springboot.emailservice.lib.application.SendScheduledEmails;
812
import it.aboutbits.springboot.emailservice.lib.application.UnavailableAttachmentDataSource;
913
import it.aboutbits.springboot.emailservice.lib.jpa.EmailRepository;
1014
import jakarta.persistence.EntityManager;
1115
import liquibase.integration.spring.SpringLiquibase;
16+
import org.springframework.boot.autoconfigure.AutoConfigurationPackage;
1217
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1318
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1419
import org.springframework.context.annotation.Bean;
15-
import org.springframework.context.annotation.Configuration;
16-
import org.springframework.data.jpa.repository.support.JpaRepositoryFactory;
1720
import org.springframework.mail.javamail.JavaMailSender;
1821

1922
import javax.sql.DataSource;
2023
import java.util.List;
2124

22-
@Configuration
23-
public class EmailServiceAutoConfiguration {
24-
@Bean(name = "emailServiceLiquibase")
25-
public SpringLiquibase emailServiceLiquibase(DataSource dataSource) {
25+
@AutoConfigurationPackage
26+
public class EmailServiceConfiguration {
27+
@Bean
28+
@ConditionalOnProperty(value = "lib.emailservice.liquibase.enabled", matchIfMissing = true)
29+
public SpringLiquibase springLiquibase(DataSource dataSource) {
2630
var liquibase = new SpringLiquibase();
2731
liquibase.setDataSource(dataSource);
28-
liquibase.setChangeLog("classpath:/db/changelog/emailservice/main.xml");
32+
liquibase.setChangeLog("classpath:/db/changelog/emailservice/main.yml");
2933
liquibase.setShouldRun(true);
3034
return liquibase;
3135
}
3236

3337
@Bean
34-
public EmailRepository emailRepository(EntityManager entityManager) {
35-
var factory = new JpaRepositoryFactory(entityManager);
36-
return factory.getRepository(EmailRepository.class);
38+
public EmailAttachmentMapper emailAttachmentMapper() {
39+
return new EmailAttachmentMapperImpl();
40+
}
41+
42+
@Bean
43+
public EmailMapper emailMapper() {
44+
return new EmailMapperImpl();
3745
}
3846

3947
@Bean
40-
public QueryEmail queryEmail(EmailRepository emailRepository) {
41-
return new QueryEmail(emailRepository);
48+
public QueryEmail queryEmail(EmailRepository emailRepository, EmailMapper emailMapper, EntityManager entityManager) {
49+
return new QueryEmail(emailRepository, emailMapper, entityManager);
4250
}
4351

4452
@Bean
45-
public ManageEmail manageEmail(EmailRepository emailRepository, JavaMailSender javaMailSender, AttachmentDataSource attachmentDataSource) {
46-
return new ManageEmail(emailRepository, javaMailSender, attachmentDataSource);
53+
public ManageEmail manageEmail(EmailRepository emailRepository, JavaMailSender javaMailSender, AttachmentDataSource attachmentDataSource, EmailMapper emailMapper) {
54+
return new ManageEmail(emailRepository, javaMailSender, attachmentDataSource, emailMapper);
4755
}
4856

4957
@Bean
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package it.aboutbits.springboot.emailservice;
2+
3+
import org.springframework.context.annotation.Import;
4+
5+
import java.lang.annotation.ElementType;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
@Target({ElementType.TYPE})
11+
@Retention(RetentionPolicy.RUNTIME)
12+
@Import({EmailServiceConfiguration.class})
13+
public @interface EnableEmailService {
14+
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package it.aboutbits.springboot.emailservice.lib;
22

3+
import it.aboutbits.springboot.emailservice.lib.exception.AttachmentException;
4+
35
import java.io.InputStream;
46

57
public interface AttachmentDataSource {
6-
InputStream getAttachmentPayload(String reference);
8+
InputStream getAttachmentPayload(String reference) throws AttachmentException;
79

8-
void releaseAttachment(String reference);
10+
void releaseAttachment(String reference) throws AttachmentException;
911
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package it.aboutbits.springboot.emailservice.lib;
2+
3+
import it.aboutbits.springboot.emailservice.lib.model.Email;
4+
5+
public record EmailAttachmentDto(
6+
long id,
7+
8+
Email email,
9+
10+
String fileName,
11+
12+
String contentType,
13+
14+
String reference
15+
) {
16+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package it.aboutbits.springboot.emailservice.lib;
2+
3+
import java.time.OffsetDateTime;
4+
import java.util.List;
5+
import java.util.Set;
6+
7+
public record EmailDto(
8+
long id,
9+
10+
EmailState state,
11+
12+
String subject,
13+
14+
String fromAddress,
15+
String fromName,
16+
17+
List<String> recipients,
18+
19+
String textBody,
20+
String htmlBody,
21+
22+
Set<EmailAttachmentDto> attachments,
23+
24+
String reference,
25+
26+
OffsetDateTime sendingScheduledAt,
27+
OffsetDateTime sentAt,
28+
29+
OffsetDateTime errorAt,
30+
String errorMessage,
31+
32+
OffsetDateTime createdAt,
33+
OffsetDateTime updatedAt
34+
) {
35+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package it.aboutbits.springboot.emailservice.lib.application;
2+
3+
import it.aboutbits.springboot.emailservice.lib.EmailAttachmentDto;
4+
import it.aboutbits.springboot.emailservice.lib.model.EmailAttachment;
5+
import org.mapstruct.Mapper;
6+
7+
import java.util.List;
8+
9+
@Mapper
10+
public interface EmailAttachmentMapper {
11+
EmailAttachmentDto toDto(EmailAttachment model);
12+
13+
List<EmailAttachmentDto> toDto(List<EmailAttachment> model);
14+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package it.aboutbits.springboot.emailservice.lib.application;
2+
3+
import it.aboutbits.springboot.emailservice.lib.EmailDto;
4+
import it.aboutbits.springboot.emailservice.lib.model.Email;
5+
import org.mapstruct.Mapper;
6+
import org.springframework.data.domain.Page;
7+
import org.springframework.data.domain.PageImpl;
8+
9+
import java.util.List;
10+
11+
@Mapper(uses = EmailAttachmentMapper.class)
12+
public interface EmailMapper {
13+
EmailDto toDto(Email model);
14+
15+
List<EmailDto> toDto(List<Email> model);
16+
17+
default Page<EmailDto> toDto(Page<Email> model) {
18+
return new PageImpl<>(
19+
toDto(model.getContent()),
20+
model.getPageable(),
21+
model.getTotalElements()
22+
);
23+
}
24+
}

0 commit comments

Comments
 (0)