diff --git a/src/main/java/goormthon/team28/startup_valley/discord/listener/DiscordListener.java b/src/main/java/goormthon/team28/startup_valley/discord/listener/DiscordListener.java index 553f85a..3d87340 100644 --- a/src/main/java/goormthon/team28/startup_valley/discord/listener/DiscordListener.java +++ b/src/main/java/goormthon/team28/startup_valley/discord/listener/DiscordListener.java @@ -24,6 +24,7 @@ @Slf4j @RequiredArgsConstructor public class DiscordListener extends ListenerAdapter { + private final UserService userService; private final TeamService teamService; private final MemberService memberService; @@ -33,10 +34,13 @@ public class DiscordListener extends ListenerAdapter { private final WorkService workService; private final GptService gptService; private final ReviewService reviewService; + @Override public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { + LocalDate nowLocalDate = LocalDate.now(); LocalDateTime nowLocalDateTime = LocalDateTime.now(); + switch (event.getName()) { case "1-팀원업데이트": // 봇을 제외한 사용자 목록 생성 @@ -55,9 +59,8 @@ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { log.info("멤버 생성 완료"); event.reply("팀 과 팀 멤버를 연결했어요! '파트입력하기' 명령어를 통해 역할을 알려주세요 !!").setEphemeral(true).queue(); - } else { + } else event.reply("웹에 회원가입이 필요합니다!\n\n" + "회원가입 해주세요 !! : " + noSignUp.toString()).setEphemeral(true).queue(); - } break; case "2-파트입력하기": @@ -397,65 +400,84 @@ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { break; } } + public List findNoSignUp(List members) { + List usersWithoutInfo = new ArrayList<>(); for (Member member : members) { - String serialId = member.getUser().getName(); - if (!userService.isExisted(serialId)) { - usersWithoutInfo.add(serialId); - } + String discordId = member.getUser().getName(); + if (!userService.isExisted(discordId)) + usersWithoutInfo.add(discordId); } return usersWithoutInfo; } + private Team myTeam(SlashCommandInteractionEvent event){ Optional optionalTeam = teamService.findByGuildId(event.getGuild().getId()); - if (optionalTeam.isEmpty()){ + if (optionalTeam.isEmpty()) event.reply("팀원업데이트를 통해 팀을 만들어주세요 !").setEphemeral(true).queue(); - } return optionalTeam.get(); } - private goormthon.team28.startup_valley.domain.User getUser(SlashCommandInteractionEvent event, String userId){ - Optional optionalUser = userService.findBySerialId(userId); - if (optionalUser.isEmpty()){ + + private goormthon.team28.startup_valley.domain.User getUser( + SlashCommandInteractionEvent event, + String userId + ){ + Optional optionalUser = userService.findByDiscordId(userId); + if (optionalUser.isEmpty()) event.reply("웹에 회원가입을 먼저 진행해주세요 !").setEphemeral(true).queue(); - } return optionalUser.get(); } - private goormthon.team28.startup_valley.domain.Member getMember(SlashCommandInteractionEvent event, String userId){ - Optional optionalMember = memberService.findByTeamAndUser( - myTeam(event), - getUser(event, userId) - ); - if (optionalMember.isEmpty()){ - event.reply("팀원을 조회할 수 없습니다 ㅠㅠ. 팀원 업데이트를 통해 변경 사항을 적용해주세요 ~ !").setEphemeral(true).queue(); - } + + private goormthon.team28.startup_valley.domain.Member getMember( + SlashCommandInteractionEvent event, + String userId + ){ + Optional optionalMember + = memberService.findByTeamAndUser(myTeam(event), getUser(event, userId)); + if (optionalMember.isEmpty()) + event.reply("팀원을 조회할 수 없습니다 ㅠㅠ. 팀원 업데이트를 통해 변경 사항을 적용해주세요 ~ !") + .setEphemeral(true) + .queue(); return optionalMember.get(); } - private Optional getProcessingScrum(SlashCommandInteractionEvent event, String userId){ + + private Optional getProcessingScrum( + SlashCommandInteractionEvent event, + String userId + ){ Optional nowScrum = scrumService.findNowScrum(getMember(event, userId)); if (nowScrum.isEmpty()){ - event.reply("시작된 작업을 찾을 수 없습니다 ㅠㅠ, 작업을 먼저 시작해주세요").setEphemeral(true).queue(); + event.reply("시작된 작업을 찾을 수 없습니다 ㅠㅠ, 작업을 먼저 시작해주세요") + .setEphemeral(true) + .queue(); } return nowScrum; } + private Optional getMyProcessingWork(SlashCommandInteractionEvent event){ String userId = event.getUser().getName(); return workService.findNotOverWork(getProcessingScrum(event, userId).get(), getMember(event, userId)); } - public void saveOrGetMember(Team team, Member discordMember, SlashCommandInteractionEvent event) { - goormthon.team28.startup_valley.domain.Member teamMember = memberService.saveOrGetMember( - team, - getUser(event, discordMember.getUser().getName()) - ); - if (isTeamLeaderNotSet(team) && isGuildOwner(discordMember, event)) { + public void saveOrGetMember( + Team team, + Member discordMember, + SlashCommandInteractionEvent event + ) { + goormthon.team28.startup_valley.domain.Member teamMember + = memberService.saveOrGetMember(team, getUser(event, discordMember.getUser().getName())); + + if (isTeamLeaderNotSet(team) && isGuildOwner(discordMember, event)) teamService.updateLeader(team.getId(), teamMember); - } } + public boolean isTeamLeaderNotSet(Team team) { return team.getLeader() == null; } + public boolean isGuildOwner(Member discordMember, SlashCommandInteractionEvent event) { - return discordMember.getUser().getName().equals(event.getGuild().getOwner().getUser().getName()); + return discordMember.getUser().getName() + .equals(event.getGuild().getOwner().getUser().getName()); } } diff --git a/src/main/java/goormthon/team28/startup_valley/domain/User.java b/src/main/java/goormthon/team28/startup_valley/domain/User.java index e9f796f..6954e96 100644 --- a/src/main/java/goormthon/team28/startup_valley/domain/User.java +++ b/src/main/java/goormthon/team28/startup_valley/domain/User.java @@ -9,7 +9,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.DynamicUpdate; -import org.springframework.transaction.annotation.Transactional; @Entity @Getter @@ -17,6 +16,7 @@ @Table(name = "users") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class User { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") @@ -25,13 +25,17 @@ public class User { /* 사용자 인증 및 권한 정보 */ @Column(name = "serial_id", nullable = false, unique = true) private String serialId; // discord serial id + @Column(name = "password", nullable = false) private String password; - @Column(name = "discord_id") - private Long discordId; + + @Column(name = "discord_id", nullable = false, unique = true) + private String discordId; + @Column(name = "role", nullable = false) @Enumerated(EnumType.STRING) private ERole role; + @Column(name = "provider", nullable = false) @Enumerated(EnumType.STRING) private EProvider provider; @@ -39,9 +43,11 @@ public class User { /* 사용자 이용 정보 */ @Column(name = "nickname") private String nickname; + @Column(name = "profile_image") @Enumerated(EnumType.STRING) private EProfileImage profileImage; + @Column(name = "refresh_Token") private String refreshToken; @@ -49,12 +55,14 @@ public class User { public User( String serialId, String password, + String discordId, ERole role, EProfileImage profileImage, EProvider provider ) { this.serialId = serialId; this.password = password; + this.discordId = discordId; this.role = role; this.profileImage = profileImage; this.provider = provider; diff --git a/src/main/java/goormthon/team28/startup_valley/repository/UserRepository.java b/src/main/java/goormthon/team28/startup_valley/repository/UserRepository.java index c80f0ba..c6686e8 100644 --- a/src/main/java/goormthon/team28/startup_valley/repository/UserRepository.java +++ b/src/main/java/goormthon/team28/startup_valley/repository/UserRepository.java @@ -19,8 +19,8 @@ public interface UserRepository extends JpaRepository { @Query("update User u set u.refreshToken = :refreshToken where u.id = :userId") void updateRefreshToken(Long userId, String refreshToken); Optional findById(Long userId); - Optional findBySerialId(String serialId); - boolean existsBySerialId(String serialId); + Optional findByDiscordId(String discordId); + boolean existsByDiscordId(String discordId); boolean existsByIdAndNicknameIsNull(Long id); interface UserSecurityForm { diff --git a/src/main/java/goormthon/team28/startup_valley/security/info/DiscordOauth2UserInfo.java b/src/main/java/goormthon/team28/startup_valley/security/info/DiscordOauth2UserInfo.java index 5f83a13..62562a8 100644 --- a/src/main/java/goormthon/team28/startup_valley/security/info/DiscordOauth2UserInfo.java +++ b/src/main/java/goormthon/team28/startup_valley/security/info/DiscordOauth2UserInfo.java @@ -13,4 +13,9 @@ public DiscordOauth2UserInfo(Map attributes) { public String getId() { return this.attributes.get("id").toString(); } + + @Override + public String getDiscordId() { + return this.attributes.get("username").toString(); + } } diff --git a/src/main/java/goormthon/team28/startup_valley/security/info/factory/Oauth2UserInfo.java b/src/main/java/goormthon/team28/startup_valley/security/info/factory/Oauth2UserInfo.java index be10233..348abaf 100644 --- a/src/main/java/goormthon/team28/startup_valley/security/info/factory/Oauth2UserInfo.java +++ b/src/main/java/goormthon/team28/startup_valley/security/info/factory/Oauth2UserInfo.java @@ -10,4 +10,5 @@ public abstract class Oauth2UserInfo { protected final Map attributes; public abstract String getId(); + public abstract String getDiscordId(); } diff --git a/src/main/java/goormthon/team28/startup_valley/security/service/CustomOauth2UserDetailService.java b/src/main/java/goormthon/team28/startup_valley/security/service/CustomOauth2UserDetailService.java index 285be34..735632f 100644 --- a/src/main/java/goormthon/team28/startup_valley/security/service/CustomOauth2UserDetailService.java +++ b/src/main/java/goormthon/team28/startup_valley/security/service/CustomOauth2UserDetailService.java @@ -1,6 +1,7 @@ package goormthon.team28.startup_valley.security.service; import goormthon.team28.startup_valley.domain.User; +import goormthon.team28.startup_valley.dto.type.EProfileImage; import goormthon.team28.startup_valley.dto.type.EProvider; import goormthon.team28.startup_valley.dto.type.ERole; import goormthon.team28.startup_valley.repository.UserRepository; @@ -53,8 +54,10 @@ public OAuth2User loadUser( bCryptPasswordEncoder .encode(UUID.randomUUID().toString()) ) - .provider(provider) + .discordId(oauth2UserInfo.getDiscordId()) .role(ERole.USER) + .profileImage(EProfileImage.TOMATO) + .provider(provider) .build() ); return UserRepository.UserSecurityForm.invoke(newUser); diff --git a/src/main/java/goormthon/team28/startup_valley/service/UserService.java b/src/main/java/goormthon/team28/startup_valley/service/UserService.java index a0e0e66..8bb7c57 100644 --- a/src/main/java/goormthon/team28/startup_valley/service/UserService.java +++ b/src/main/java/goormthon/team28/startup_valley/service/UserService.java @@ -21,13 +21,16 @@ @Service @RequiredArgsConstructor public class UserService { + private final UserRepository userRepository; private final MemberRepository memberRepository; - public Optional findBySerialId(String serialId){ - return userRepository.findBySerialId(serialId); + + public Optional findByDiscordId(String discordId){ + return userRepository.findByDiscordId(discordId); } - public boolean isExisted(String serialId){ - return userRepository.existsBySerialId(serialId); + + public boolean isExisted(String discordId){ + return userRepository.existsByDiscordId(discordId); } public UserDto getUserInfo(Long userId) {