feat(email): integrate mailtrap provider#114
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 📝 WalkthroughWalkthroughAdds a pluggable email subsystem: provider interface and SES/Mailtrap implementations, Mailtrap SMTP configuration, AppProperties email settings and validation, spring mail dependency, EmailService refactor to use providers, new EmailSendingException and specific handler, and environment/property/docker-compose updates for Mailtrap. Changes
Sequence Diagram(s)sequenceDiagram
participant App as Application
participant EmailSvc as EmailService
participant Provider as EmailProvider
participant SES as AWS SES
participant SMTP as Mailtrap SMTP
App->>EmailSvc: request sendEmail(to, subject, template)
EmailSvc->>Provider: render template -> send(to, subject, body)
alt provider = ses
Provider->>SES: SendEmailRequest(source, dest, message)
SES-->>Provider: SendEmailResponse
else provider = mailtrap
Provider->>SMTP: SMTP connect/auth, send MIME HTML
SMTP-->>Provider: 250 OK / success
end
Provider-->>EmailSvc: success or throws EmailSendingException
EmailSvc-->>App: return or propagate exception
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)✅ Unit Test PR creation complete.
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary of ChangesHello @Cysteine12, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request significantly enhances the application's email sending capabilities by introducing a flexible, provider-agnostic architecture. It refactors the existing email service to utilize a strategy pattern, enabling seamless switching between different email providers. The initial implementation integrates Mailtrap as a new provider, alongside the existing AWS SES, and updates configuration files across the application to support this modular approach. Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
This pull request does an excellent job of refactoring the email sending functionality to support multiple providers using the Strategy pattern. The code is well-structured, with email-related components correctly moved to the infrastructure.email package. The use of @ConditionalOnProperty for provider selection is a good approach, and the configuration properties are well-organized and validated. I have a couple of minor suggestions to enhance error logging for better debuggability. Overall, this is a great architectural improvement.
...rc/main/java/org/eni/koinoniadaily/infrastructure/email/providers/MailtrapEmailProvider.java
Outdated
Show resolved
Hide resolved
server/src/main/java/org/eni/koinoniadaily/infrastructure/email/providers/SesEmailProvider.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 7
🧹 Nitpick comments (2)
server/docker-compose.yml (1)
17-19: Externalize Mailtrap SMTP host and port as environment variables for consistency.The Mailtrap host (
live.smtp.mailtrap.io) and port (587) are hardcoded inapplication.properties(lines 11-12), while other Mailtrap configuration like password, provider, and email-from are externalized as environment variables in production (application-prod.properties). Hardcoding these values forces code changes if endpoints differ between deployment environments. AddingAPP_MAILTRAP_HOSTandAPP_MAILTRAP_PORTto the docker-compose file keeps all environment configuration centralized, consistent with the existing pattern.♻️ Proposed addition
- APP_MAILTRAP_USERNAME=${APP_MAILTRAP_USERNAME} - APP_MAILTRAP_PASSWORD=${APP_MAILTRAP_PASSWORD} + - APP_MAILTRAP_HOST=${APP_MAILTRAP_HOST} + - APP_MAILTRAP_PORT=${APP_MAILTRAP_PORT}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@server/docker-compose.yml` around lines 17 - 19, The Mailtrap SMTP host and port are hardcoded in application.properties while other Mail settings are pulled from env vars; add APP_MAILTRAP_HOST and APP_MAILTRAP_PORT to the service environment block alongside APP_EMAIL_PROVIDER/APP_EMAIL_FROM/APP_MAILTRAP_PASSWORD in docker-compose.yml so these values are externalized, and update application.properties to reference ${APP_MAILTRAP_HOST} and ${APP_MAILTRAP_PORT} instead of the literal "live.smtp.mailtrap.io" and "587".server/src/main/java/org/eni/koinoniadaily/infrastructure/email/config/MailtrapConfig.java (1)
31-34:mail.debugis hardcoded andmail.smtp.starttls.requiredis absent.Two minor hardening notes:
mail.debug=falseis hardcoded — there's no way to enable verbose JavaMail tracing for dev debugging without a code change. Consider externalizing it:javaMailProperties.put("mail.debug", String.valueOf(props.getMailtrap().isDebug()));or simply bind it to a
spring.mail.debugcompatible property.
mail.smtp.starttls.requiredis not set —starttls.enable=trueoffers STARTTLS but doesn't enforce it; a MITM or misconfigured server could negotiate a plaintext session. For Mailtrap live SMTP (port 587), add:🔒 Proposed fix
javaMailProperties.put("mail.smtp.starttls.enable", "true"); +javaMailProperties.put("mail.smtp.starttls.required", "true"); javaMailProperties.put("mail.debug", "false");🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@server/src/main/java/org/eni/koinoniadaily/infrastructure/email/config/MailtrapConfig.java` around lines 31 - 34, In MailtrapConfig, externalize the hardcoded mail.debug and enforce STARTTLS: read the debug flag from the mail properties (e.g., props.getMailtrap().isDebug() or spring.mail.debug equivalent) and set javaMailProperties "mail.debug" using that value instead of "false"; additionally add the "mail.smtp.starttls.required" property (set to true for Mailtrap on 587) alongside "mail.smtp.starttls.enable" to require TLS negotiation. Update the javaMailProperties handling in the MailtrapConfig class so both "mail.debug" and "mail.smtp.starttls.required" are set from configuration/constant rather than hardcoded.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@server/docker-compose.yml`:
- Around line 17-19: Add the missing Mailtrap username env var: update
docker-compose.yml to expose APP_MAILTRAP_USERNAME as an environment variable
(e.g., add - APP_MAILTRAP_USERNAME=${APP_MAILTRAP_USERNAME}); remove the
hardcoded username in server/src/main/resources/application.properties (replace
app.mailtrap.username=api with a placeholder reference
app.mailtrap.username=${APP_MAILTRAP_USERNAME}); and ensure
server/src/main/resources/application-prod.properties includes
app.mailtrap.username=${APP_MAILTRAP_USERNAME} so both username and password are
parameterized consistently.
In `@server/src/main/java/org/eni/koinoniadaily/config/AppProperties.java`:
- Line 14: AppProperties currently applies `@Validated` but lacks proper
cascading: add `@Valid` to the email and aws fields in AppProperties (so nested
Email and Aws constraints are enforced) but do NOT add `@Valid` to the Mailtrap
field; remove/stop using JSR-303 constraints on the Mailtrap class and instead
add a runtime check in MailtrapConfig (or a `@PostConstruct` method) that reads
AppProperties.getEmail().getProvider() and only when it equals "mailtrap" assert
the Mailtrap properties (host, username, password non-blank and port > 0) to
fail startup if Mailtrap is required.
In
`@server/src/main/java/org/eni/koinoniadaily/infrastructure/email/config/SesConfig.java`:
- Line 15: Remove matchIfMissing = true from the `@ConditionalOnProperty`
annotations on SesConfig and SesEmailProvider so SES is not activated by absence
of the property; instead add matchIfMissing = true to the `@ConditionalOnProperty`
annotations on MailtrapConfig and MailtrapEmailProvider to make Mailtrap the
default; ensure AppProperties.Email.provider’s default ("mailtrap") now matches
these annotation changes so the active provider selection is consistent.
In
`@server/src/main/java/org/eni/koinoniadaily/infrastructure/email/providers/EmailProvider.java`:
- Line 4: The EmailProvider interface method declaration "void send (String to,
String subject, String body);" contains a space before the opening parenthesis
which violates MethodParamPad; remove the space so the signature reads "void
send(String to, String subject, String body)". Also restore or add the missing
google_checks.xml referenced by the build (or add the appropriate Checkstyle
dependency that provides the Google configuration) so checkstyle can run; ensure
the file is placed where the pom expects it (or update pom to point to the
provided config) so the verify phase does not fail.
In
`@server/src/main/java/org/eni/koinoniadaily/infrastructure/email/providers/MailtrapEmailProvider.java`:
- Around line 38-40: In MailtrapEmailProvider's catch block (the one catching
MessagingException | MailException) fix the truncated log message by either
removing the dangling "to" or appending a safe recipient indicator: update
log.error(...) to log a descriptive message plus either a masked recipient
(derive from the outgoing message/recipient list in this class, e.g., mask
local-part of the address) or a non-PII summary like "recipient redacted" or
"recipientCount=X"; also adjust the thrown RuntimeException message to match
(e.g., "Failed to send email via Mailtrap" or include the same safe recipient
summary) so logs are clear and do not leak PII.
In `@server/src/main/resources/application-prod.properties`:
- Around line 16-18: The app.mailtrap.password property in
application-prod.properties is unguarded and maps to ${APP_MAILTRAP_PASSWORD}
which causes startup failure for SES-only deployments; change the property to
include a colon-default (e.g. ${APP_MAILTRAP_PASSWORD:}) so it is optional, and
modify the AppProperties.Mailtrap.password field (currently annotated with
`@NotBlank`) to avoid unconditional validation—either remove `@NotBlank`, make the
field nullable with a default, or implement conditional validation (custom
validator or validation groups) so `@NotBlank` is only enforced when
AppProperties.email.provider == "mailtrap".
In `@server/src/test/resources/application-test.properties`:
- Around line 27-29: Add the missing app.email.provider property to the test
properties so MailtrapConfig is activated during tests: set
app.email.provider=mailtrap in the test config (since SesConfig uses
matchIfMissing=true and will otherwise be chosen), ensuring MailtrapConfig picks
up the provided app.mailtrap.password and app.email.from for the test context.
---
Duplicate comments:
In `@server/src/main/java/org/eni/koinoniadaily/config/AppProperties.java`:
- Around line 33-40: The Email.provider field currently has a Java default
("mailtrap") which does not affect `@ConditionalOnProperty` checks (used in
SesConfig); remove the in-code default from the Email class (private String
provider;) or alternatively ensure app.email.provider is explicitly defined in
all property sources (application*.yml/properties) and adjust the
`@ConditionalOnProperty` havingValue in SesConfig to match the intended provider
name so conditional beans behave predictably.
In
`@server/src/main/java/org/eni/koinoniadaily/infrastructure/email/providers/SesEmailProvider.java`:
- Line 19: The ConditionalOnProperty on SesEmailProvider is inconsistent with
SesConfig's default; update the `@ConditionalOnProperty`(name =
"app.email.provider", havingValue = "ses", matchIfMissing = /* true|false */) in
the SesEmailProvider class so its matchIfMissing value exactly matches the one
used on SesConfig (i.e., pick the same boolean default strategy you chose) to
keep activation behavior consistent.
---
Nitpick comments:
In `@server/docker-compose.yml`:
- Around line 17-19: The Mailtrap SMTP host and port are hardcoded in
application.properties while other Mail settings are pulled from env vars; add
APP_MAILTRAP_HOST and APP_MAILTRAP_PORT to the service environment block
alongside APP_EMAIL_PROVIDER/APP_EMAIL_FROM/APP_MAILTRAP_PASSWORD in
docker-compose.yml so these values are externalized, and update
application.properties to reference ${APP_MAILTRAP_HOST} and
${APP_MAILTRAP_PORT} instead of the literal "live.smtp.mailtrap.io" and "587".
In
`@server/src/main/java/org/eni/koinoniadaily/infrastructure/email/config/MailtrapConfig.java`:
- Around line 31-34: In MailtrapConfig, externalize the hardcoded mail.debug and
enforce STARTTLS: read the debug flag from the mail properties (e.g.,
props.getMailtrap().isDebug() or spring.mail.debug equivalent) and set
javaMailProperties "mail.debug" using that value instead of "false";
additionally add the "mail.smtp.starttls.required" property (set to true for
Mailtrap on 587) alongside "mail.smtp.starttls.enable" to require TLS
negotiation. Update the javaMailProperties handling in the MailtrapConfig class
so both "mail.debug" and "mail.smtp.starttls.required" are set from
configuration/constant rather than hardcoded.
server/src/main/java/org/eni/koinoniadaily/infrastructure/email/config/SesConfig.java
Show resolved
Hide resolved
server/src/main/java/org/eni/koinoniadaily/infrastructure/email/providers/EmailProvider.java
Outdated
Show resolved
Hide resolved
...rc/main/java/org/eni/koinoniadaily/infrastructure/email/providers/MailtrapEmailProvider.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
🧹 Nitpick comments (1)
server/src/main/java/org/eni/koinoniadaily/exceptions/EmailSendingException.java (1)
1-12: LGTM — clean, minimal exception class consistent with the codebase pattern.
(String message, Throwable cause)constructor is valuable here since it preserves the root cause (MessagingException,MailException, etc.) when wrapping, which aids debugging.As an optional nit:
RuntimeExceptionimplementsSerializable, so declaringprivate static final long serialVersionUID = 1L;suppresses the implicit serialVersionUID compiler warning and is idiomatic for custom exception types.♻️ Add serialVersionUID
public class EmailSendingException extends RuntimeException { + private static final long serialVersionUID = 1L; + public EmailSendingException(String message) {🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@server/src/main/java/org/eni/koinoniadaily/exceptions/EmailSendingException.java` around lines 1 - 12, Add a serialVersionUID to the EmailSendingException class to suppress the implicit serialVersionUID warning and follow the idiom for serializable exceptions: declare a private static final long serialVersionUID = 1L; inside the EmailSendingException class (which already defines the two constructors EmailSendingException(String) and EmailSendingException(String, Throwable)) so the class explicitly defines its serialization identifier.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In
`@server/src/main/java/org/eni/koinoniadaily/exceptions/EmailSendingException.java`:
- Around line 1-12: Add a serialVersionUID to the EmailSendingException class to
suppress the implicit serialVersionUID warning and follow the idiom for
serializable exceptions: declare a private static final long serialVersionUID =
1L; inside the EmailSendingException class (which already defines the two
constructors EmailSendingException(String) and EmailSendingException(String,
Throwable)) so the class explicitly defines its serialization identifier.
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request effectively refactors the email sending functionality to support multiple providers using a Strategy pattern. The introduction of an EmailProvider interface and its SES and Mailtrap implementations is well-executed, improving modularity and making it easy to switch between providers. The configuration properties have been reorganized logically, and a new exception handler for email sending failures improves error handling. The changes are clean and well-implemented. I have one minor suggestion to correct a typo in a standard field name.
server/src/main/java/org/eni/koinoniadaily/exceptions/EmailSendingException.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (3)
server/src/main/java/org/eni/koinoniadaily/config/AppProperties.java (2)
35-41: No validation onprovidervalue — typos cause a confusing startup failure.If
app.email.provideris set to an invalid value (e.g.,"mailtraap"), neitherSesConfignorMailtrapConfigactivates, and the missingEmailProviderbean produces a crypticNoSuchBeanDefinitionException. Consider constraining the value with@Pattern:Proposed fix
public static class Email { + `@Pattern`(regexp = "ses|mailtrap", message = "Email provider must be 'ses' or 'mailtrap'") private String provider = "ses";🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@server/src/main/java/org/eni/koinoniadaily/config/AppProperties.java` around lines 35 - 41, Add validation on the Email.provider field to fail-fast on typos: annotate the provider field in the nested AppProperties.Email class with a constraint such as `@Pattern`(regexp = "^(ses|mailtrap)$", message = "Invalid email provider, must be 'ses' or 'mailtrap'") (or an equivalent annotation) so Spring’s configuration binding validates that provider is one of the supported values and produces a clear error instead of a NoSuchBeanDefinitionException for EmailProvider.
34-35:@Validatedon nested static classes is ineffective.
@Validatedis meaningful on Spring-managed beans (e.g.,@ConfigurationProperties,@Controller). On plain nested static classes, it has no effect — validation cascading is controlled solely by@Validon the parent field. These annotations are misleading and can be removed.Proposed cleanup
`@Data` - `@Validated` public static class Email {`@Data` - `@Validated` public static class Aws {`@Data` - `@Validated` public static class Mailtrap {Also applies to: 44-45, 60-62
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@server/src/main/java/org/eni/koinoniadaily/config/AppProperties.java` around lines 34 - 35, Remove the ineffective `@Validated` annotations from the nested static configuration classes (e.g., the Email class and the other nested static classes referenced around lines 44-45 and 60-62) because `@Validated` only works on Spring-managed beans; instead ensure validation is triggered via `@Valid` on the parent property that binds the ConfigurationProperties. Locate the nested static classes (such as Email) in AppProperties and delete their `@Validated` annotations, and confirm the parent field that holds these nested types is annotated with `@Valid` so validation still cascades.server/src/main/java/org/eni/koinoniadaily/infrastructure/email/config/MailtrapConfig.java (1)
35-35: Consider makingmail.debugconfigurable rather than hardcoded tofalse.Tying this to a property or the active Spring profile (e.g.,
trueindev) would help troubleshoot SMTP issues without code changes.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@server/src/main/java/org/eni/koinoniadaily/infrastructure/email/config/MailtrapConfig.java` at line 35, In MailtrapConfig.java the javaMailProperties currently hardcodes javaMailProperties.put("mail.debug", "false"); — make this value configurable by reading a property (e.g., from Environment or `@Value`) or by checking the active Spring profile in the MailtrapConfig class; replace the hardcoded "false" with the fetched property (for example a key like spring.mail.properties.mail.debug or a custom mail.debug property) so devs can enable debug in dev without code changes and keep it off in prod.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In
`@server/src/main/java/org/eni/koinoniadaily/exceptions/EmailSendingException.java`:
- Line 5: The class EmailSendingException defines a wrongly named serialization
field serialVersionID which the JVM ignores; rename and correct it to the
standard private static final long serialVersionUID = 1L inside
EmailSendingException so the JVM recognizes the explicit serial UID and avoids
automatic synthetic UID computation.
---
Duplicate comments:
In `@server/src/main/java/org/eni/koinoniadaily/config/AppProperties.java`:
- Around line 29-31: Add javax.validation.Valid to the nested properties in
AppProperties so JSR-303 validation cascades: annotate the email and aws fields
with `@Valid` and also annotate mailtrap with `@Valid` if you intend to validate it
normally; then implement conditional validation for Mailtrap in MailtrapConfig
by adding a `@PostConstruct` method (e.g. validateMailtrapProperties) that
retrieves props.getMailtrap() and uses assertions (Assert.hasText /
Assert.isTrue) to check host, username, password and port only when the provider
requires Mailtrap, avoiding startup failure when provider=ses.
---
Nitpick comments:
In `@server/src/main/java/org/eni/koinoniadaily/config/AppProperties.java`:
- Around line 35-41: Add validation on the Email.provider field to fail-fast on
typos: annotate the provider field in the nested AppProperties.Email class with
a constraint such as `@Pattern`(regexp = "^(ses|mailtrap)$", message = "Invalid
email provider, must be 'ses' or 'mailtrap'") (or an equivalent annotation) so
Spring’s configuration binding validates that provider is one of the supported
values and produces a clear error instead of a NoSuchBeanDefinitionException for
EmailProvider.
- Around line 34-35: Remove the ineffective `@Validated` annotations from the
nested static configuration classes (e.g., the Email class and the other nested
static classes referenced around lines 44-45 and 60-62) because `@Validated` only
works on Spring-managed beans; instead ensure validation is triggered via `@Valid`
on the parent property that binds the ConfigurationProperties. Locate the nested
static classes (such as Email) in AppProperties and delete their `@Validated`
annotations, and confirm the parent field that holds these nested types is
annotated with `@Valid` so validation still cascades.
In
`@server/src/main/java/org/eni/koinoniadaily/infrastructure/email/config/MailtrapConfig.java`:
- Line 35: In MailtrapConfig.java the javaMailProperties currently hardcodes
javaMailProperties.put("mail.debug", "false"); — make this value configurable by
reading a property (e.g., from Environment or `@Value`) or by checking the active
Spring profile in the MailtrapConfig class; replace the hardcoded "false" with
the fetched property (for example a key like spring.mail.properties.mail.debug
or a custom mail.debug property) so devs can enable debug in dev without code
changes and keep it off in prod.
server/src/main/java/org/eni/koinoniadaily/exceptions/EmailSendingException.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@server/src/main/java/org/eni/koinoniadaily/config/AppProperties.java`:
- Around line 44-45: The AppProperties.email sender field 'from' currently only
has `@NotBlank` and lacks email format validation; update the AppProperties class
to add the `@Email` annotation on the 'from' field (alongside the existing
`@NotBlank`) so startup validation enforces a valid email format (include an
appropriate message if desired) and import javax.validation.constraints.Email;
ensure the change targets the 'from' field in AppProperties to match the
validation used in VerifyEmailDto/ResetPasswordDto.
---
Duplicate comments:
In `@server/src/main/java/org/eni/koinoniadaily/config/AppProperties.java`:
- Around line 35-36: Remove the `@Valid` annotation from the Mailtrap mailtrap
field in AppProperties to avoid unconditional bean validation, and instead add
conditional runtime checks in MailtrapConfig: implement a `@PostConstruct` method
(e.g., validate()) that checks props.getEmail().getProvider() equals "mailtrap"
and then asserts Mailtrap properties (getHost/getUsername/getPassword are
non-empty and getPort() > 0) using Spring Assert or similar to fail fast only
when Mailtrap is the selected provider.
server/src/main/java/org/eni/koinoniadaily/config/AppProperties.java
Outdated
Show resolved
Hide resolved
|
Note Docstrings generation - SUCCESS |
Docstrings generation was requested by @Cysteine12. * #114 (comment) The following files were modified: * `server/src/main/java/org/eni/koinoniadaily/exceptions/EmailSendingException.java` * `server/src/main/java/org/eni/koinoniadaily/exceptions/GlobalExceptionHandler.java` * `server/src/main/java/org/eni/koinoniadaily/infrastructure/email/EmailService.java` * `server/src/main/java/org/eni/koinoniadaily/infrastructure/email/config/MailtrapConfig.java` * `server/src/main/java/org/eni/koinoniadaily/infrastructure/email/providers/EmailProvider.java` * `server/src/main/java/org/eni/koinoniadaily/infrastructure/email/providers/MailtrapEmailProvider.java` * `server/src/main/java/org/eni/koinoniadaily/infrastructure/email/providers/SesEmailProvider.java`
|
Note Unit test generation is a public access feature. Expect some limitations and changes as we gather feedback and continue to improve it. Generating unit tests... This may take up to 20 minutes. |
|
No files have been changed in this PR. Unable to generate unit tests. |
What was changed
Why it was changed
How it was implemented
Linked Issue
Closes #112
Summary by CodeRabbit
New Features
Improvements
Chores