Skip to content

Commit 06abb33

Browse files
authored
[RELEASE] 1.0.0 1차 스프린트 개발사항 1차 배포
[RELEASE] 1.0.0 1차 스프린트 개발사항 1차 배포
2 parents 59476f3 + 90974d2 commit 06abb33

File tree

9 files changed

+75
-8
lines changed

9 files changed

+75
-8
lines changed

src/main/java/org/websoso/WSSServer/domain/User.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import lombok.Getter;
2222
import lombok.NoArgsConstructor;
2323
import org.hibernate.annotations.ColumnDefault;
24+
import org.websoso.WSSServer.domain.common.BaseEntity;
2425
import org.websoso.WSSServer.domain.common.Gender;
2526
import org.websoso.WSSServer.domain.common.Role;
2627
import org.websoso.WSSServer.dto.user.EditMyInfoRequest;
@@ -39,7 +40,7 @@
3940
name = "UNIQUE_SOCIAL_ID_CONSTRAINT",
4041
columnNames = "social_id")
4142
})
42-
public class User {
43+
public class User extends BaseEntity {
4344

4445
@Id
4546
@GeneratedValue(strategy = GenerationType.IDENTITY)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package org.websoso.WSSServer.domain.common;
22

33
public enum DiscordWebhookMessageType {
4-
WITHDRAW, REPORT
4+
WITHDRAW, REPORT, JOIN
55
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.websoso.WSSServer.domain.common;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
@Getter
7+
@AllArgsConstructor
8+
public enum SocialLoginType {
9+
KAKAO("카카오"), APPLE("애플");
10+
11+
private final String label;
12+
13+
}

src/main/java/org/websoso/WSSServer/oauth2/service/AppleService.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.websoso.WSSServer.oauth2.service;
22

3+
import static org.websoso.WSSServer.domain.common.DiscordWebhookMessageType.JOIN;
4+
import static org.websoso.WSSServer.domain.common.SocialLoginType.APPLE;
35
import static org.websoso.WSSServer.exception.error.CustomAppleLoginError.CLIENT_SECRET_CREATION_FAILED;
46
import static org.websoso.WSSServer.exception.error.CustomAppleLoginError.EMPTY_JWT;
57
import static org.websoso.WSSServer.exception.error.CustomAppleLoginError.HEADER_PARSING_FAILED;
@@ -53,6 +55,7 @@
5355
import org.websoso.WSSServer.domain.RefreshToken;
5456
import org.websoso.WSSServer.domain.User;
5557
import org.websoso.WSSServer.domain.UserAppleToken;
58+
import org.websoso.WSSServer.domain.common.DiscordWebhookMessage;
5659
import org.websoso.WSSServer.dto.auth.AppleLoginRequest;
5760
import org.websoso.WSSServer.dto.auth.ApplePublicKey;
5861
import org.websoso.WSSServer.dto.auth.ApplePublicKeys;
@@ -62,6 +65,8 @@
6265
import org.websoso.WSSServer.repository.RefreshTokenRepository;
6366
import org.websoso.WSSServer.repository.UserAppleTokenRepository;
6467
import org.websoso.WSSServer.repository.UserRepository;
68+
import org.websoso.WSSServer.service.MessageFormatter;
69+
import org.websoso.WSSServer.service.MessageService;
6570

6671
@Transactional
6772
@Service
@@ -81,6 +86,7 @@ public class AppleService {
8186
private final UserRepository userRepository;
8287
private final UserAppleTokenRepository userAppleTokenRepository;
8388
private final JwtProvider jwtProvider;
89+
private final MessageService messageService;
8490

8591
@Value("${apple.public-keys-url}")
8692
private String applePublicKeysUrl;
@@ -278,9 +284,12 @@ private MultiValueMap<String, String> createTokenRequestParams(String authorizat
278284
private AuthResponse authenticate(String socialId, String email, String nickname, String appleRefreshToken) {
279285
User user = userRepository.findBySocialId(socialId);
280286

287+
boolean isNewUser = false;
288+
281289
if (user == null) {
282290
user = userRepository.save(User.createBySocial(socialId, nickname, email));
283291
userAppleTokenRepository.save(UserAppleToken.create(user, appleRefreshToken));
292+
isNewUser = true;
284293
}
285294

286295
UserAuthentication userAuthentication = new UserAuthentication(user.getUserId(), null, null);
@@ -291,6 +300,11 @@ private AuthResponse authenticate(String socialId, String email, String nickname
291300

292301
boolean isRegister = !user.getNickname().contains("*");
293302

303+
if (isNewUser) {
304+
messageService.sendDiscordWebhookMessage(
305+
DiscordWebhookMessage.of(MessageFormatter.formatUserJoinMessage(user, APPLE), JOIN));
306+
}
307+
294308
return AuthResponse.of(accessToken, refreshToken, isRegister);
295309
}
296310

src/main/java/org/websoso/WSSServer/oauth2/service/KakaoService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.websoso.WSSServer.oauth2.service;
22

3+
import static org.websoso.WSSServer.domain.common.DiscordWebhookMessageType.JOIN;
4+
import static org.websoso.WSSServer.domain.common.SocialLoginType.KAKAO;
35
import static org.websoso.WSSServer.exception.error.CustomKakaoError.INVALID_KAKAO_ACCESS_TOKEN;
46
import static org.websoso.WSSServer.exception.error.CustomKakaoError.KAKAO_SERVER_ERROR;
57

@@ -16,11 +18,14 @@
1618
import org.websoso.WSSServer.config.jwt.UserAuthentication;
1719
import org.websoso.WSSServer.domain.RefreshToken;
1820
import org.websoso.WSSServer.domain.User;
21+
import org.websoso.WSSServer.domain.common.DiscordWebhookMessage;
1922
import org.websoso.WSSServer.dto.auth.AuthResponse;
2023
import org.websoso.WSSServer.exception.exception.CustomKakaoException;
2124
import org.websoso.WSSServer.oauth2.dto.KakaoUserInfo;
2225
import org.websoso.WSSServer.repository.RefreshTokenRepository;
2326
import org.websoso.WSSServer.repository.UserRepository;
27+
import org.websoso.WSSServer.service.MessageFormatter;
28+
import org.websoso.WSSServer.service.MessageService;
2429

2530
@Service
2631
@Transactional
@@ -30,6 +35,7 @@ public class KakaoService {
3035
private final UserRepository userRepository;
3136
private final RefreshTokenRepository refreshTokenRepository;
3237
private final JwtProvider jwtProvider;
38+
private final MessageService messageService;
3339

3440
@Value("${kakao.user-info-url}")
3541
private String kakaoUserInfoUrl;
@@ -63,9 +69,11 @@ public AuthResponse getUserInfoFromKakao(String kakaoAccessToken) {
6369
String socialId = "kakao_" + kakaoUserInfo.id();
6470
String defaultNickname = "k*" + kakaoUserInfo.id().toString().substring(2, 10);
6571

72+
boolean isNewUser = false;
6673
User user = userRepository.findBySocialId(socialId);
6774
if (user == null) {
6875
user = userRepository.save(User.createBySocial(socialId, defaultNickname, kakaoUserInfo.email()));
76+
isNewUser = true;
6977
}
7078

7179
UserAuthentication userAuthentication = new UserAuthentication(user.getUserId(), null, null);
@@ -77,6 +85,10 @@ public AuthResponse getUserInfoFromKakao(String kakaoAccessToken) {
7785

7886
boolean isRegister = !user.getNickname().contains("*");
7987

88+
if (isNewUser) {
89+
messageService.sendDiscordWebhookMessage(
90+
DiscordWebhookMessage.of(MessageFormatter.formatUserJoinMessage(user, KAKAO), JOIN));
91+
}
8092
return AuthResponse.of(accessToken, refreshToken, isRegister);
8193
}
8294

src/main/java/org/websoso/WSSServer/repository/FeedCategoryRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public interface FeedCategoryRepository extends JpaRepository<FeedCategory, Long
1515

1616
List<FeedCategory> findByFeed(Feed feed);
1717

18-
void deleteByCategory(Category category);
18+
void deleteByCategoryAndFeed(Category category, Feed feed);
1919

2020
@Query(value = "SELECT fc.feed FROM FeedCategory fc "
2121
+ "WHERE fc.category = :category "

src/main/java/org/websoso/WSSServer/service/FeedCategoryService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public void updateFeedCategory(Feed feed, List<String> relevantCategories) {
5353
}
5454

5555
for (Category category : categories) {
56-
feedcategoryRepository.deleteByCategory(category);
56+
feedcategoryRepository.deleteByCategoryAndFeed(category, feed);
5757
}
5858
}
5959

src/main/java/org/websoso/WSSServer/service/MessageFormatter.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.websoso.WSSServer.domain.Feed;
1010
import org.websoso.WSSServer.domain.User;
1111
import org.websoso.WSSServer.domain.common.ReportedType;
12+
import org.websoso.WSSServer.domain.common.SocialLoginType;
1213

1314
public class MessageFormatter {
1415

@@ -39,6 +40,13 @@ public class MessageFormatter {
3940
"유저 닉네임 : %s\n\n" +
4041
"[탈퇴 사유]\n%s\n\n```";
4142

43+
private static final String USER_JOIN_MESSAGE =
44+
"```[%s] 새로운 사용자가 가입하였습니다.\n\n" +
45+
"[가입한 사용자]\n" +
46+
"로그인 방식 : %s\n" +
47+
"유저 아이디 : %d\n" +
48+
"가입을 환영합니다!\n\n```";
49+
4250
public static String formatFeedReportMessage(Feed feed, ReportedType reportedType, int reportedCount,
4351
boolean isHidden) {
4452
String hiddenMessage = isHidden ? "해당 피드는 숨김 처리되었습니다." : "해당 피드는 숨김 처리되지 않았습니다.";
@@ -87,4 +95,13 @@ public static String formatUserWithdrawMessage(Long userId, String userNickname,
8795
reason
8896
);
8997
}
98+
99+
public static String formatUserJoinMessage(User user, SocialLoginType socialLoginType) {
100+
return String.format(
101+
USER_JOIN_MESSAGE,
102+
user.getCreatedDate(),
103+
socialLoginType.getLabel(),
104+
user.getUserId()
105+
);
106+
}
90107
}

src/main/java/org/websoso/WSSServer/service/MessageService.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import static org.springframework.http.HttpMethod.POST;
44
import static org.springframework.http.HttpStatus.NO_CONTENT;
5+
import static org.websoso.WSSServer.domain.common.DiscordWebhookMessageType.JOIN;
56
import static org.websoso.WSSServer.domain.common.DiscordWebhookMessageType.REPORT;
7+
import static org.websoso.WSSServer.domain.common.DiscordWebhookMessageType.WITHDRAW;
68

79
import lombok.extern.slf4j.Slf4j;
810
import org.springframework.beans.factory.annotation.Value;
@@ -19,21 +21,29 @@ public class MessageService {
1921

2022
@Value("${logging.discord.report-webhook-url}")
2123
private String discordReportWebhookUrl;
22-
2324
@Value("${logging.discord.withdraw-webhook-url}")
2425
private String discordWithdrawWebhookUrl;
26+
@Value("${logging.discord.join-webhook-url}")
27+
private String discordJoinWebhookUrl;
2528

2629
public void sendDiscordWebhookMessage(DiscordWebhookMessage message) {
2730
try {
2831
HttpHeaders httpHeaders = new HttpHeaders();
2932
httpHeaders.add("Content-Type", "application/json; utf-8");
3033
HttpEntity<DiscordWebhookMessage> messageEntity = new HttpEntity<>(message, httpHeaders);
34+
String webhookUrl = "";
35+
36+
if (message.type() == REPORT) {
37+
webhookUrl = discordReportWebhookUrl;
38+
} else if (message.type() == WITHDRAW) {
39+
webhookUrl = discordWithdrawWebhookUrl;
40+
} else if (message.type() == JOIN) {
41+
webhookUrl = discordJoinWebhookUrl;
42+
}
3143

3244
RestTemplate template = new RestTemplate();
3345
ResponseEntity<String> response = template.exchange(
34-
message.type() == REPORT ?
35-
discordReportWebhookUrl :
36-
discordWithdrawWebhookUrl,
46+
webhookUrl,
3747
POST,
3848
messageEntity,
3949
String.class

0 commit comments

Comments
 (0)