From c541119cf09e6c3c5c5b7aa9fa594f258339a60d Mon Sep 17 00:00:00 2001 From: Pablo de la Torre Jamardo Date: Mon, 15 Sep 2025 08:24:53 +0200 Subject: [PATCH] refactor(model): persist date, status, and error description --- .../restemailbridge/domain/model/Email.java | 32 ++++++++++++++++--- .../domain/model/EmailStatus.java | 5 +++ .../infrastructure/config/JpaConfig.java | 8 +++++ .../infrastructure/persistence/MailJpa.java | 31 +++++++++++++++--- .../persistence/MailRepositoryAdapter.java | 3 +- .../db-scripts/V1.0.0_DDL_init_scheme.sql | 22 +++++++++---- 6 files changed, 85 insertions(+), 16 deletions(-) create mode 100644 domain/src/main/java/com/pablotj/restemailbridge/domain/model/EmailStatus.java create mode 100644 infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/config/JpaConfig.java diff --git a/domain/src/main/java/com/pablotj/restemailbridge/domain/model/Email.java b/domain/src/main/java/com/pablotj/restemailbridge/domain/model/Email.java index ea590bd..a5643ae 100644 --- a/domain/src/main/java/com/pablotj/restemailbridge/domain/model/Email.java +++ b/domain/src/main/java/com/pablotj/restemailbridge/domain/model/Email.java @@ -1,5 +1,6 @@ package com.pablotj.restemailbridge.domain.model; +import java.time.Instant; import lombok.Builder; import lombok.Getter; @@ -7,9 +8,30 @@ import lombok.Getter; @Builder public class Email { - private String from; - private String to; - private String subject; - private String body; + private final String from; + private final String to; + private final String subject; + private final String body; + private EmailStatus status; + private final Instant createdAt; + private String errorDescription; -} + public void markAsSent() { + this.status = EmailStatus.SENT; + } + + public void markAsFailed(String errorDescription) { + this.status = EmailStatus.FAILED; + this.errorDescription = errorDescription; + } + + public static Email create(String from, String to, String subject, String body) { + return Email.builder() + .from(from) + .to(to) + .subject(subject) + .body(body) + .status(EmailStatus.PENDING) + .build(); + } +} \ No newline at end of file diff --git a/domain/src/main/java/com/pablotj/restemailbridge/domain/model/EmailStatus.java b/domain/src/main/java/com/pablotj/restemailbridge/domain/model/EmailStatus.java new file mode 100644 index 0000000..69a6a8a --- /dev/null +++ b/domain/src/main/java/com/pablotj/restemailbridge/domain/model/EmailStatus.java @@ -0,0 +1,5 @@ +package com.pablotj.restemailbridge.domain.model; + +public enum EmailStatus { + SENT, FAILED, PENDING +} diff --git a/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/config/JpaConfig.java b/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/config/JpaConfig.java new file mode 100644 index 0000000..f886e1b --- /dev/null +++ b/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/config/JpaConfig.java @@ -0,0 +1,8 @@ +package com.pablotj.restemailbridge.infrastructure.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration +@EnableJpaAuditing +public class JpaConfig { } diff --git a/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/persistence/MailJpa.java b/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/persistence/MailJpa.java index 053bb58..5ad3a0f 100644 --- a/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/persistence/MailJpa.java +++ b/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/persistence/MailJpa.java @@ -1,15 +1,24 @@ package com.pablotj.restemailbridge.infrastructure.persistence; +import com.pablotj.restemailbridge.domain.model.EmailStatus; import jakarta.persistence.Column; +import jakarta.persistence.Convert; import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; +import java.time.Instant; import lombok.Getter; import lombok.Setter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; @Entity +@EntityListeners(AuditingEntityListener.class) @Table(name = "MAIL") @Getter @Setter @@ -19,15 +28,29 @@ public class MailJpa { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(length = 100, nullable = false) + @Column(length = 200, nullable = false) + @Convert(converter = EncryptionConverter.class) private String sender; - @Column(length = 100, nullable = false) + @Column(length = 200, nullable = false) private String recipient; - @Column(length = 50, nullable = false) + @Column(length = 150, nullable = false) + @Convert(converter = EncryptionConverter.class) private String subjet; - @Column(length = 40000, nullable = false) + @Column(length = 7000, nullable = false) + @Convert(converter = EncryptionConverter.class) private String body; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private EmailStatus status; + + @CreatedDate + @Column(nullable = false) + private Instant createdAt; + + @Column + private String errorDescription; } diff --git a/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/persistence/MailRepositoryAdapter.java b/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/persistence/MailRepositoryAdapter.java index 8acf59c..8795713 100644 --- a/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/persistence/MailRepositoryAdapter.java +++ b/infrastructure/src/main/java/com/pablotj/restemailbridge/infrastructure/persistence/MailRepositoryAdapter.java @@ -20,7 +20,8 @@ public class MailRepositoryAdapter implements EmailRepository { mailJpa.setRecipient(email.getTo()); mailJpa.setSubjet(email.getSubject()); mailJpa.setBody(email.getBody()); - + mailJpa.setStatus(email.getStatus()); + mailJpa.setErrorDescription(email.getErrorDescription()); springDataMailRepository.save(mailJpa); return email; diff --git a/infrastructure/src/main/resources/db-scripts/V1.0.0_DDL_init_scheme.sql b/infrastructure/src/main/resources/db-scripts/V1.0.0_DDL_init_scheme.sql index 150075c..608c13d 100644 --- a/infrastructure/src/main/resources/db-scripts/V1.0.0_DDL_init_scheme.sql +++ b/infrastructure/src/main/resources/db-scripts/V1.0.0_DDL_init_scheme.sql @@ -1,8 +1,18 @@ -CREATE TABLE restemailbridge.mail +create table mail ( - id BIGSERIAL PRIMARY KEY, - body VARCHAR(255) NOT NULL, - recipient VARCHAR(255) NOT NULL, - sender VARCHAR(255) NOT NULL, - subject VARCHAR(255) NOT NULL + id bigint generated by default as identity primary key, + body varchar(7000) not null, + recipient varchar(200) not null, + sender varchar(200) not null, + subjet varchar(150) not null, + created_at timestamp, + status varchar + constraint check_status + check (((status)::text = 'PENDING'::text) OR ((status)::text = 'SENT'::text) OR + ((status)::text = 'FAILED'::text)), + error_description varchar(10000), + constraint check_error_description + check ((((status)::text = 'FAILED'::text) AND + ((error_description IS NOT NULL) OR ((error_description)::text <> ''::text))) OR + (((status)::text <> 'FAILED'::text) AND (error_description IS NULL))) ); \ No newline at end of file