Skip to content

Commit d1026a9

Browse files
committed
Send out additional emails
Fixes #253
1 parent d9f737d commit d1026a9

File tree

10 files changed

+207
-29
lines changed

10 files changed

+207
-29
lines changed

src/main/java/com/faforever/api/config/FafApiProperties.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public class FafApiProperties {
3939
private Anope anope = new Anope();
4040
private Rating rating = new Rating();
4141
private Tutorial tutorial = new Tutorial();
42+
private UsernameChange usernameChange = new UsernameChange();
43+
private Ban ban = new Ban();
4244

4345
@Data
4446
public static class OAuth2 {
@@ -250,4 +252,18 @@ public class Rating {
250252
public static class Tutorial {
251253
private String thumbnailUrlFormat;
252254
}
255+
256+
@Data
257+
public class UsernameChange {
258+
private String mailBody;
259+
private String mailSubject;
260+
}
261+
262+
@Data
263+
public class Ban {
264+
private String banMailBody;
265+
private String banMailSubject;
266+
private String banRevokeMailBody;
267+
private String banRevokeMailSubject;
268+
}
253269
}

src/main/java/com/faforever/api/config/elide/ElideConfig.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,15 @@
88
import com.faforever.api.data.checks.permission.HasBanUpdate;
99
import com.faforever.api.data.checks.permission.HasLadder1v1Update;
1010
import com.faforever.api.data.checks.permission.IsModerator;
11+
import com.faforever.api.data.domain.BanInfo;
12+
import com.faforever.api.data.domain.BanRevokeData;
13+
import com.faforever.api.data.listeners.BanInfoPostCreateListener;
14+
import com.faforever.api.data.listeners.BanRevokePostCreateListener;
1115
import com.faforever.api.security.ExtendedAuditLogger;
1216
import com.fasterxml.jackson.databind.ObjectMapper;
1317
import com.yahoo.elide.Elide;
1418
import com.yahoo.elide.ElideSettingsBuilder;
19+
import com.yahoo.elide.annotation.OnCreatePostCommit;
1520
import com.yahoo.elide.core.EntityDictionary;
1621
import com.yahoo.elide.core.filter.dialect.RSQLFilterDialect;
1722
import com.yahoo.elide.jsonapi.JsonApiMapper;
@@ -87,7 +92,7 @@ public <T> T convert(Class<T> type, Object value) {
8792
}
8893

8994
@Bean
90-
public EntityDictionary entityDictionary() {
95+
public EntityDictionary entityDictionary(BanInfoPostCreateListener banInfoPostCreateListener, BanRevokePostCreateListener banRevokePostCreateListener) {
9196
ConcurrentHashMap<String, Class<? extends Check>> checks = new ConcurrentHashMap<>();
9297
checks.put(IsAuthenticated.EXPRESSION, IsAuthenticated.Inline.class);
9398
checks.put(IsModerator.EXPRESSION, IsModerator.Inline.class);
@@ -98,6 +103,9 @@ public EntityDictionary entityDictionary() {
98103
checks.put(HasLadder1v1Update.EXPRESSION, HasLadder1v1Update.Inline.class);
99104
checks.put(BooleanChange.TO_FALSE_EXPRESSION, BooleanChange.ToFalse.class);
100105
checks.put(BooleanChange.TO_TRUE_EXPRESSION, BooleanChange.ToTrue.class);
101-
return new EntityDictionary(checks);
106+
EntityDictionary entityDictionary = new EntityDictionary(checks);
107+
entityDictionary.bindTrigger(BanInfo.class, OnCreatePostCommit.class, banInfoPostCreateListener);
108+
entityDictionary.bindTrigger(BanRevokeData.class, OnCreatePostCommit.class, banRevokePostCreateListener);
109+
return entityDictionary;
102110
}
103111
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.faforever.api.data.listeners;
2+
3+
import com.faforever.api.data.domain.BanDurationType;
4+
import com.faforever.api.data.domain.BanInfo;
5+
import com.faforever.api.data.domain.Player;
6+
import com.faforever.api.email.EmailService;
7+
import com.yahoo.elide.functions.LifeCycleHook;
8+
import com.yahoo.elide.security.RequestScope;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.springframework.stereotype.Component;
11+
12+
import javax.inject.Inject;
13+
import javax.validation.constraints.NotNull;
14+
import java.time.format.DateTimeFormatter;
15+
import java.util.Optional;
16+
17+
@Component
18+
@Slf4j
19+
public class BanInfoPostCreateListener implements LifeCycleHook<BanInfo> {
20+
21+
private final EmailService emailService;
22+
23+
@Inject
24+
public BanInfoPostCreateListener(EmailService emailService) {
25+
this.emailService = emailService;
26+
}
27+
28+
@Override
29+
public void execute(BanInfo elideEntity, RequestScope requestScope, Optional changes) {
30+
try {
31+
@NotNull Player player = elideEntity.getPlayer();
32+
emailService.sendBanMail(player.getEmail(),
33+
player.getLogin(),
34+
elideEntity.getReason(),
35+
elideEntity.getAuthor().getLogin(),
36+
elideEntity.getCreateTime().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME),
37+
elideEntity.getLevel().name(),
38+
elideEntity.getDuration() == BanDurationType.PERMANENT ? "never" : elideEntity.getExpiresAt().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
39+
} catch (Exception e) {
40+
log.error("Sending ban email failed", e);
41+
}
42+
}
43+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.faforever.api.data.listeners;
2+
3+
import com.faforever.api.data.domain.BanInfo;
4+
import com.faforever.api.data.domain.BanRevokeData;
5+
import com.faforever.api.data.domain.Player;
6+
import com.faforever.api.email.EmailService;
7+
import com.yahoo.elide.functions.LifeCycleHook;
8+
import com.yahoo.elide.security.ChangeSpec;
9+
import com.yahoo.elide.security.RequestScope;
10+
import lombok.extern.slf4j.Slf4j;
11+
import org.springframework.stereotype.Component;
12+
13+
import javax.validation.constraints.NotNull;
14+
import java.time.format.DateTimeFormatter;
15+
import java.util.Optional;
16+
17+
@Slf4j
18+
@Component
19+
public class BanRevokePostCreateListener implements LifeCycleHook<BanRevokeData> {
20+
private final EmailService emailService;
21+
22+
public BanRevokePostCreateListener(EmailService emailService) {
23+
this.emailService = emailService;
24+
}
25+
26+
@Override
27+
public void execute(BanRevokeData banRevoke, RequestScope requestScope, Optional<ChangeSpec> changes) {
28+
try {
29+
@NotNull BanInfo ban = banRevoke.getBan();
30+
@NotNull Player player = ban.getPlayer();
31+
emailService.sendBanRevokeMail(player.getEmail(),
32+
player.getLogin(),
33+
banRevoke.getAuthor().getLogin(),
34+
banRevoke.getReason(),
35+
ban.getReason(),
36+
ban.getAuthor().getLogin(),
37+
ban.getCreateTime().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
38+
} catch (Exception e) {
39+
log.error("Failed to send ban revoke email", e);
40+
}
41+
}
42+
}

src/main/java/com/faforever/api/email/EmailService.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.faforever.api.email;
22

33
import com.faforever.api.config.FafApiProperties;
4+
import com.faforever.api.config.FafApiProperties.Ban;
45
import com.faforever.api.config.FafApiProperties.PasswordReset;
56
import com.faforever.api.config.FafApiProperties.Registration;
7+
import com.faforever.api.config.FafApiProperties.UsernameChange;
68
import com.faforever.api.error.ApiException;
79
import com.faforever.api.error.Error;
810
import com.faforever.api.error.ErrorCode;
@@ -53,6 +55,43 @@ public void sendActivationMail(String username, String email, String activationU
5355
);
5456
}
5557

58+
@SneakyThrows
59+
public void sendUsernameChangeMail(String email, String oldUsername, String newUsername) {
60+
UsernameChange usernameChange = properties.getUsernameChange();
61+
emailSender.sendMail(
62+
properties.getMail().getFromEmailAddress(),
63+
properties.getMail().getFromEmailName(),
64+
email,
65+
usernameChange.getMailSubject(),
66+
MessageFormat.format(usernameChange.getMailBody(), oldUsername, newUsername)
67+
);
68+
}
69+
70+
71+
@SneakyThrows
72+
public void sendBanMail(String email, String username, String reason, String banner, String createTime, String type, String expires) {
73+
Ban ban = properties.getBan();
74+
emailSender.sendMail(
75+
properties.getMail().getFromEmailAddress(),
76+
properties.getMail().getFromEmailName(),
77+
email,
78+
ban.getBanMailSubject(),
79+
MessageFormat.format(ban.getBanMailBody(), username, reason, banner, createTime, type, expires)
80+
);
81+
}
82+
83+
@SneakyThrows
84+
public void sendBanRevokeMail(String email, String username, String moderatorThatRevoked, String reasonForRevoke, String reasonForBan, String banner, String banCreateTime) {
85+
Ban ban = properties.getBan();
86+
emailSender.sendMail(
87+
properties.getMail().getFromEmailAddress(),
88+
properties.getMail().getFromEmailName(),
89+
email,
90+
ban.getBanMailSubject(),
91+
MessageFormat.format(ban.getBanMailBody(), username, moderatorThatRevoked, reasonForRevoke, reasonForBan, banner, banCreateTime)
92+
);
93+
}
94+
5695
@SneakyThrows
5796
public void sendPasswordResetMail(String username, String email, String passwordResetUrl) {
5897
PasswordReset passwordReset = properties.getPasswordReset();

src/main/java/com/faforever/api/user/UserService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,15 +190,15 @@ public void changeLogin(String newLogin, User user, String ipAddress) {
190190
throw new ApiException(new Error(ErrorCode.USERNAME_RESERVED, newLogin, usernameReservationTimeInMonths));
191191
}
192192
});
193-
193+
String oldLogin = user.getLogin();
194194
log.debug("Changing username for user ''{}'' to ''{}''", user, newLogin);
195195
NameRecord nameRecord = new NameRecord()
196-
.setName(user.getLogin())
196+
.setName(oldLogin)
197197
.setPlayer(playerRepository.getOne(user.getId()));
198198
nameRecordRepository.save(nameRecord);
199-
200199
user.setLogin(newLogin);
201200

201+
emailService.sendUsernameChangeMail(user.getEmail(), oldLogin, newLogin);
202202
createOrUpdateMauticContact(userRepository.save(user), ipAddress);
203203
}
204204

src/main/resources/config/application-dev.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ faf-api:
4949
api-key: ${STEAM_API_KEY:banana}
5050
link-to-steam:
5151
steam-redirect-url-format: ${STEAM_LINK_REDIRECT_URL:http://localhost:8010/users/linkToSteam?token=%s}
52+
username-change:
53+
mail-body: ${USERNAME_CHANGE_EMAIL_BODY:Hello {0},\n your username changed to {1}}
54+
mail-subject: ${USERNAME_CHANGE_EMAIL_SUBJECT:Username changed}
55+
ban:
56+
ban-mail-body: ${BAN_EMAIL_BODY:Hello {0},\nYour account was banned\nReason - {1}\nBanner - {2}\nTime - {3}\nType - {4}\nExpires - {5}.\nThank you for your fairness and acceptance.}
57+
ban-mail-subject: ${BAN_EMAIL_SUBJECT:ban subject}
58+
ban-revoke-mail-body: ${BAN_REVOKE_EMAIL_BODY:revoke email body}
59+
ban-revoke-mail-subject: ${BAN_REVOKE_EMAIL_SUBJECT:ban revoke subject}
5260

5361
spring:
5462
datasource:

src/main/resources/config/application-prod.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ faf-api:
5151
api-key: ${STEAM_API_KEY}
5252
link-to-steam:
5353
steam-redirect-url-format: ${STEAM_LINK_REDIRECT_URL}
54+
username-change:
55+
mail-body: ${USERNAME_CHANGE_EMAIL_BODY}
56+
mail-subject: ${USERNAME_CHANGE_EMAIL_SUBJECT}
57+
ban:
58+
ban-mail-body: ${BAN_EMAIL_BODY}
59+
ban-mail-subject: ${BAN_EMAIL_SUBJECT}
60+
ban-revoke-mail-body: ${BAN_REVOKE_EMAIL_BODY}
61+
ban-revoke-mail-subject: ${BAN_REVOKE_EMAIL_SUBJECT}
5462

5563
spring:
5664
datasource:

src/test/java/com/faforever/api/email/EmailServiceTest.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.faforever.api.config.FafApiProperties;
44
import com.faforever.api.config.FafApiProperties.PasswordReset;
55
import com.faforever.api.config.FafApiProperties.Registration;
6+
import com.faforever.api.config.FafApiProperties.UsernameChange;
67
import com.faforever.api.error.ApiExceptionWithCode;
78
import com.faforever.api.error.ErrorCode;
89
import org.junit.Before;
@@ -31,7 +32,7 @@ public class EmailServiceTest {
3132
private EmailSender emailSender;
3233

3334
@Before
34-
public void setUp() throws Exception {
35+
public void setUp() {
3536
properties = new FafApiProperties();
3637
properties.getMail().setFromEmailAddress("[email protected]");
3738
properties.getMail().setFromEmailName("foobar");
@@ -40,32 +41,32 @@ public void setUp() throws Exception {
4041
}
4142

4243
@Test
43-
public void validateEmailAddress() throws Exception {
44+
public void validateEmailAddress() {
4445
instance.validateEmailAddress("[email protected]");
4546
}
4647

4748
@Test
48-
public void validateEmailAddressMissingAt() throws Exception {
49+
public void validateEmailAddressMissingAt() {
4950
expectedException.expect(ApiExceptionWithCode.apiExceptionWithCode(ErrorCode.EMAIL_INVALID));
5051
instance.validateEmailAddress("testexample.com");
5152
}
5253

5354
@Test
54-
public void validateEmailAddressMissingTld() throws Exception {
55+
public void validateEmailAddressMissingTld() {
5556
expectedException.expect(ApiExceptionWithCode.apiExceptionWithCode(ErrorCode.EMAIL_INVALID));
5657
instance.validateEmailAddress("test@example");
5758
}
5859

5960
@Test
60-
public void validateEmailAddressBlacklisted() throws Exception {
61+
public void validateEmailAddressBlacklisted() {
6162
when(domainBlacklistRepository.existsByDomain("example.com")).thenReturn(true);
6263
expectedException.expect(ApiExceptionWithCode.apiExceptionWithCode(ErrorCode.EMAIL_BLACKLISTED));
6364

6465
instance.validateEmailAddress("[email protected]");
6566
}
6667

6768
@Test
68-
public void sendActivationMail() throws Exception {
69+
public void sendActivationMail() {
6970
Registration registration = properties.getRegistration();
7071
registration.setSubject("Hello");
7172
registration.setHtmlFormat("Hello {0}, bla: {1}");
@@ -75,6 +76,18 @@ public void sendActivationMail() throws Exception {
7576
verify(emailSender).sendMail("[email protected]", "foobar", "[email protected]", "Hello", "Hello junit, bla: http://example.com");
7677
}
7778

79+
@Test
80+
public void sendUsernameChangeMail() {
81+
UsernameChange usernameChange = properties.getUsernameChange();
82+
usernameChange.setMailSubject("Hello");
83+
usernameChange.setMailBody("Hello {0}, you changed your name to: {1}");
84+
85+
instance.sendUsernameChangeMail("[email protected]", "axel12", "phil12");
86+
87+
verify(emailSender).sendMail("[email protected]", "foobar", "[email protected]", "Hello", "Hello axel12, you changed your name to: phil12");
88+
}
89+
//TODO:add other email tests
90+
7891
@Test
7992
public void sendPasswordResetMail() {
8093
PasswordReset passwordReset = properties.getPasswordReset();

0 commit comments

Comments
 (0)