diff --git a/src/main/java/com/muji_backend/kw_muji/team/controller/MyTeamController.java b/src/main/java/com/muji_backend/kw_muji/team/controller/MyTeamController.java index 95279274..a55e8029 100644 --- a/src/main/java/com/muji_backend/kw_muji/team/controller/MyTeamController.java +++ b/src/main/java/com/muji_backend/kw_muji/team/controller/MyTeamController.java @@ -1,8 +1,8 @@ package com.muji_backend.kw_muji.team.controller; import com.muji_backend.kw_muji.common.entity.ProjectEntity; -import com.muji_backend.kw_muji.team.dto.request.ApplicantRequestDTO; import com.muji_backend.kw_muji.team.dto.request.ProjectDetailRequestDTO; +import com.muji_backend.kw_muji.team.dto.request.ProjectStartRequestDTO; import com.muji_backend.kw_muji.team.dto.response.MyCreatedProjectResponseDTO; import com.muji_backend.kw_muji.team.dto.response.MyProjectResponseDTO; import com.muji_backend.kw_muji.team.dto.response.ProjectDetailResponseDTO; @@ -14,7 +14,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -61,20 +60,6 @@ public ResponseEntity> getApplicants(@AuthenticationPrincipa } } - @PatchMapping("/select") - public ResponseEntity> selectMember(@RequestBody ApplicantRequestDTO dto, BindingResult bindingResult) { - try { - myTeamService.validation(bindingResult, "id"); - myTeamService.selectApplicant(dto.getId()); - - return org.springframework.http.ResponseEntity.ok().body(Map.of("code", 200, "data", true)); - } catch (IllegalArgumentException e) { - return ResponseEntity.badRequest().body(Map.of("code", 400, "data", e.getMessage())); - } catch (RuntimeException e) { - return ResponseEntity.status(500).body(Map.of("code", 500, "data", "팀원 선택 오류. 잠시 후 다시 시도해주세요.")); - } - } - @DeleteMapping("/delete/{projectId}") public ResponseEntity> deleteProject(@AuthenticationPrincipal UserEntity userInfo, @PathVariable Long projectId) { try { @@ -139,13 +124,13 @@ else if (dto.isDeleteImage()) // 팀 프로젝트 사진 삭제를 요청한 경 } } - @PatchMapping("/start/{projectId}") - public ResponseEntity> startProject(@AuthenticationPrincipal UserEntity userInfo, @PathVariable Long projectId) { + @PatchMapping("/start") + public ResponseEntity> startProject(@AuthenticationPrincipal UserEntity userInfo, @RequestBody ProjectStartRequestDTO dto) { try { - if(!myTeamService.isMyProject(projectId, userInfo)) + if(!myTeamService.isMyProject(dto.getProjectId(), userInfo)) throw new IllegalArgumentException("내가 생성한 프로젝트가 아님"); - myTeamService.updateStart(projectId); + myTeamService.updateStart(dto); return org.springframework.http.ResponseEntity.ok().body(Map.of("code", 200, "data", true)); } catch (IllegalArgumentException e) { diff --git a/src/main/java/com/muji_backend/kw_muji/team/dto/request/ApplicantRequestDTO.java b/src/main/java/com/muji_backend/kw_muji/team/dto/request/ProjectStartRequestDTO.java similarity index 55% rename from src/main/java/com/muji_backend/kw_muji/team/dto/request/ApplicantRequestDTO.java rename to src/main/java/com/muji_backend/kw_muji/team/dto/request/ProjectStartRequestDTO.java index 3fbf1896..70316d1f 100644 --- a/src/main/java/com/muji_backend/kw_muji/team/dto/request/ApplicantRequestDTO.java +++ b/src/main/java/com/muji_backend/kw_muji/team/dto/request/ProjectStartRequestDTO.java @@ -1,16 +1,17 @@ package com.muji_backend.kw_muji.team.dto.request; -import jakarta.validation.constraints.NotEmpty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + @Data @Builder @AllArgsConstructor @NoArgsConstructor -public class ApplicantRequestDTO { - @NotEmpty(message = "지원자 아이디가 비어있습니다.") - private Long id; +public class ProjectStartRequestDTO { + private Long projectId; + private List memberIdList; // 지원자 id 리스트 } diff --git a/src/main/java/com/muji_backend/kw_muji/team/service/MyTeamService.java b/src/main/java/com/muji_backend/kw_muji/team/service/MyTeamService.java index e81004db..049f1757 100644 --- a/src/main/java/com/muji_backend/kw_muji/team/service/MyTeamService.java +++ b/src/main/java/com/muji_backend/kw_muji/team/service/MyTeamService.java @@ -7,6 +7,7 @@ import com.muji_backend.kw_muji.common.entity.UserEntity; import com.muji_backend.kw_muji.common.entity.enums.ProjectRole; import com.muji_backend.kw_muji.team.dto.request.ProjectDetailRequestDTO; +import com.muji_backend.kw_muji.team.dto.request.ProjectStartRequestDTO; import com.muji_backend.kw_muji.team.dto.response.ApplicantResponseDTO; import com.muji_backend.kw_muji.team.dto.response.MemberResponseDTO; import com.muji_backend.kw_muji.team.dto.response.MyCreatedProjectResponseDTO; @@ -32,6 +33,7 @@ public class MyTeamService { private final RoleRepository roleRepo; private final TeamRepository teamRepo; private final AmazonS3 amazonS3; + private final TeamMailSendService teamMailSendService; @Value("${cloud.aws.s3.bucket}") private String bucket; @@ -103,21 +105,6 @@ public void validation(BindingResult bindingResult, String fieldName) { throw new IllegalArgumentException(Objects.requireNonNull(bindingResult.getFieldError(fieldName)).getDefaultMessage()); } - public void selectApplicant(final Long memberId) { - final Optional applicant = roleRepo.findById(memberId); - - if(!applicant.isPresent() || applicant.get().getRole().equals(ProjectRole.CREATOR)) - throw new IllegalArgumentException("확인되지 않은 유저입니다."); - - if(applicant.get().getRole().equals(ProjectRole.MEMBER)) - throw new IllegalArgumentException("이미 선택한 유저입니다."); - - if(applicant.get().getRole().equals(ProjectRole.APPLICANT)) - applicant.get().setRole(ProjectRole.MEMBER); - - roleRepo.save(applicant.get()); - } - public void deleteProject(final Long projectId, final UserEntity user) { if (!roleRepo.findByProjectIdAndUsers(projectId, user).getRole().equals(ProjectRole.CREATOR)) throw new IllegalArgumentException("삭제 권한 없음"); @@ -184,19 +171,40 @@ else if(dto.isDeleteImage()) project.setImage(null); if(dto.getDeadlineAt() != null) - project.setDeadlineAt(project.getDeadlineAt()); + project.setDeadlineAt(dto.getDeadlineAt().atStartOfDay()); teamRepo.save(project); } - public void updateStart(final Long projectId) { - final ProjectEntity project = teamRepo.findById(projectId).get(); + public void selectApplicant(final List memberIdList) { + for (Long memberId : memberIdList) { + final Optional applicant = roleRepo.findById(memberId); + + if(applicant.isEmpty() || applicant.get().getRole().equals(ProjectRole.CREATOR)) + throw new IllegalArgumentException("확인되지 않은 유저입니다."); + + if(applicant.get().getRole().equals(ProjectRole.MEMBER)) + throw new IllegalArgumentException("이미 선택한 유저입니다."); + + if(applicant.get().getRole().equals(ProjectRole.APPLICANT)) + applicant.get().setRole(ProjectRole.MEMBER); + + roleRepo.save(applicant.get()); + teamMailSendService.joinEmail(applicant.get().getUsers().getEmail()); + } + } + + public void updateStart(final ProjectStartRequestDTO dto) { + final ProjectEntity project = teamRepo.findById(dto.getProjectId()).get(); if(!project.isStart()) project.setStart(true); else throw new IllegalArgumentException("이미 시작한 프로젝트"); + // 팀원 선택 & 이메일 전송 + selectApplicant(dto.getMemberIdList()); + teamRepo.save(project); } } diff --git a/src/main/java/com/muji_backend/kw_muji/team/service/TeamMailSendService.java b/src/main/java/com/muji_backend/kw_muji/team/service/TeamMailSendService.java new file mode 100644 index 00000000..fe1635be --- /dev/null +++ b/src/main/java/com/muji_backend/kw_muji/team/service/TeamMailSendService.java @@ -0,0 +1,51 @@ +package com.muji_backend.kw_muji.team.service; + +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; + +import java.io.UnsupportedEncodingException; + +@RequiredArgsConstructor +@Slf4j +@Service +public class TeamMailSendService { + private final JavaMailSender mailSender; + + @Value("${spring.mail.username}") + private String username; + + public void joinEmail(String email) { + String setFrom = username; // email-config에 설정한 자신의 이메일 주소를 입력 + String title = "팀플 시작 알림 이메일"; // 이메일 제목 + String content = + "광운 대학 생활 도우미입니다." + //html 형식으로 작성 ! + "

" + + "신청하신 팀프로젝트가 시작되었습니다." + + "
" + + "마이페이지에서 확인 가능합니다."; //이메일 내용 삽입 + mailSend(setFrom, email, title, content); + } + + public void mailSend(String setFrom, String toMail, String title, String content) { + MimeMessage message = mailSender.createMimeMessage(); + try { + MimeMessageHelper helper = new MimeMessageHelper(message,true,"utf-8"); + + helper.setFrom(setFrom, "광운 대학 생활 도우미"); + helper.setTo(toMail); + helper.setSubject(title); + helper.setText(content,true); + mailSender.send(message); + } catch (MessagingException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } +}