diff --git a/src/main/java/org/sopt/seonyakServer/domain/member/controller/MemberController.java b/src/main/java/org/sopt/seonyakServer/domain/member/controller/MemberController.java index d38b5ef..142ca9c 100644 --- a/src/main/java/org/sopt/seonyakServer/domain/member/controller/MemberController.java +++ b/src/main/java/org/sopt/seonyakServer/domain/member/controller/MemberController.java @@ -3,6 +3,8 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.sopt.seonyakServer.domain.member.dto.LoginSuccessResponse; +import org.sopt.seonyakServer.domain.member.dto.MemberJoinRequest; +import org.sopt.seonyakServer.domain.member.dto.MemberJoinResponse; import org.sopt.seonyakServer.domain.member.dto.NicknameRequest; import org.sopt.seonyakServer.domain.member.dto.SendCodeRequest; import org.sopt.seonyakServer.domain.member.dto.VerifyCodeRequest; @@ -10,6 +12,7 @@ import org.sopt.seonyakServer.domain.member.service.MessageService; import org.sopt.seonyakServer.global.common.external.client.dto.MemberLoginRequest; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -32,6 +35,13 @@ public ResponseEntity login( return ResponseEntity.ok(memberService.create(authorizationCode, loginRequest)); } + @PatchMapping("/auth/join") + public ResponseEntity join( + @RequestBody final MemberJoinRequest memberJoinRequest + ) { + return ResponseEntity.ok(memberService.patchMemberJoin(memberJoinRequest)); + } + @PostMapping("/nickname") public ResponseEntity validNickname( @Valid @RequestBody final NicknameRequest nicknameRequest diff --git a/src/main/java/org/sopt/seonyakServer/domain/member/dto/MemberJoinRequest.java b/src/main/java/org/sopt/seonyakServer/domain/member/dto/MemberJoinRequest.java new file mode 100644 index 0000000..3c0df68 --- /dev/null +++ b/src/main/java/org/sopt/seonyakServer/domain/member/dto/MemberJoinRequest.java @@ -0,0 +1,20 @@ +package org.sopt.seonyakServer.domain.member.dto; + +import java.util.List; + +public record MemberJoinRequest( + String role, + Boolean isSubscribed, + String nickname, + String image, + String phoneNumber, + String univName, + String field, + List departmentList, + String businessCard, + String company, + String position, + String detailPosition, + String level +) { +} diff --git a/src/main/java/org/sopt/seonyakServer/domain/member/dto/MemberJoinResponse.java b/src/main/java/org/sopt/seonyakServer/domain/member/dto/MemberJoinResponse.java new file mode 100644 index 0000000..2eb9dd6 --- /dev/null +++ b/src/main/java/org/sopt/seonyakServer/domain/member/dto/MemberJoinResponse.java @@ -0,0 +1,9 @@ +package org.sopt.seonyakServer.domain.member.dto; + +public record MemberJoinResponse( + String role +) { + public static MemberJoinResponse of(final String role) { + return new MemberJoinResponse(role); + } +} diff --git a/src/main/java/org/sopt/seonyakServer/domain/member/model/Member.java b/src/main/java/org/sopt/seonyakServer/domain/member/model/Member.java index ec7af22..27138e2 100644 --- a/src/main/java/org/sopt/seonyakServer/domain/member/model/Member.java +++ b/src/main/java/org/sopt/seonyakServer/domain/member/model/Member.java @@ -11,10 +11,13 @@ import jakarta.persistence.Id; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; +import java.util.List; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; import org.sopt.seonyakServer.domain.senior.model.Senior; import org.sopt.seonyakServer.global.common.model.BaseTimeEntity; @@ -57,8 +60,9 @@ public class Member extends BaseTimeEntity { @Column(name = "field") private String field; - @Column(name = "department") - private String department; + @Column(name = "departmentList", columnDefinition = "jsonb") + @JdbcTypeCode(SqlTypes.JSON) + private List departmentList; @OneToOne(mappedBy = "member", fetch = FetchType.LAZY, cascade = CascadeType.ALL) private Senior senior; @@ -85,4 +89,36 @@ public static Member create( .email(email) .build(); } + + public void updateMember( + Boolean isSubscribed, + String nickname, + String image, + String phoneNumber, + String univName, + String field, + List department + ) { + if (isSubscribed != null) { + this.isSubscribed = isSubscribed; + } + if (nickname != null) { + this.nickname = nickname; + } + if (image != null) { + this.image = image; + } + if (phoneNumber != null) { + this.phoneNumber = phoneNumber; + } + if (univName != null) { + this.univName = univName; + } + if (field != null) { + this.field = field; + } + if (department != null) { + this.departmentList = department; + } + } } diff --git a/src/main/java/org/sopt/seonyakServer/domain/member/service/MemberService.java b/src/main/java/org/sopt/seonyakServer/domain/member/service/MemberService.java index 94cca73..8aaa5f9 100644 --- a/src/main/java/org/sopt/seonyakServer/domain/member/service/MemberService.java +++ b/src/main/java/org/sopt/seonyakServer/domain/member/service/MemberService.java @@ -2,11 +2,15 @@ import lombok.RequiredArgsConstructor; import org.sopt.seonyakServer.domain.member.dto.LoginSuccessResponse; +import org.sopt.seonyakServer.domain.member.dto.MemberJoinRequest; +import org.sopt.seonyakServer.domain.member.dto.MemberJoinResponse; import org.sopt.seonyakServer.domain.member.dto.NicknameRequest; import org.sopt.seonyakServer.domain.member.model.Member; import org.sopt.seonyakServer.domain.member.model.SocialType; import org.sopt.seonyakServer.domain.member.repository.MemberRepository; +import org.sopt.seonyakServer.domain.senior.service.SeniorService; import org.sopt.seonyakServer.global.auth.MemberAuthentication; +import org.sopt.seonyakServer.global.auth.PrincipalHandler; import org.sopt.seonyakServer.global.auth.jwt.JwtTokenProvider; import org.sopt.seonyakServer.global.common.external.client.dto.MemberInfoResponse; import org.sopt.seonyakServer.global.common.external.client.dto.MemberLoginRequest; @@ -15,6 +19,7 @@ import org.sopt.seonyakServer.global.exception.model.CustomException; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -22,8 +27,10 @@ public class MemberService { private final MemberRepository memberRepository; private final JwtTokenProvider jwtTokenProvider; + private final PrincipalHandler principalHandler; private final GoogleSocialService googleSocialService; private final MemberManagementService memberManagementService; + private final SeniorService seniorService; private static final String NICKNAME_PATTERN = "^[a-zA-Z0-9가-힣]{2,8}$"; @@ -101,4 +108,27 @@ public void validNickname(final NicknameRequest nicknameRequest) { throw new CustomException(ErrorType.NICKNAME_DUP_ERROR); } } + + @Transactional + public MemberJoinResponse patchMemberJoin(MemberJoinRequest memberJoinRequest) { + Member member = memberRepository.findMemberByIdOrThrow(principalHandler.getUserIdFromPrincipal()); + + member.updateMember( + memberJoinRequest.isSubscribed(), + memberJoinRequest.nickname(), + memberJoinRequest.image(), + memberJoinRequest.phoneNumber(), + memberJoinRequest.univName(), + memberJoinRequest.field(), + memberJoinRequest.departmentList() + ); + + memberRepository.save(member); + + if (memberJoinRequest.role().equals("SENIOR")) { + return MemberJoinResponse.of(seniorService.createSenior(memberJoinRequest, member)); + } + + return MemberJoinResponse.of(memberJoinRequest.role()); + } } diff --git a/src/main/java/org/sopt/seonyakServer/domain/senior/service/SeniorService.java b/src/main/java/org/sopt/seonyakServer/domain/senior/service/SeniorService.java index 3f958c3..7ed3381 100644 --- a/src/main/java/org/sopt/seonyakServer/domain/senior/service/SeniorService.java +++ b/src/main/java/org/sopt/seonyakServer/domain/senior/service/SeniorService.java @@ -2,6 +2,8 @@ import java.util.List; import lombok.RequiredArgsConstructor; +import org.sopt.seonyakServer.domain.member.dto.MemberJoinRequest; +import org.sopt.seonyakServer.domain.member.model.Member; import org.sopt.seonyakServer.domain.senior.dto.SeniorListResponse; import org.sopt.seonyakServer.domain.senior.dto.SeniorProfileRequest; import org.sopt.seonyakServer.domain.senior.model.PreferredTimeList; @@ -20,6 +22,23 @@ public class SeniorService { private final SeniorRepository seniorRepository; private final PrincipalHandler principalHandler; + @Transactional + public String createSenior(final MemberJoinRequest memberJoinRequest, Member member) { + + Senior senior = Senior.createSenior( + member, + memberJoinRequest.businessCard(), + memberJoinRequest.detailPosition(), + memberJoinRequest.company(), + memberJoinRequest.position(), + memberJoinRequest.level() + ); + + seniorRepository.save(senior); + + return memberJoinRequest.role(); + } + @Transactional public void patchSeniorProfile(SeniorProfileRequest seniorProfileRequest) { Senior senior = seniorRepository.findSeniorByMemberId(principalHandler.getUserIdFromPrincipal())