Skip to content

Commit

Permalink
feat: ✨ 초대코드 이메일 전송 기능 구현 (#14)
Browse files Browse the repository at this point in the history
* chore: timezone seoul 설정

* chore: 깃 템플릿 추가, readme.md 추가

* chore: 예외처리, 전역 환경 설정 외

* feat: 데이터 모델링

* chore: 🐳 cicd 설정

* chore: 🐳 workflow lowercase 로 수정

* chore: 디스코드 webhook 테스트

* chore: :global: cors 설정

* chore: 🐳 cors 변경사항 yml 재적용

* feat: ✨ 팀(방) 생성 기능 구현 (#9)

* feat: 목표 점검(캘린더) 기능 구현 (#11)

* feat: ✨ 초대코드 이메일 전송 기능 구현 (#13)
  • Loading branch information
LEEJaeHyeok97 authored Sep 26, 2024
1 parent 5ebf4ec commit 7eb9c74
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 0 deletions.
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ dependencies {
implementation 'com.auth0:java-jwt:3.18.2'
implementation 'com.auth0:jwks-rsa:0.20.0'

//mail
implementation 'org.springframework.boot:spring-boot-starter-mail'


testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import com.goormdari.domain.team.exception.TeamAlreadyExistException;
import com.goormdari.domain.user.domain.User;
import com.goormdari.domain.user.domain.repository.UserRepository;
import com.goormdari.global.config.email.EmailClient;
import com.goormdari.global.payload.Message;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -22,6 +24,8 @@ public class TeamService {
private final TeamRepository teamRepository;
private final UserRepository userRepository;

private final EmailClient emailClient;


@Transactional
public CreateTeamResponse createNewTeam(final Long userId, final CreateTeamRequest createTeamRequest) {
Expand Down Expand Up @@ -55,4 +59,22 @@ public CreateTeamResponse createNewTeam(final Long userId, final CreateTeamReque
.joinCode(joinCode)
.build();
}


public Message sendCode(Long userId, Long guestId) {

User hostUser = userRepository.findById(userId)
.orElseThrow(() -> new NotFoundException("User not found"));

User guestUser = userRepository.findById(guestId)
.orElseThrow(() -> new NotFoundException("Guest not found"));

String joinCode = userRepository.findJoinCodeByUserId(userId);

emailClient.sendOneEmail(hostUser.getNickname(), guestUser.getEmail(), joinCode);

return Message.builder()
.message("이메일 전송에 성공했습니다.")
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.goormdari.domain.team.dto.request.CreateTeamRequest;
import com.goormdari.domain.team.dto.response.CreateTeamResponse;
import com.goormdari.global.payload.ErrorResponse;
import com.goormdari.global.payload.Message;
import com.goormdari.global.payload.ResponseCustom;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
Expand Down Expand Up @@ -37,4 +38,16 @@ public ResponseCustom<CreateTeamResponse> createTeam(
return ResponseCustom.OK(teamService.createNewTeam(userId, createTeamRequest));
}

@Operation(summary = "팀(방) 참여코드 전달", description = "팀(방) 참여코드를 이메일로 전달합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "팀(방) 참여코드 전달 성공", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = Message.class))}),
@ApiResponse(responseCode = "400", description = "팀(방) 참여코드 전달 실패", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))}),
})
@PostMapping("/email/{guestId}")
public ResponseCustom<Message> sendJoinCode(
@Parameter(description = "Accesstoken을 입력해주세요.", required = true) @RequestHeader Long userId,
@Parameter(description = "초대할 유저의 id를 입력해주세요.", required = true) @PathVariable Long guestId
) {
return ResponseCustom.OK(teamService.sendCode(userId, guestId));
}
}
2 changes: 2 additions & 0 deletions src/main/java/com/goormdari/domain/user/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ public class User extends BaseEntity {
@Column(name = "id", updatable = false)
private Long id;

private String email;

private String nickname;
private String username;
private String password;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

import com.goormdari.domain.user.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

public interface UserRepository extends JpaRepository<User, Long> {

@Query("SELECT t.joinCode FROM User u JOIN u.team t WHERE u.id = :userId")
String findJoinCodeByUserId(Long userId);
}
39 changes: 39 additions & 0 deletions src/main/java/com/goormdari/global/config/email/EmailClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.goormdari.global.config.email;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@RequiredArgsConstructor
public class EmailClient {

private final JavaMailSender javaMailSender;
private final JavaMailSenderImpl mailSender;

public void sendOneEmail(String from, String to, String joinCode) {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();

// 수신자, 제목, 본문 설정
String subject = "[구름다리] 팀 초대 코드 안내";
String body = from + "님의 초대입니다.\n" + "https://9oormdari.vercel.app/" + " 구름다리 서비스 초대 코드: " + joinCode;
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(body, true);

// 이메일 전송
mailSender.send(mimeMessage);

} catch (MessagingException e) {
log.error(e.getMessage(), e);
}
}
}

0 comments on commit 7eb9c74

Please sign in to comment.