From d5429716a5e62a063bf4c872141dcc3ea3ba4246 Mon Sep 17 00:00:00 2001 From: Seokyeong Date: Tue, 30 Jan 2024 06:39:07 +0900 Subject: [PATCH 1/5] move: make member folder --- .../java/com/fullcar/carpool/application/CarpoolMapper.java | 2 +- .../member/application/auth/CustomUserDetailService.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/fullcar/carpool/application/CarpoolMapper.java b/src/main/java/com/fullcar/carpool/application/CarpoolMapper.java index 9f76a44..1a42bc8 100644 --- a/src/main/java/com/fullcar/carpool/application/CarpoolMapper.java +++ b/src/main/java/com/fullcar/carpool/application/CarpoolMapper.java @@ -25,7 +25,7 @@ public CarpoolResponseDto toDto(Carpool carpool, Member member) { .money(carpool.getCost().getMoney()) .content(carpool.getContent()) .moodType(carpool.getMoodType()) - .companyName(member.getCompany()) + .companyName(member.getCompany().getCompanyName()) .gender(member.getGender()) .createdAt(carpool.getCreatedAt()) .build(); diff --git a/src/main/java/com/fullcar/member/application/auth/CustomUserDetailService.java b/src/main/java/com/fullcar/member/application/auth/CustomUserDetailService.java index 5784bbc..0cba3fb 100644 --- a/src/main/java/com/fullcar/member/application/auth/CustomUserDetailService.java +++ b/src/main/java/com/fullcar/member/application/auth/CustomUserDetailService.java @@ -1,5 +1,6 @@ package com.fullcar.member.application.auth; +import com.fullcar.member.application.member.MemberService; import com.fullcar.member.domain.member.Member; import com.fullcar.member.domain.member.MemberId; import com.fullcar.member.presentation.auth.dto.CustomUserDetails; From a8f4bb8446ca4c6ad1cd6a778ef945fc74a4019e Mon Sep 17 00:00:00 2001 From: Seokyeong Date: Tue, 30 Jan 2024 06:40:06 +0900 Subject: [PATCH 2/5] feat: company selection api --- .../application/member/CompanyMapper.java | 19 ++++++++++ .../{auth => member}/MemberService.java | 15 ++++++-- .../fullcar/member/domain/member/Company.java | 24 ++++++++++++ .../fullcar/member/domain/member/Member.java | 7 +++- .../presentation/auth/MemberController.java | 7 ---- .../presentation/member/MemberController.java | 38 +++++++++++++++++++ .../member/dto/request/CompanyRequestDto.java | 21 ++++++++++ 7 files changed, 119 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/fullcar/member/application/member/CompanyMapper.java rename src/main/java/com/fullcar/member/application/{auth => member}/MemberService.java (58%) create mode 100644 src/main/java/com/fullcar/member/domain/member/Company.java delete mode 100644 src/main/java/com/fullcar/member/presentation/auth/MemberController.java create mode 100644 src/main/java/com/fullcar/member/presentation/member/MemberController.java create mode 100644 src/main/java/com/fullcar/member/presentation/member/dto/request/CompanyRequestDto.java diff --git a/src/main/java/com/fullcar/member/application/member/CompanyMapper.java b/src/main/java/com/fullcar/member/application/member/CompanyMapper.java new file mode 100644 index 0000000..6bda4d3 --- /dev/null +++ b/src/main/java/com/fullcar/member/application/member/CompanyMapper.java @@ -0,0 +1,19 @@ +package com.fullcar.member.application.member; + +import com.fullcar.member.domain.member.Company; +import com.fullcar.member.presentation.member.dto.request.CompanyRequestDto; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class CompanyMapper { + public Company toEntity(CompanyRequestDto companyRequestDto) { + return Company.builder() + .companyName(companyRequestDto.getCompanyName()) + .latitude(companyRequestDto.getLatitude()) + .longitude(companyRequestDto.getLongitude()) + .build(); + } +} diff --git a/src/main/java/com/fullcar/member/application/auth/MemberService.java b/src/main/java/com/fullcar/member/application/member/MemberService.java similarity index 58% rename from src/main/java/com/fullcar/member/application/auth/MemberService.java rename to src/main/java/com/fullcar/member/application/member/MemberService.java index 62d4c7e..ce8fb76 100644 --- a/src/main/java/com/fullcar/member/application/auth/MemberService.java +++ b/src/main/java/com/fullcar/member/application/member/MemberService.java @@ -1,18 +1,20 @@ -package com.fullcar.member.application.auth; +package com.fullcar.member.application.member; import com.fullcar.core.exception.NotFoundException; import com.fullcar.core.response.ErrorCode; -import com.fullcar.member.domain.member.Member; -import com.fullcar.member.domain.member.MemberId; -import com.fullcar.member.domain.member.MemberRepository; +import com.fullcar.member.domain.member.*; +import com.fullcar.member.presentation.member.dto.request.CompanyRequestDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +@Validated @Service @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; + private final CompanyMapper companyMapper; /** * 회원을 식별자로 조회합니다. @@ -26,4 +28,9 @@ public Member findByMemberId(MemberId memberId) { .orElseThrow(() -> new NotFoundException(ErrorCode.NOT_EXIST_USER)); } + @Transactional + public void registerCompany(Member member, CompanyRequestDto companyRequestDto) { + Company company = companyMapper.toEntity(companyRequestDto); + memberRepository.findByIdAndIsDeletedOrThrow(member.getId(), false).updateCompany(company); + } } diff --git a/src/main/java/com/fullcar/member/domain/member/Company.java b/src/main/java/com/fullcar/member/domain/member/Company.java new file mode 100644 index 0000000..8da8ed5 --- /dev/null +++ b/src/main/java/com/fullcar/member/domain/member/Company.java @@ -0,0 +1,24 @@ +package com.fullcar.member.domain.member; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import static lombok.AccessLevel.PROTECTED; + +@Embeddable +@Getter +@Builder +@NoArgsConstructor(access = PROTECTED) +@AllArgsConstructor(access = PROTECTED) +public class Company { + @Column(name = "company_name") + private String companyName; + + private Double latitude; + + private Double longitude; +} diff --git a/src/main/java/com/fullcar/member/domain/member/Member.java b/src/main/java/com/fullcar/member/domain/member/Member.java index 7b2781e..0c7b733 100644 --- a/src/main/java/com/fullcar/member/domain/member/Member.java +++ b/src/main/java/com/fullcar/member/domain/member/Member.java @@ -34,7 +34,8 @@ public class Member { private SocialId socialId; - private String company; + @Embedded + private Company company; @Length(min=2, max=10) @Column(length = 10) @@ -74,4 +75,8 @@ public void loginMember(String deviceToken, String refreshToken) { public void updateCarInformation(CarId carId) { this.carId = carId; } + + public void updateCompany(Company company) { + this.company = company; + } } diff --git a/src/main/java/com/fullcar/member/presentation/auth/MemberController.java b/src/main/java/com/fullcar/member/presentation/auth/MemberController.java deleted file mode 100644 index cb2664c..0000000 --- a/src/main/java/com/fullcar/member/presentation/auth/MemberController.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.fullcar.member.presentation.auth; - -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class MemberController { -} diff --git a/src/main/java/com/fullcar/member/presentation/member/MemberController.java b/src/main/java/com/fullcar/member/presentation/member/MemberController.java new file mode 100644 index 0000000..6e3bc1b --- /dev/null +++ b/src/main/java/com/fullcar/member/presentation/member/MemberController.java @@ -0,0 +1,38 @@ +package com.fullcar.member.presentation.member; + +import com.fullcar.core.annotation.CurrentMember; +import com.fullcar.core.response.ApiResponse; +import com.fullcar.core.response.SuccessCode; +import com.fullcar.member.application.member.MemberService; +import com.fullcar.member.domain.member.Member; +import com.fullcar.member.presentation.member.dto.request.CompanyRequestDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/members") +@Tag(name = "[Member] 멤버 관련 API") +public class MemberController { + + private final MemberService memberService; + + @Operation(summary = "회사 선택 API") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "201", description = "등록 성공"), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 내부 오류", content = @Content) + }) + @PostMapping("/onboarding/company") + public ApiResponse postCompany(@CurrentMember Member member, @RequestBody @Valid CompanyRequestDto companyRequestDto) { + memberService.registerCompany(member, companyRequestDto); + return ApiResponse.success(SuccessCode.REGISTER_SUCCESS); + } +} diff --git a/src/main/java/com/fullcar/member/presentation/member/dto/request/CompanyRequestDto.java b/src/main/java/com/fullcar/member/presentation/member/dto/request/CompanyRequestDto.java new file mode 100644 index 0000000..70cca3f --- /dev/null +++ b/src/main/java/com/fullcar/member/presentation/member/dto/request/CompanyRequestDto.java @@ -0,0 +1,21 @@ +package com.fullcar.member.presentation.member.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.*; + +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class CompanyRequestDto { + @Schema(description = "회사 이름") + @NotBlank + private String companyName; + + @Schema(description = "위도", example = "46.652719") + private Double latitude; + + @Schema(description = "경도", example = "71.530045") + private Double longitude; +} From 034fbe0ef69805ffba40a4febf48bb956c530942 Mon Sep 17 00:00:00 2001 From: Seokyeong Date: Tue, 30 Jan 2024 06:40:17 +0900 Subject: [PATCH 3/5] chore: for swagger --- .../java/com/fullcar/member/presentation/car/CarController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/fullcar/member/presentation/car/CarController.java b/src/main/java/com/fullcar/member/presentation/car/CarController.java index a457cd4..26321f6 100644 --- a/src/main/java/com/fullcar/member/presentation/car/CarController.java +++ b/src/main/java/com/fullcar/member/presentation/car/CarController.java @@ -24,7 +24,7 @@ public class CarController { private final CarService carService; - @Operation(description = "차량 등록") + @Operation(summary = "차량 등록 API") @ApiResponses({ @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "201", description = "등록 성공"), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "서버 내부 오류", content = @Content) From d1d0e7cd305cc6707b3cb0ae3412d40e323feb17 Mon Sep 17 00:00:00 2001 From: Seokyeong Date: Tue, 30 Jan 2024 19:04:48 +0900 Subject: [PATCH 4/5] chore: make company to immutable, double to bigdecimal --- .../member/application/member/MemberService.java | 2 +- .../com/fullcar/member/domain/member/Company.java | 11 +++++------ .../java/com/fullcar/member/domain/member/Member.java | 3 ++- .../member/dto/request/CompanyRequestDto.java | 6 ++++-- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/fullcar/member/application/member/MemberService.java b/src/main/java/com/fullcar/member/application/member/MemberService.java index ce8fb76..1bbd936 100644 --- a/src/main/java/com/fullcar/member/application/member/MemberService.java +++ b/src/main/java/com/fullcar/member/application/member/MemberService.java @@ -31,6 +31,6 @@ public Member findByMemberId(MemberId memberId) { @Transactional public void registerCompany(Member member, CompanyRequestDto companyRequestDto) { Company company = companyMapper.toEntity(companyRequestDto); - memberRepository.findByIdAndIsDeletedOrThrow(member.getId(), false).updateCompany(company); + findByMemberId(member.getId()).updateCompany(company); } } diff --git a/src/main/java/com/fullcar/member/domain/member/Company.java b/src/main/java/com/fullcar/member/domain/member/Company.java index 8da8ed5..c75497f 100644 --- a/src/main/java/com/fullcar/member/domain/member/Company.java +++ b/src/main/java/com/fullcar/member/domain/member/Company.java @@ -2,10 +2,9 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; + +import java.math.BigDecimal; import static lombok.AccessLevel.PROTECTED; @@ -18,7 +17,7 @@ public class Company { @Column(name = "company_name") private String companyName; - private Double latitude; + private BigDecimal latitude; - private Double longitude; + private BigDecimal longitude; } diff --git a/src/main/java/com/fullcar/member/domain/member/Member.java b/src/main/java/com/fullcar/member/domain/member/Member.java index 0c7b733..988ea71 100644 --- a/src/main/java/com/fullcar/member/domain/member/Member.java +++ b/src/main/java/com/fullcar/member/domain/member/Member.java @@ -7,6 +7,7 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -77,6 +78,6 @@ public void updateCarInformation(CarId carId) { } public void updateCompany(Company company) { - this.company = company; + this.company = new Company(company.getCompanyName(), company.getLatitude(), company.getLongitude()); } } diff --git a/src/main/java/com/fullcar/member/presentation/member/dto/request/CompanyRequestDto.java b/src/main/java/com/fullcar/member/presentation/member/dto/request/CompanyRequestDto.java index 70cca3f..5d16d89 100644 --- a/src/main/java/com/fullcar/member/presentation/member/dto/request/CompanyRequestDto.java +++ b/src/main/java/com/fullcar/member/presentation/member/dto/request/CompanyRequestDto.java @@ -4,6 +4,8 @@ import jakarta.validation.constraints.NotBlank; import lombok.*; +import java.math.BigDecimal; + @Getter @Builder @AllArgsConstructor(access = AccessLevel.PROTECTED) @@ -14,8 +16,8 @@ public class CompanyRequestDto { private String companyName; @Schema(description = "위도", example = "46.652719") - private Double latitude; + private BigDecimal latitude; @Schema(description = "경도", example = "71.530045") - private Double longitude; + private BigDecimal longitude; } From 4e4e114829cbe6c34218c21476d7083820895471 Mon Sep 17 00:00:00 2001 From: Seokyeong Date: Tue, 30 Jan 2024 19:06:41 +0900 Subject: [PATCH 5/5] add: requestdto example for swagger --- .../presentation/member/dto/request/CompanyRequestDto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/fullcar/member/presentation/member/dto/request/CompanyRequestDto.java b/src/main/java/com/fullcar/member/presentation/member/dto/request/CompanyRequestDto.java index 5d16d89..3a66c67 100644 --- a/src/main/java/com/fullcar/member/presentation/member/dto/request/CompanyRequestDto.java +++ b/src/main/java/com/fullcar/member/presentation/member/dto/request/CompanyRequestDto.java @@ -11,7 +11,7 @@ @AllArgsConstructor(access = AccessLevel.PROTECTED) @NoArgsConstructor(access = AccessLevel.PROTECTED) public class CompanyRequestDto { - @Schema(description = "회사 이름") + @Schema(description = "회사 이름", example = "네이버") @NotBlank private String companyName;