Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@
import org.patinanetwork.codebloom.common.dto.Empty;
import org.patinanetwork.codebloom.common.dto.autogen.UnsafeGenericFailureResponse;
import org.patinanetwork.codebloom.common.dto.security.AuthenticationObjectDto;
import org.patinanetwork.codebloom.common.email.client.codebloom.OfficialCodebloomEmail;
import org.patinanetwork.codebloom.common.email.client.codebloom.OfficialCodebloomEmailClient;
import org.patinanetwork.codebloom.common.email.error.EmailException;
import org.patinanetwork.codebloom.common.email.options.SendEmailOptions;
import org.patinanetwork.codebloom.common.email.template.ReactEmailClient;
import org.patinanetwork.codebloom.common.email.template.ReactEmailTemplater;
import org.patinanetwork.codebloom.common.jwt.JWTClient;
import org.patinanetwork.codebloom.common.lag.FakeLag;
import org.patinanetwork.codebloom.common.reporter.Reporter;
Expand Down Expand Up @@ -65,23 +65,23 @@ public class AuthController {
private final Protector protector;
private final JWTClient jwtClient;
private final UserRepository userRepository;
private final OfficialCodebloomEmail emailClient;
private final OfficialCodebloomEmailClient emailClient;
private final ServerUrlUtils serverUrlUtils;
private final UserTagRepository userTagRepository;
private final Reporter reporter;
private final ReactEmailClient reactEmailClient;
private final ReactEmailTemplater reactEmailTemplater;
private final SimpleRedis<Long> simpleRedis;

public AuthController(
final SessionRepository sessionRepository,
final Protector protector,
final JWTClient jwtClient,
final UserRepository userRepository,
final OfficialCodebloomEmail emailClient,
final OfficialCodebloomEmailClient emailClient,
final ServerUrlUtils serverUrlUtils,
final UserTagRepository userTagRepository,
final Reporter reporter,
final ReactEmailClient reactEmailClient,
final ReactEmailTemplater reactEmailTemplater,
final SimpleRedisProvider simpleRedisProvider) {
this.sessionRepository = sessionRepository;
this.protector = protector;
Expand All @@ -91,7 +91,7 @@ public AuthController(
this.serverUrlUtils = serverUrlUtils;
this.userTagRepository = userTagRepository;
this.reporter = reporter;
this.reactEmailClient = reactEmailClient;
this.reactEmailTemplater = reactEmailTemplater;
this.simpleRedis = simpleRedisProvider.select(SimpleRedisSlot.VERIFICATION_EMAIL_SENDING);
}

Expand Down Expand Up @@ -238,7 +238,7 @@ public ResponseEntity<ApiResponder<Empty>> enrollSchool(
emailClient.sendMessage(SendEmailOptions.builder()
.recipientEmail(email)
.subject("Hello from Codebloom!")
.body(reactEmailClient.schoolEmailTemplate(verificationLink))
.body(reactEmailTemplater.schoolEmailTemplate(verificationLink))
.build());
return ResponseEntity.ok()
.body(ApiResponder.success("Magic link sent! Check your school inbox to continue.", Empty.of()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@
* <p>For example, we use this client to send emails to users who are trying to verify their school status.
*/
@Component
@EnableConfigurationProperties(OfficialCodebloomEmailProperties.class)
@EnableConfigurationProperties(OfficialCodebloomEmailClientProperties.class)
@Timed(value = "email.client.execution")
public class OfficialCodebloomEmail extends Email {
public class OfficialCodebloomEmailClient extends Email {

private final OfficialCodebloomEmailProperties emailProperties;
private final OfficialCodebloomEmailClientProperties emailProperties;
private Session session;

public OfficialCodebloomEmail(final OfficialCodebloomEmailProperties emailProperties) {
public OfficialCodebloomEmailClient(final OfficialCodebloomEmailClientProperties emailProperties) {
this.emailProperties = emailProperties;
final Properties properties = new Properties();
properties.setProperty("mail.smtp.host", emailProperties.getHost());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "codebloom.email")
public class OfficialCodebloomEmailProperties {
public class OfficialCodebloomEmailClientProperties {

private String host;
private String port;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@

/** Provides read-only access to the Github email account in order to access the OAuth code. */
@Component
@EnableConfigurationProperties(GithubOAuthEmailProperties.class)
@EnableConfigurationProperties(GithubOAuthEmailClientProperties.class)
@Timed(value = "email.client.execution")
public class GithubOAuthEmail extends Email {
public class GithubOAuthEmailClient extends Email {

private final GithubOAuthEmailProperties emailProperties;
private final GithubOAuthEmailClientProperties emailProperties;
private static Session session;

public GithubOAuthEmail(final GithubOAuthEmailProperties emailProperties) {
public GithubOAuthEmailClient(final GithubOAuthEmailClientProperties emailProperties) {
this.emailProperties = emailProperties;
final Properties properties = new Properties();
properties.setProperty("mail.imap.host", emailProperties.getHost());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "github.email")
public class GithubOAuthEmailProperties {
public class GithubOAuthEmailClientProperties {

private String host;
private String port;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import java.io.IOException;

public interface ReactEmailClient {
public interface ReactEmailTemplater {
/**
* Load the generated HTML from ClassPathResources as a String then injects variables using Jsoup and renders HTML
* as a string.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import org.springframework.util.StreamUtils;

@Component
public class ReactEmailClientImpl implements ReactEmailClient {
public class ReactEmailTemplaterImpl implements ReactEmailTemplater {

private String getHtmlAsString(final String path) throws IOException {
ClassPathResource resource = new ClassPathResource(path);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import org.patinanetwork.codebloom.common.db.models.usertag.Tag;
import org.patinanetwork.codebloom.common.email.Email;
import org.patinanetwork.codebloom.common.email.Message;
import org.patinanetwork.codebloom.common.email.client.github.GithubOAuthEmail;
import org.patinanetwork.codebloom.common.email.client.github.GithubOAuthEmailClient;
import org.patinanetwork.codebloom.common.url.ServerUrlUtils;
import org.patinanetwork.codebloom.scheduled.auth.CodeExtractor;
import org.springframework.stereotype.Component;
Expand All @@ -33,9 +33,9 @@ public class PlaywrightClient {
private final ServerUrlUtils serverUrlUtils;
private final Email email;

public PlaywrightClient(final ServerUrlUtils serverUrlUtils, GithubOAuthEmail githubOAuthEmail) {
public PlaywrightClient(final ServerUrlUtils serverUrlUtils, GithubOAuthEmailClient githubOAuthEmailClient) {
this.serverUrlUtils = serverUrlUtils;
this.email = githubOAuthEmail;
this.email = githubOAuthEmailClient;
}

private <T> T withPage(final Function<Page, T> consumer) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@
import org.patinanetwork.codebloom.common.db.repos.session.SessionRepository;
import org.patinanetwork.codebloom.common.db.repos.user.UserRepository;
import org.patinanetwork.codebloom.common.db.repos.usertag.UserTagRepository;
import org.patinanetwork.codebloom.common.email.client.codebloom.OfficialCodebloomEmail;
import org.patinanetwork.codebloom.common.email.client.codebloom.OfficialCodebloomEmailClient;
import org.patinanetwork.codebloom.common.email.error.EmailException;
import org.patinanetwork.codebloom.common.email.options.SendEmailOptions;
import org.patinanetwork.codebloom.common.email.template.ReactEmailClient;
import org.patinanetwork.codebloom.common.email.template.ReactEmailTemplater;
import org.patinanetwork.codebloom.common.jwt.JWTClient;
import org.patinanetwork.codebloom.common.reporter.Reporter;
import org.patinanetwork.codebloom.common.schools.magic.MagicLink;
Expand All @@ -50,11 +50,11 @@ public class AuthControllerTest {
private final Protector protector = mock(Protector.class);
private final JWTClient jwtClient = mock(JWTClient.class);
private final UserRepository userRepository = mock(UserRepository.class);
private final OfficialCodebloomEmail emailClient = mock(OfficialCodebloomEmail.class);
private final OfficialCodebloomEmailClient emailClient = mock(OfficialCodebloomEmailClient.class);
private final ServerUrlUtils serverUrlUtils = mock(ServerUrlUtils.class);
private final UserTagRepository userTagRepository = mock(UserTagRepository.class);
private final Reporter reporter = mock(Reporter.class);
private final ReactEmailClient reactEmailClient = mock(ReactEmailClient.class);
private final ReactEmailTemplater reactEmailTemplater = mock(ReactEmailTemplater.class);
private final SimpleRedis<Long> simpleRedis = mock(SimpleRedis.class);
private final SimpleRedisProvider simpleRedisProvider = mock(SimpleRedisProvider.class);

Expand All @@ -74,7 +74,7 @@ void setup() {
serverUrlUtils,
userTagRepository,
reporter,
reactEmailClient,
reactEmailTemplater,
simpleRedisProvider);
this.faker = Faker.instance();
}
Expand Down Expand Up @@ -284,7 +284,7 @@ void enrollSchoolEmailSendFailure() throws Exception {
when(protector.validateSession(request)).thenReturn(authObj);
when(jwtClient.encode(any(MagicLink.class), any(Duration.class))).thenReturn("mock-token");
when(serverUrlUtils.getUrl()).thenReturn("http://localhost:8080");
when(reactEmailClient.schoolEmailTemplate(any())).thenReturn("<html>Template</html>");
when(reactEmailTemplater.schoolEmailTemplate(any())).thenReturn("<html>Template</html>");
doThrow(new EmailException("Failed to send email")).when(emailClient).sendMessage(any(SendEmailOptions.class));

ResponseStatusException exception =
Expand All @@ -311,7 +311,7 @@ void enrollSchoolHappyPath() throws Exception {
when(simpleRedis.containsKey(user.getId())).thenReturn(false);
when(jwtClient.encode(any(MagicLink.class), any(Duration.class))).thenReturn("mock-token");
when(serverUrlUtils.getUrl()).thenReturn("http://localhost:8080");
when(reactEmailClient.schoolEmailTemplate(any())).thenReturn("<html>Template</html>");
when(reactEmailTemplater.schoolEmailTemplate(any())).thenReturn("<html>Template</html>");

var response = authController.enrollSchool(emailBody, request);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.patinanetwork.codebloom.common.db.repos;

import org.patinanetwork.codebloom.common.email.client.codebloom.OfficialCodebloomEmail;
import org.patinanetwork.codebloom.common.email.client.github.GithubOAuthEmail;
import org.patinanetwork.codebloom.common.email.client.codebloom.OfficialCodebloomEmailClient;
import org.patinanetwork.codebloom.common.email.client.github.GithubOAuthEmailClient;
import org.patinanetwork.codebloom.jda.JDAInitializer;
import org.springframework.test.context.bean.override.mockito.MockitoBean;

Expand All @@ -16,8 +16,8 @@ public class BaseRepositoryTest {
private JDAInitializer jdaInitializer;

@MockitoBean
private OfficialCodebloomEmail codebloomEmail;
private OfficialCodebloomEmailClient codebloomEmailClient;

@MockitoBean
private GithubOAuthEmail githubOAuthEmail;
private GithubOAuthEmailClient githubOAuthEmailClient;
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.patinanetwork.codebloom.common.email;

import org.junit.jupiter.api.Test;
import org.patinanetwork.codebloom.common.email.client.codebloom.OfficialCodebloomEmail;
import org.patinanetwork.codebloom.common.email.client.github.GithubOAuthEmail;
import org.patinanetwork.codebloom.common.email.client.codebloom.OfficialCodebloomEmailClient;
import org.patinanetwork.codebloom.common.email.client.github.GithubOAuthEmailClient;
import org.patinanetwork.codebloom.common.email.error.EmailException;
import org.patinanetwork.codebloom.config.NoJdaRequired;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -11,19 +11,20 @@
@SpringBootTest
public class TestEmailClients extends NoJdaRequired {

private final GithubOAuthEmail githubOAuthEmail;
private final OfficialCodebloomEmail officialCodebloomEmail;
private final GithubOAuthEmailClient githubOAuthEmailClient;
private final OfficialCodebloomEmailClient officialCodebloomEmailClient;

@Autowired
public TestEmailClients(
final GithubOAuthEmail githubOAuthEmail, final OfficialCodebloomEmail officialCodebloomEmail) {
this.githubOAuthEmail = githubOAuthEmail;
this.officialCodebloomEmail = officialCodebloomEmail;
final GithubOAuthEmailClient githubOAuthEmailClient,
final OfficialCodebloomEmailClient officialCodebloomEmailClient) {
this.githubOAuthEmailClient = githubOAuthEmailClient;
this.officialCodebloomEmailClient = officialCodebloomEmailClient;
}

@Test
void testConnections() throws EmailException {
githubOAuthEmail.testConnection();
officialCodebloomEmail.testConnection();
githubOAuthEmailClient.testConnection();
officialCodebloomEmailClient.testConnection();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
import org.jsoup.nodes.Element;
import org.junit.jupiter.api.Test;

class ReactEmailClientTest {
class ReactEmailTemplaterTest {

@Test
void exampleTemplateTest() throws IOException {
ReactEmailClient client = new ReactEmailClientImpl();
ReactEmailTemplater client = new ReactEmailTemplaterImpl();

String recipientName = "Example";
String verifyUrl = "https://example.com";
Expand Down Expand Up @@ -46,7 +46,7 @@ void exampleTemplateTest() throws IOException {

@Test
void emailTest() throws IOException {
ReactEmailClient client = new ReactEmailClientImpl();
ReactEmailTemplater client = new ReactEmailTemplaterImpl();
String verifyUrl = "https://example.com/example/href";

String renderedHtml = client.schoolEmailTemplate(verifyUrl);
Expand Down