From 7cb820eae23b8d9f95be42e2900209fa93ee53fe Mon Sep 17 00:00:00 2001 From: Kim Doo Hyeon Date: Tue, 18 Feb 2025 23:26:36 +0900 Subject: [PATCH] =?UTF-8?q?[FEATURE]=20=EB=A7=A4=EC=B9=AD=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20API=20#43?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 로그인 성공 시 역할 반환 - care style 이모지 --- .../member/controller/MemberController.java | 3 +- .../controller/response/LoginResponse.java | 21 ++ .../domain/member/service/MemberService.java | 341 +++++++++--------- .../young/blaybus/util/enums/CareStyle.java | 10 +- 4 files changed, 201 insertions(+), 174 deletions(-) create mode 100644 src/main/java/young/blaybus/domain/member/controller/response/LoginResponse.java diff --git a/src/main/java/young/blaybus/domain/member/controller/MemberController.java b/src/main/java/young/blaybus/domain/member/controller/MemberController.java index d04003c..0b5f383 100644 --- a/src/main/java/young/blaybus/domain/member/controller/MemberController.java +++ b/src/main/java/young/blaybus/domain/member/controller/MemberController.java @@ -10,6 +10,7 @@ import young.blaybus.domain.member.controller.request.CreateAdminRequest; import young.blaybus.domain.member.controller.request.CreateMemberRequest; import young.blaybus.domain.member.controller.response.CurrentMemberResponse; +import young.blaybus.domain.member.controller.response.LoginResponse; import young.blaybus.domain.member.service.MemberService; @RestController @@ -73,7 +74,7 @@ public ApiResponse login(@RequestParam String id, @RequestParam String passwo // 로그인 @PostMapping(value = "/login/v2") @Operation(summary = "로그인 V2") - public ApiResponse loginV2(@RequestParam String id, @RequestParam String password) { + public ApiResponse loginV2(@RequestParam String id, @RequestParam String password) { return ApiResponse.onSuccess(memberService.login(id, password)); } diff --git a/src/main/java/young/blaybus/domain/member/controller/response/LoginResponse.java b/src/main/java/young/blaybus/domain/member/controller/response/LoginResponse.java new file mode 100644 index 0000000..1e83594 --- /dev/null +++ b/src/main/java/young/blaybus/domain/member/controller/response/LoginResponse.java @@ -0,0 +1,21 @@ +package young.blaybus.domain.member.controller.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import young.blaybus.domain.member.enums.MemberRole; + +@Getter +@Builder +@AllArgsConstructor +@Schema(description = "로그인 성공 응답 객체") +public class LoginResponse { + + @Schema(description = "Access Token") + private String accessToken; + + @Schema(description = "역할") + private MemberRole role; + +} diff --git a/src/main/java/young/blaybus/domain/member/service/MemberService.java b/src/main/java/young/blaybus/domain/member/service/MemberService.java index b471331..2de4a17 100644 --- a/src/main/java/young/blaybus/domain/member/service/MemberService.java +++ b/src/main/java/young/blaybus/domain/member/service/MemberService.java @@ -23,6 +23,7 @@ import young.blaybus.domain.member.controller.response.GetAdmin; import young.blaybus.domain.member.controller.response.GetCenterCheckResponse; import young.blaybus.domain.member.controller.response.GetMember; +import young.blaybus.domain.member.controller.response.LoginResponse; import young.blaybus.domain.member.enums.MemberRole; import young.blaybus.domain.member.repository.MemberRepository; import young.blaybus.domain.member.security.SecurityUtils; @@ -36,181 +37,185 @@ @RequiredArgsConstructor public class MemberService { - private final MemberRepository memberRepository; - private final CertificateRepository certificateRepository; - private final CenterRepository centerRepository; - private final BCryptPasswordEncoder bCryptPasswordEncoder; - private final JwtProvider jwtProvider; - - // 관리자 회원 등록 - @Transactional - public Member adminRegisterMember(CreateAdminRequest adminRequest) { - LocalDateTime now = LocalDateTime.now(); - - String profileUrl = "https://theaverageagegottenyounger.s3.ap-northeast-2.amazonaws.com/blaybus-basic-profile-image.png"; - if (StringUtils.hasText(adminRequest.profileUrl())) profileUrl = adminRequest.profileUrl(); - - Center center = centerRepository.findByName(adminRequest.center().name()); - MemberRole role = MemberRole.ADMIN; - Member member = Member.builder() - .id(adminRequest.id()) - .password(bCryptPasswordEncoder.encode(adminRequest.password())) - .phoneNumber(adminRequest.phoneNumber()) - .carYn(adminRequest.carYn()) - .profileUrl(profileUrl) - .role(role) - .center(center) - .createdTime(now) - .build(); - - return memberRepository.save(member); - } - - // 요양보호사 회원 등록 - @Transactional - public void workerRegisterMember(CreateMemberRequest memberRequest) { - LocalDateTime now = LocalDateTime.now(); - - String profileUrl = "https://theaverageagegottenyounger.s3.ap-northeast-2.amazonaws.com/blaybus-basic-profile-image.png"; - if (StringUtils.hasText(memberRequest.profileUrl())) profileUrl = memberRequest.profileUrl(); - - MemberRole role = MemberRole.WORKER; - Member member = Member.builder() - .id(memberRequest.id()) - .password(bCryptPasswordEncoder.encode(memberRequest.password())) - .name(memberRequest.name()) - .phoneNumber(memberRequest.phoneNumber()) - .address(new Address(memberRequest.city(), memberRequest.gu(), memberRequest.dong(), null)) - .profileUrl(profileUrl) - .role(role) - .carYn(memberRequest.carYn()) - .dementiaEducationYn(memberRequest.dementiaEducationYn()) - .career(memberRequest.career()) - .introduction(memberRequest.introduction()) - .careerPeriod(memberRequest.careerPeriod()) - .createdTime(now) - .careStyle(memberRequest.careStyle()) - .build(); - - memberRepository.save(member); - - memberRequest.certificate().forEach(c -> { - CertificateType type = switch (c.getType()) { - case "요양보호사" -> CertificateType.CARE; - case "사회복지사" -> CertificateType.SOCIAL; - case "간호조무사" -> CertificateType.NURSE; - default -> null; - }; - - CertificateGrade grade = null; - if (c.getGrade() != null) { - grade = switch (c.getGrade()) { - case "1급" -> CertificateGrade.GRADE1; - case "2급" -> CertificateGrade.GRADE2; - default -> null; - }; - } - - Certificate certificate = Certificate.builder() - .type(type) - .number(c.getNumber()) - .grade(grade) - .member(member) - .createdTime(now) - .build(); - - certificateRepository.save(certificate); + private final MemberRepository memberRepository; + private final CertificateRepository certificateRepository; + private final CenterRepository centerRepository; + private final BCryptPasswordEncoder bCryptPasswordEncoder; + private final JwtProvider jwtProvider; + + // 관리자 회원 등록 + @Transactional + public Member adminRegisterMember(CreateAdminRequest adminRequest) { + LocalDateTime now = LocalDateTime.now(); + + String profileUrl = "https://theaverageagegottenyounger.s3.ap-northeast-2.amazonaws.com/blaybus-basic-profile-image.png"; + if (StringUtils.hasText(adminRequest.profileUrl())) profileUrl = adminRequest.profileUrl(); + + Center center = centerRepository.findByName(adminRequest.center().name()); + MemberRole role = MemberRole.ADMIN; + Member member = Member.builder() + .id(adminRequest.id()) + .password(bCryptPasswordEncoder.encode(adminRequest.password())) + .phoneNumber(adminRequest.phoneNumber()) + .carYn(adminRequest.carYn()) + .profileUrl(profileUrl) + .role(role) + .center(center) + .createdTime(now) + .build(); + + return memberRepository.save(member); + } + + // 요양보호사 회원 등록 + @Transactional + public void workerRegisterMember(CreateMemberRequest memberRequest) { + LocalDateTime now = LocalDateTime.now(); + + String profileUrl = "https://theaverageagegottenyounger.s3.ap-northeast-2.amazonaws.com/blaybus-basic-profile-image.png"; + if (StringUtils.hasText(memberRequest.profileUrl())) profileUrl = memberRequest.profileUrl(); + + MemberRole role = MemberRole.WORKER; + Member member = Member.builder() + .id(memberRequest.id()) + .password(bCryptPasswordEncoder.encode(memberRequest.password())) + .name(memberRequest.name()) + .phoneNumber(memberRequest.phoneNumber()) + .address(new Address(memberRequest.city(), memberRequest.gu(), memberRequest.dong(), null)) + .profileUrl(profileUrl) + .role(role) + .carYn(memberRequest.carYn()) + .dementiaEducationYn(memberRequest.dementiaEducationYn()) + .career(memberRequest.career()) + .introduction(memberRequest.introduction()) + .careerPeriod(memberRequest.careerPeriod()) + .createdTime(now) + .careStyle(memberRequest.careStyle()) + .build(); + + memberRepository.save(member); + + memberRequest.certificate().forEach(c -> { + CertificateType type = switch (c.getType()) { + case "요양보호사" -> CertificateType.CARE; + case "사회복지사" -> CertificateType.SOCIAL; + case "간호조무사" -> CertificateType.NURSE; + default -> null; + }; + + CertificateGrade grade = null; + if (c.getGrade() != null) { + grade = switch (c.getGrade()) { + case "1급" -> CertificateGrade.GRADE1; + case "2급" -> CertificateGrade.GRADE2; + default -> null; + }; + } + + Certificate certificate = Certificate.builder() + .type(type) + .number(c.getNumber()) + .grade(grade) + .member(member) + .createdTime(now) + .build(); + + certificateRepository.save(certificate); + }); + } + + // 회원 아이디 중복 체크 + public String duplicationIdCheck(String memberId) { + Member member = memberRepository.findById(memberId).orElse(null); + if (member != null) return null; + return "OK"; + } + + // 회원 이름 중복 체크 + public String duplicationNameCheck(String memberName) { + List member = memberRepository.findByName(memberName).orElse(null); + assert member != null; + if (!member.isEmpty()) return null; + return "OK"; + } + + // 회원 조회 + public Object getMember(String memberId) { + Member member = memberRepository.findById(memberId).orElse(null); + Optional> certificate = certificateRepository.findByMember(member); + + List getCertificate = new ArrayList<>(); + GetMember getMember; + GetAdmin getAdmin; + if (member != null) { + if (certificate.isPresent() && member.getRole() == MemberRole.WORKER) { + certificate.get().forEach(c -> { + getCertificate.add(new CreateCertificateRequest(c.getType().getValue(), c.getNumber(), c.getGrade().getValue())); }); - } - // 회원 아이디 중복 체크 - public String duplicationIdCheck(String memberId) { - Member member = memberRepository.findById(memberId).orElse(null); - if (member != null) return null; - return "OK"; - } - - // 회원 이름 중복 체크 - public String duplicationNameCheck(String memberName) { - List member = memberRepository.findByName(memberName).orElse(null); - assert member != null; - if (!member.isEmpty()) return null; - return "OK"; - } + getMember = GetMember.builder() + .id(member.getId()) + .name(member.getName()) + .profileUrl(member.getProfileUrl()) + .phoneNumber(member.getPhoneNumber()) + .city(member.getAddress().getCity()) + .gu(member.getAddress().getDistrict()) + .dong(member.getAddress().getDong()) + .certificate(getCertificate) + .profileUrl(member.getProfileUrl()) + .style(member.getCareStyle().getValue()) + .build(); - // 회원 조회 - public Object getMember(String memberId) { - Member member = memberRepository.findById(memberId).orElse(null); - Optional> certificate = certificateRepository.findByMember(member); - - List getCertificate = new ArrayList<>(); - GetMember getMember; - GetAdmin getAdmin; - if (member != null) { - if (certificate.isPresent() && member.getRole() == MemberRole.WORKER) { - certificate.get().forEach(c -> { - getCertificate.add(new CreateCertificateRequest(c.getType().getValue(), c.getNumber(), c.getGrade().getValue())); - }); - - getMember = GetMember.builder() - .id(member.getId()) - .name(member.getName()) - .profileUrl(member.getProfileUrl()) - .phoneNumber(member.getPhoneNumber()) - .city(member.getAddress().getCity()) - .gu(member.getAddress().getDistrict()) - .dong(member.getAddress().getDong()) - .certificate(getCertificate) - .profileUrl(member.getProfileUrl()) - .style(member.getCareStyle().getValue()) - .build(); - - return getMember; - } else if (member.getRole() == MemberRole.ADMIN) { - Center center = centerRepository.findById(member.getCenter().getId()).orElse(null); - - if (center != null) { - getAdmin = GetAdmin.builder() - .id(member.getId()) - .profileUrl(member.getProfileUrl()) - .carYn(member.getCarYn()) - .phoneNumber(member.getPhoneNumber()) - .center( - GetCenterCheckResponse.builder() - .name(center.getName()) - .bathCarYn(center.getBathCarYn()) - .operationPeriod(center.getOperationPeriod()) - .city(center.getAddress().getCity()) - .gu(center.getAddress().getDistrict()) - .dong(center.getAddress().getDong()) - .introduction(center.getIntroduction()) - .grade(center.getGrade()) - .build() - ).build(); - - return getAdmin; - } - } + return getMember; + } + else if (member.getRole() == MemberRole.ADMIN) { + Center center = centerRepository.findById(member.getCenter().getId()).orElse(null); + + if (center != null) { + getAdmin = GetAdmin.builder() + .id(member.getId()) + .profileUrl(member.getProfileUrl()) + .carYn(member.getCarYn()) + .phoneNumber(member.getPhoneNumber()) + .center( + GetCenterCheckResponse.builder() + .name(center.getName()) + .bathCarYn(center.getBathCarYn()) + .operationPeriod(center.getOperationPeriod()) + .city(center.getAddress().getCity()) + .gu(center.getAddress().getDistrict()) + .dong(center.getAddress().getDong()) + .introduction(center.getIntroduction()) + .grade(center.getGrade()) + .build() + ).build(); + + return getAdmin; } - - return null; + } } - public String login(String id, String password) { - Optional optionalMember = memberRepository.findById(id); - if (optionalMember.isEmpty() || !bCryptPasswordEncoder.matches(password, optionalMember.get().getPassword())) { - throw new GeneralException(ErrorStatus.BAD_REQUEST, "아이디 또는 비밀번호가 일치하지 않습니다."); - } + return null; + } - return jwtProvider.createAccessToken(id, String.valueOf(optionalMember.get().getRole())); + public LoginResponse login(String id, String password) { + Optional optionalMember = memberRepository.findById(id); + if (optionalMember.isEmpty() || !bCryptPasswordEncoder.matches(password, optionalMember.get().getPassword())) { + throw new GeneralException(ErrorStatus.BAD_REQUEST, "아이디 또는 비밀번호가 일치하지 않습니다."); } - public CurrentMemberResponse getCurrentMember() { - Member member = memberRepository.findById(SecurityUtils.getCurrentMemberName()) - .orElseThrow(() -> new GeneralException(ErrorStatus.KEY_NOT_EXIST)); - return CurrentMemberResponse.builder() - .memberId(member.getId()) - .role(member.getRole()) - .build(); - } + return LoginResponse.builder() + .accessToken(jwtProvider.createAccessToken(id, String.valueOf(optionalMember.get().getRole()))) + .role(optionalMember.get().getRole()) + .build(); + } + + public CurrentMemberResponse getCurrentMember() { + Member member = memberRepository.findById(SecurityUtils.getCurrentMemberName()) + .orElseThrow(() -> new GeneralException(ErrorStatus.KEY_NOT_EXIST)); + return CurrentMemberResponse.builder() + .memberId(member.getId()) + .role(member.getRole()) + .build(); + } } diff --git a/src/main/java/young/blaybus/util/enums/CareStyle.java b/src/main/java/young/blaybus/util/enums/CareStyle.java index 016c3da..0e1ed80 100644 --- a/src/main/java/young/blaybus/util/enums/CareStyle.java +++ b/src/main/java/young/blaybus/util/enums/CareStyle.java @@ -7,11 +7,11 @@ @RequiredArgsConstructor public enum CareStyle { - STYLE1("메뉴얼과 규칙을 중요시하는 꼼꼼형"), - STYLE2("조용하고 신뢰있게 돕는 차분형"), - STYLE3("필요에 따라 유연하게 조정하는 균형형"), - STYLE4("감정에 공감하는 정서 교감형"), - STYLE5("친근한 가족같이 적극적인 돌봄"); + STYLE1("📖 메뉴얼과 규칙을 중요시하는 꼼꼼형"), + STYLE2("😌 조용하고 신뢰있게 돕는 차분형"), + STYLE3("⚖️ 필요에 따라 유연하게 조정하는 균형형"), + STYLE4("🤝 감정에 공감하는 정서 교감형"), + STYLE5("🧒 친근한 가족같이 적극적인 돌봄"); private final String value; }