Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(user): Add user domain convert oas model #41

Merged
merged 4 commits into from
Dec 17, 2024

Conversation

dojinyou
Copy link
Collaborator

@dojinyou dojinyou commented Dec 15, 2024

Summary by CodeRabbit

  • New Features

    • 사용자 프로필 이미지, 프로필 및 원하는 파트너에 대한 OpenAPI 모델 변환 기능 추가.
    • 사용자 정보 조회 및 프로필 위젯 업데이트 메서드 개선.
  • Bug Fixes

    • 사용자 정보 업데이트 메서드에서 API 모델 반환 방식 수정.
  • Refactor

    • 데이터 변환 로직을 전담 메서드로 추상화하여 코드 가독성 및 유지보수성 향상.

@dojinyou dojinyou marked this pull request as ready for review December 15, 2024 02:16
@dojinyou dojinyou requested a review from waterfogSW as a code owner December 15, 2024 02:16
@dojinyou dojinyou self-assigned this Dec 15, 2024
Copy link

coderabbitai bot commented Dec 15, 2024

Walkthrough

이 변경 사항은 사용자 관련 모델 변환을 위한 새로운 OASModelAdapter.kt 파일을 도메인 모델과 OpenAPI 사양(OAS) 모델 간의 변환을 용이하게 하는 확장 함수를 도입했습니다. UserController.kt에서는 이러한 변환 메서드를 활용하여 데이터 매핑 로직을 간소화하고 코드 가독성을 향상시켰습니다.

Changes

파일 변경 요약
bootstrap/api/src/main/kotlin/.../OASModelAdapter.kt 도메인 모델과 OAS 모델 간 변환을 위한 여러 확장 함수 추가
bootstrap/api/src/main/kotlin/.../UserController.kt 메서드 시그니처 업데이트 및 OASModelAdapter를 활용한 모델 변환 로직 리팩토링

Poem

🐰 코드의 토끼, 모델을 춤추게 하네
도메인과 API, 손쉽게 변환해
확장 함수의 마법으로
깔끔하고 우아한 변신
🌈 코드는 더욱 빛나네!


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@dojinyou
Copy link
Collaborator Author

어떤 식으로 할지 고민되어서 우선 function 으로 converting 관리하는 방법으로 해봤어요

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
bootstrap/api/src/main/kotlin/com/threedays/bootstrap/api/user/OASModelAdapter.kt (3)

24-44: 복잡한 변환 로직 분리 제안

현재 구현은 정확하지만, 변환 로직이 다소 복잡합니다. 가독성과 유지보수성을 높이기 위해 중첩된 객체 변환을 별도의 확장 함수로 분리하는 것이 좋습니다.

다음과 같은 리팩토링을 제안합니다:

+private fun com.threedays.domain.user.entity.JobOccupation.toDisplayInfo() =
+    JobOccupationDisplayInfo(
+        code = JobOccupation.valueOf(this.name),
+        display = this.koreanName
+    )

+private fun com.threedays.domain.user.entity.Location.toDisplayInfo() =
+    LocationDisplayInfo(
+        id = this.id.value,
+        display = this.display,
+    )

 fun com.threedays.domain.user.entity.UserProfile.toUserProfileDisplayInfo(): UserProfileDisplayInfo =
     UserProfileDisplayInfo(
         gender = Gender.valueOf(this.gender.name),
         birthYear = this.birthYear.value,
-        jobOccupation = JobOccupationDisplayInfo(
-            code = JobOccupation.valueOf(this.jobOccupation.name),
-            display = this.jobOccupation.koreanName
-        ),
+        jobOccupation = this.jobOccupation.toDisplayInfo(),
-        locations = this.locations.map {
-            LocationDisplayInfo(
-                id = it.id.value,
-                display = it.display,
-            )
-        },
+        locations = this.locations.map { it.toDisplayInfo() },
         company = this.company?.let {
             CompanyDisplayInfo(
                 id = it.id.value,
                 display = it.display,
             )
         },
     )

54-62: 양방향 변환에 대한 테스트 케이스 필요

도메인 모델과 OAS 모델 간의 양방향 변환이 구현되어 있습니다. 이러한 양방향 변환의 정확성을 보장하기 위해 변환 후 원래 상태로 복원되는지 확인하는 테스트가 필요합니다.

양방향 변환 테스트 코드 작성을 도와드릴까요?


64-75: 변환 로직 단순화 제안

현재 구현이 올바르게 작동하지만, 더 간결하게 작성할 수 있습니다.

다음과 같은 리팩토링을 제안합니다:

 fun com.threedays.domain.user.entity.UserDesiredPartner.toOASModel() = UserDesiredPartner(
-    jobOccupations = this.jobOccupations.map {
-        JobOccupation.valueOf(it.name)
-    },
+    jobOccupations = this.jobOccupations.map { JobOccupation.valueOf(it.name) },
     birthYearRange = this.birthYearRange.let {
         BirthYearRange(
             start = it.start?.value,
             end = it.end?.value,
         )
     },
     preferDistance = PreferDistance.valueOf(this.preferDistance.name),
 )
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e8b3505 and 1802d4a.

📒 Files selected for processing (2)
  • bootstrap/api/src/main/kotlin/com/threedays/bootstrap/api/user/OASModelAdapter.kt (1 hunks)
  • bootstrap/api/src/main/kotlin/com/threedays/bootstrap/api/user/UserController.kt (5 hunks)
🧰 Additional context used
📓 Learnings (1)
bootstrap/api/src/main/kotlin/com/threedays/bootstrap/api/user/UserController.kt (1)
Learnt from: waterfogSW
PR: Student-Center/3days-server#22
File: bootstrap/api/src/main/kotlin/com/threedays/bootstrap/api/user/UserController.kt:23-24
Timestamp: 2024-11-12T13:22:13.201Z
Learning: `UserController` (`bootstrap/api/src/main/kotlin/com/threedays/bootstrap/api/user/UserController.kt`)에서 상위 인터페이스에 선언된 헤더 변수(`xRegisterToken` 등)는 변수명이나 어노테이션을 변경하지 않고 그대로 사용합니다.
🔇 Additional comments (5)
bootstrap/api/src/main/kotlin/com/threedays/bootstrap/api/user/OASModelAdapter.kt (2)

46-52: 구현이 깔끔하고 명확합니다

도메인 모델에서 OAS 모델로의 변환이 잘 구현되어 있습니다.


18-22: ⚠️ Potential issue

URL 변환 시 유효성 검증 추가 필요

url.toURI() 호출 시 잘못된 URL 형식에 대한 예외 처리가 없습니다. 유효하지 않은 URL이 입력될 경우 런타임 예외가 발생할 수 있습니다.

다음과 같이 안전한 URL 변환 로직을 추가하는 것을 제안합니다:

-    url = this.url.toURI(),
+    url = runCatching { this.url.toURI() }
+        .getOrElse { throw IllegalArgumentException("Invalid URL format: ${this.url}", it) },
bootstrap/api/src/main/kotlin/com/threedays/bootstrap/api/user/UserController.kt (3)

101-105: 도메인 모델 변환 로직이 잘 적용되었습니다

새로운 확장 함수들을 사용하여 코드가 더 깔끔하고 일관성 있게 정리되었습니다.


152-153: 응답 모델 변환이 일관성 있게 구현되었습니다

도메인 모델에서 응답 모델로의 변환이 새로운 확장 함수를 사용하여 일관성 있게 구현되었습니다.


176-176: 응답 변환이 적절하게 구현되었습니다

desiredPartner의 변환이 새로운 확장 함수를 사용하여 깔끔하게 처리되었습니다.

Copy link
Member

@waterfogSW waterfogSW left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p3) 좋아요 👍🏼 저는 유틸성 확장함수 구현할때 object class 안에 넣는걸 선호하긴 하는데요(네임스페이스 명시적으로 하거나, IDE내 인덱싱때문에) 외부에 따로 빼는걸 선호하시나요?

@dojinyou
Copy link
Collaborator Author

p3) 좋아요 👍🏼 저는 유틸성 확장함수 구현할때 object class 안에 넣는걸 선호하긴 하는데요(네임스페이스 명시적으로 하거나, IDE내 인덱싱때문에) 외부에 따로 빼는걸 선호하시나요?

따로 선호하는 방식은 없고 object class로 해도 큰 상관 없을 것 같아요! 요렇게 수정해볼께요

@dojinyou dojinyou requested a review from waterfogSW December 16, 2024 15:54
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
bootstrap/api/src/main/kotlin/com/threedays/bootstrap/api/user/OASModelAdapter.kt (2)

47-53: 함수 반환 타입 명시로 가독성 향상

toOASModel 함수의 반환 타입이 명시되어 있지 않습니다. 반환 타입을 명시하면 코드의 이해도를 높이고 컴파일러 에러를 사전에 방지할 수 있습니다.

반환 타입을 명시적으로 지정해 주세요:

- fun toOASModel(domainModel: com.threedays.domain.user.entity.UserProfile) = UserProfile(
+ fun toOASModel(domainModel: com.threedays.domain.user.entity.UserProfile): UserProfile = UserProfile(

65-76: birthYearRange 필드의 nullable 처리 주의

birthYearRangestartend가 nullable로 처리되고 있습니다. 이를 사용하는 쪽에서 null 체크를 누락할 경우 문제가 발생할 수 있으므로 기본값을 설정하거나 nullable 임을 명확히 인지할 수 있도록 주석이나 문서화가 필요합니다.

startend에 기본값을 지정하거나 null일 경우를 처리하는 로직을 추가하세요:

birthYearRange = domainModel.birthYearRange?.let {
    BirthYearRange(
        start = it.start?.value ?: DEFAULT_START_YEAR,
        end = it.end?.value ?: DEFAULT_END_YEAR,
    )
}

또는 nullable임을 명확히 하기 위해 코틀린의 nullable 타입을 적극 활용하세요.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1802d4a and 49522ec.

📒 Files selected for processing (2)
  • bootstrap/api/src/main/kotlin/com/threedays/bootstrap/api/user/OASModelAdapter.kt (1 hunks)
  • bootstrap/api/src/main/kotlin/com/threedays/bootstrap/api/user/UserController.kt (5 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • bootstrap/api/src/main/kotlin/com/threedays/bootstrap/api/user/UserController.kt

@dojinyou dojinyou merged commit d2afb97 into main Dec 17, 2024
4 checks passed
@dojinyou dojinyou deleted the refactor/user-reponse branch December 17, 2024 10:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants