feat: implement core use cases and DTOs (OAuth2, tests, and docs pending)
This commit is contained in:
parent
4053c6fa46
commit
06539a05fc
@ -0,0 +1,8 @@
|
||||
package com.pablotj.restemailbridge.application.dto;
|
||||
|
||||
public record EmailDTO(
|
||||
String from,
|
||||
String subject,
|
||||
String body
|
||||
) {
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.pablotj.restemailbridge.application.port;
|
||||
|
||||
public interface EmailConfigurationPort {
|
||||
String getDefaultRecipient();
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package com.pablotj.restemailbridge.application.usecase;
|
||||
|
||||
import com.pablotj.restemailbridge.application.dto.EmailDTO;
|
||||
import com.pablotj.restemailbridge.application.port.EmailConfigurationPort;
|
||||
import com.pablotj.restemailbridge.domain.model.Email;
|
||||
import com.pablotj.restemailbridge.domain.repository.EmailRepository;
|
||||
import com.pablotj.restemailbridge.domain.service.EmailService;
|
||||
|
||||
public class SendEmailUseCase {
|
||||
private final EmailConfigurationPort emailConfigurationPort;
|
||||
private final EmailService emailService;
|
||||
private final EmailRepository emailRepository;
|
||||
|
||||
public SendEmailUseCase(EmailConfigurationPort emailConfigurationPort, EmailService emailService, EmailRepository emailRepository) {
|
||||
this.emailConfigurationPort = emailConfigurationPort;
|
||||
this.emailService = emailService;
|
||||
this.emailRepository = emailRepository;
|
||||
}
|
||||
|
||||
public void handle(EmailDTO emailDTO) {
|
||||
String to = emailConfigurationPort.getDefaultRecipient();
|
||||
Email email = emailService.sendEmail(
|
||||
Email.builder()
|
||||
.from(emailDTO.from())
|
||||
.to(to)
|
||||
.subject(emailDTO.subject())
|
||||
.body(emailDTO.body())
|
||||
.build()
|
||||
);
|
||||
emailRepository.save(email);
|
||||
}
|
||||
}
|
@ -6,8 +6,8 @@ import org.springframework.boot.autoconfigure.domain.EntityScan;
|
||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
||||
|
||||
@SpringBootApplication(scanBasePackages = "com.pablotj.restemailbridge")
|
||||
@EnableJpaRepositories(basePackages = {"com.pablotj.restemailbridge.infrastructure"})
|
||||
@EntityScan(basePackages = {"com.pablotj.restemailbridge.infrastructure"})
|
||||
@EnableJpaRepositories(basePackages = {"com.pablotj.restemailbridge"})
|
||||
@EntityScan(basePackages = {"com.pablotj.restemailbridge"})
|
||||
public class RestEmailBridgeApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
@ -0,0 +1,15 @@
|
||||
package com.pablotj.restemailbridge.domain.model;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@Builder
|
||||
public class Email {
|
||||
|
||||
private String from;
|
||||
private String to;
|
||||
private String subject;
|
||||
private String body;
|
||||
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.pablotj.restemailbridge.domain.repository;
|
||||
|
||||
import com.pablotj.restemailbridge.domain.model.Email;
|
||||
|
||||
public interface EmailRepository {
|
||||
|
||||
Email save(Email email);
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.pablotj.restemailbridge.domain.service;
|
||||
|
||||
import com.pablotj.restemailbridge.domain.model.Email;
|
||||
|
||||
public interface EmailService {
|
||||
|
||||
Email sendEmail(Email email);
|
||||
}
|
@ -33,6 +33,12 @@
|
||||
<artifactId>spring-boot-starter-validation</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.reflections</groupId>
|
||||
<artifactId>reflections</artifactId>
|
||||
<version>0.10.2</version>
|
||||
</dependency>
|
||||
|
||||
<!-- MapStruct -->
|
||||
<dependency>
|
||||
<groupId>org.mapstruct</groupId>
|
||||
|
@ -0,0 +1,12 @@
|
||||
package com.pablotj.restemailbridge.infrastructure.config;
|
||||
|
||||
import com.pablotj.restemailbridge.application.port.EmailConfigurationPort;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class EmailConfigurationAdapter implements EmailConfigurationPort {
|
||||
@Override
|
||||
public String getDefaultRecipient() {
|
||||
return "1234@1234.com";
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package com.pablotj.restemailbridge.infrastructure.config.spring;
|
||||
|
||||
import com.pablotj.restemailbridge.application.port.EmailConfigurationPort;
|
||||
import com.pablotj.restemailbridge.application.usecase.SendEmailUseCase;
|
||||
import com.pablotj.restemailbridge.domain.repository.EmailRepository;
|
||||
import com.pablotj.restemailbridge.domain.service.EmailService;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
public class UseCaseConfig {
|
||||
|
||||
@Bean
|
||||
public SendEmailUseCase sendEmailUseCase(EmailConfigurationPort emailConfigurationPort, EmailService emailService, EmailRepository emailRepository) {
|
||||
return new SendEmailUseCase(emailConfigurationPort, emailService, emailRepository);
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.pablotj.restemailbridge.infrastructure.mail;
|
||||
|
||||
import com.pablotj.restemailbridge.domain.model.Email;
|
||||
import com.pablotj.restemailbridge.domain.service.EmailService;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class GmailOAuth2MailService implements EmailService {
|
||||
|
||||
@Override
|
||||
public Email sendEmail(Email email) {
|
||||
System.out.println("Sending email " + email.getSubject() + " to " + email.getTo());
|
||||
return email;
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package com.pablotj.restemailbridge.infrastructure.persistence;
|
||||
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.GeneratedValue;
|
||||
import jakarta.persistence.GenerationType;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.Table;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Entity
|
||||
@Table(name = "MAIL")
|
||||
@Getter
|
||||
@Setter
|
||||
public class MailJpa {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(nullable = false)
|
||||
private String sender;
|
||||
|
||||
@Column(nullable = false)
|
||||
private String recipient;
|
||||
|
||||
@Column(nullable = false)
|
||||
private String subjet;
|
||||
|
||||
@Column(nullable = false)
|
||||
private String body;
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.pablotj.restemailbridge.infrastructure.persistence;
|
||||
|
||||
import com.pablotj.restemailbridge.domain.model.Email;
|
||||
import com.pablotj.restemailbridge.domain.repository.EmailRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public class MailRepositoryAdapter implements EmailRepository {
|
||||
|
||||
private final SpringDataMailRepository springDataMailRepository;
|
||||
|
||||
public MailRepositoryAdapter(SpringDataMailRepository springDataMailRepository) {
|
||||
this.springDataMailRepository = springDataMailRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Email save(Email email) {
|
||||
MailJpa mailJpa = new MailJpa();
|
||||
mailJpa.setSender(email.getFrom());
|
||||
mailJpa.setRecipient(email.getTo());
|
||||
mailJpa.setSubjet(email.getSubject());
|
||||
mailJpa.setBody(email.getBody());
|
||||
|
||||
springDataMailRepository.save(mailJpa);
|
||||
|
||||
return email;
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package com.pablotj.restemailbridge.infrastructure.persistence;
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
|
||||
public interface SpringDataMailRepository extends JpaRepository<MailJpa, Long> {
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package com.pablotj.restemailbridge.infrastructure.rest;
|
||||
|
||||
import com.pablotj.restemailbridge.application.dto.EmailDTO;
|
||||
import com.pablotj.restemailbridge.application.usecase.SendEmailUseCase;
|
||||
import com.pablotj.restemailbridge.infrastructure.rest.dto.SendMailRequest;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/v1/mail")
|
||||
public class MailController {
|
||||
|
||||
private final SendEmailUseCase sendEmailUseCase;
|
||||
|
||||
public MailController(SendEmailUseCase sendEmailUseCase) {
|
||||
this.sendEmailUseCase = sendEmailUseCase;
|
||||
}
|
||||
|
||||
|
||||
@PostMapping
|
||||
public ResponseEntity<Void> send(@Valid @RequestBody SendMailRequest request) {
|
||||
sendEmailUseCase.handle(new EmailDTO(request.from(), request.subject(), request.body()));
|
||||
return ResponseEntity.ok().build();
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.pablotj.restemailbridge.infrastructure.rest.dto;
|
||||
|
||||
public record SendMailRequest(
|
||||
String from,
|
||||
String subject,
|
||||
String body
|
||||
) {
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user