Skip to content

feat: 키워드, 매력포인트 추가#829

Open
devfeijoa wants to merge 6 commits intodevelopfrom
feat/828
Open

feat: 키워드, 매력포인트 추가#829
devfeijoa wants to merge 6 commits intodevelopfrom
feat/828

Conversation

@devfeijoa
Copy link
Copy Markdown
Contributor

@devfeijoa devfeijoa commented Mar 10, 2026

📌𝘐𝘴𝘴𝘶𝘦𝘴

📎𝘞𝘰𝘳𝘬 𝘋𝘦𝘴𝘤𝘳𝘪𝘱𝘵𝘪𝘰𝘯

  • 키워드 : 차원이동(세계관), 스팀펑크(소재) 추가
  • 매력포인트 : 필력 추가 ( 작품 평가, 작품 정보, 마이페이지, 서재 필터링 )

📷𝘚𝘤𝘳𝘦𝘦𝘯𝘴𝘩𝘰𝘵

Screen_recording_20260310_182431.mp4
Screenshot_20260310_182537 Screenshot_20260325_153448

💬𝘛𝘰 𝘙𝘦𝘷𝘪𝘦𝘸𝘦𝘳𝘴

  1. 키워드 관련
  • 서버에서 키워드가 추가되면 자동으로 추가되는 것으로 보여 따로 수정한 코드는 없습니다.
  1. 매력포인트 관련
    작품 평가 화면의 매력포인트 부분을 '필력'을 추가 하면서 2줄 구조로 변경했습니다.
    기존 방식은 줄바꿈 시 각 줄이 start 정렬되어 피그마와 다르게 보였고, 이번에는 각 row를 별도 그룹으로 분리해 가운데 정렬되도록 수정했습니다.
    따라서 매력포인트 칩 영역을 row1, row2 두 개의 WebsosoChipGroup으로 분리하고, 이를 LinearLayout으로 감싸center_horizontal 정렬되도록 변경했습니다.
    이를 통해 각 줄이 독립적으로 가운데 정렬된 형태로 보이도록 맞췄습니다.

추가로 필력이 노출/매핑되도록 novel_rating_charm_points와 CharmPoint enum을 함께 업데이트했습니다.
추가로, 기존 선택 상태를 갱신하던 로직은 단일 wcgNovelRatingCharmPoints 기준이었는데, row1/row2 구조로 변경되면서 두 그룹을 모두 순회하도록 수정했습니다.

작품 평가 화면과 마이페이지가 매력포인트를 각각 다른 enum/매핑으로 관리하고 있어, 필력 값이 마이페이지에서 누락되고 있었습니다. 따라서 해당 매핑도 함께 추가했습니다.

서재 필터링에도 필력 아이콘 추가하였습니다.

Summary by CodeRabbit

  • New Features

    • 새로운 매력 포인트 "필력" 추가 및 아이콘 지원
  • Refactor

    • 매력 포인트 표시 로직을 정리하여 두 줄 레이아웃에 맞게 개선
  • UI 변경

    • 매력 포인트 표시 순서 조정 및 두 줄 칩(Chip) 레이아웃 적용으로 가독성 향상
    • 필력 항목이 필터와 목록에 추가되어 선택 가능하게 됨

@devfeijoa devfeijoa requested review from Sadturtleman, m6z1 and s9hn March 10, 2026 07:46
@devfeijoa devfeijoa self-assigned this Mar 10, 2026
@devfeijoa devfeijoa added 🍯 [FEAT] 새로운 기능을 개발합니다. [👸 공주 은영] labels Mar 10, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 10, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

매력포인트에 필력 항목을 추가하고 칩 UI를 한 행에서 두 행으로 분할하는 레이아웃·렌더링·선택 처리 로직을 리팩터링했습니다. 모델·리소스·아이콘·필터 UI도 필력을 반영하도록 업데이트했습니다.

Changes

Cohort / File(s) Summary
모델 & 도메인
app/src/main/java/.../CharmPoint.kt, app/src/main/java/.../AttractivePoints.kt, domain/library/src/main/java/.../AttractivePoint.kt
WRITINGSKILL("writingskill","필력") / WRITINGSKILL("필력") enum 항목 추가; 문자열→enum 변환 로직(CharmPoint)에서 존재하지 않으면 예외를 던지도록 변경.
액티비티 UI 로직
app/src/main/java/com/into/websoso/ui/novelRating/NovelRatingActivity.kt
칩 그룹을 두 개의 행으로 분할하도록 렌더링·업데이트 로직 변경. 칩 생성·클릭 처리를 createCharmPointChip·handleCharmPointClick 등 헬퍼로 추출하고 선택 상태 반영 로직 재구성 및 observer 블록 스타일 정리.
레이아웃 리소스
app/src/main/res/layout/activity_novel_rating.xml
기존 단일 WebsosoChipGroup 제거, LinearLayout ll_novel_rating_charm_points_container 내부에 wcg_novel_rating_charm_points_row1·wcg_novel_rating_charm_points_row2 두 칩 그룹 추가(제약·마진 업데이트 포함).
문자열 & 드로어블 리소스
core/resource/src/main/res/values/strings.xml, core/resource/src/main/res/drawable/ic_library_writingskill.xml
novel_rating_charm_points 값에 필력 추가 및 순서 변경(값: "세계관,소재,필력,캐릭터,관계,분위기"). 신규 아이콘 ic_library_writingskill.xml 추가.
라이브러리 기능 UI
feature/library/src/main/java/.../LibraryListItem.kt, feature/library/src/main/java/.../LibraryFilterBottomSheetAttractivePoints.kt
WRITINGSKILL 아이콘 매핑 추가 및 필터 바텀시트에 필력 항목(아이콘·타이틀·클릭 핸들링) 추가.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested labels

🏹 궁사 명지

Suggested reviewers

  • s9hn
  • m6z1

Poem

🐰 필력 한 점 폴짝 뛰어와, 칩 두 줄에 자리 잡았네.
클릭하면 반짝, 선택은 살랑, 코드엔 새 친구가 왔네.
레이아웃 정리 끝, 아이콘도 샛별처럼 반짝,
토끼가 껑충 뛰며 배포 꿈을 꾸네. ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목 'feat: 키워드, 매력포인트 추가'는 변경사항의 주요 내용을 명확하게 요약하고 있으며, 키워드 추가와 매력포인트(필력) 추가라는 핵심 기능을 포함하고 있습니다.
Linked Issues check ✅ Passed PR은 이슈 #828의 모든 요구사항을 충족합니다: 키워드 두 개(차원이동, 스팀펑크) 추가 및 매력포인트(필력) 추가가 구현되었습니다.
Out of Scope Changes check ✅ Passed 변경사항들은 모두 이슈 #828의 범위 내에 있으며, 키워드 및 매력포인트 추가와 관련된 UI/모델 변경만 포함되어 있습니다.
Description check ✅ Passed PR 설명서는 필수 섹션(이슈, 작업 설명, 스크린샷, 리뷰어 노트)을 모두 포함하며 변경 사항을 명확하게 설명합니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/828

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@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.

🧹 Nitpick comments (1)
app/src/main/java/com/into/websoso/ui/novelRating/NovelRatingActivity.kt (1)

255-268: 행 분할이 문자열 순서와 3개 고정 가정에 너무 묶여 있습니다.

지금은 6개라 맞아 보이지만, novel_rating_charm_points 순서가 바뀌거나 항목이 하나만 더 늘어도 두 번째 row에 전부 몰립니다. 게다가 XML 쪽 두 row가 모두 singleLine=true라 이후 칩이 잘릴 가능성이 큽니다. 표시 순서는 타입 안전한 목록으로 두고, 행은 chunked(3)처럼 계산하는 쪽이 안전합니다.

♻️ 예시
-        val firstRow = charmPoints.take(3)
-        val secondRow = charmPoints.drop(3)
+        val rows = charmPoints.chunked(3)

         binding.wcgNovelRatingCharmPointsRow1.removeAllViews()
         binding.wcgNovelRatingCharmPointsRow2.removeAllViews()

-        firstRow.forEach { charmPoint ->
+        rows.getOrNull(0).orEmpty().forEach { charmPoint ->
             binding.wcgNovelRatingCharmPointsRow1.addChip(createCharmPointChip(charmPoint))
         }

-        secondRow.forEach { charmPoint ->
+        rows.getOrNull(1).orEmpty().forEach { charmPoint ->
             binding.wcgNovelRatingCharmPointsRow2.addChip(createCharmPointChip(charmPoint))
         }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/into/websoso/ui/novelRating/NovelRatingActivity.kt`
around lines 255 - 268, 현재 NovelRatingActivity에서 charmPoints를 고정
2행(take(3)/drop(3))으로 나누고 있어 항목 수나 순서 변화에 취약합니다; charmPoints =
getString(novel_rating_charm_points).toWrappedCharmPoint()로 받은 리스트를 고정 가정 대신
charmPoints.chunked(3)로 행 단위로 분할하고 각 행(chunk)을 순회하면서 createCharmPointChip을 사용해
칩을 추가하세요; 기존 binding.wcgNovelRatingCharmPointsRow1/Row2는 먼저 removeAllViews()로 비운
뒤 chunk 인덱스에 따라 0이면 Row1, 1이면 Row2에 추가하고 더 많은 chunk가 나오면 새 ChipGroup(또는 XML에서 미리
준비한 추가 행)을 인플레이트하거나 동적으로 생성해 추가하도록 변경해 대처하세요.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@app/src/main/java/com/into/websoso/ui/novelRating/NovelRatingActivity.kt`:
- Around line 255-268: 현재 NovelRatingActivity에서 charmPoints를 고정
2행(take(3)/drop(3))으로 나누고 있어 항목 수나 순서 변화에 취약합니다; charmPoints =
getString(novel_rating_charm_points).toWrappedCharmPoint()로 받은 리스트를 고정 가정 대신
charmPoints.chunked(3)로 행 단위로 분할하고 각 행(chunk)을 순회하면서 createCharmPointChip을 사용해
칩을 추가하세요; 기존 binding.wcgNovelRatingCharmPointsRow1/Row2는 먼저 removeAllViews()로 비운
뒤 chunk 인덱스에 따라 0이면 Row1, 1이면 Row2에 추가하고 더 많은 chunk가 나오면 새 ChipGroup(또는 XML에서 미리
준비한 추가 행)을 인플레이트하거나 동적으로 생성해 추가하도록 변경해 대처하세요.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8196f223-0560-4242-99c7-114ed65fdeef

📥 Commits

Reviewing files that changed from the base of the PR and between 2c1dff4 and e6cb09c.

📒 Files selected for processing (4)
  • app/src/main/java/com/into/websoso/ui/novelRating/NovelRatingActivity.kt
  • app/src/main/java/com/into/websoso/ui/novelRating/model/CharmPoint.kt
  • app/src/main/res/layout/activity_novel_rating.xml
  • core/resource/src/main/res/values/strings.xml

Copy link
Copy Markdown

@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.

🧹 Nitpick comments (1)
app/src/main/java/com/into/websoso/ui/main/myPage/model/AttractivePoints.kt (1)

15-15: fromString()은 표시 문자열까지 함께 받게 해두는 편이 안전합니다.

이 함수는 API 응답 문자열을 바로 받아 변환하는 진입점인데, 현재는 enum name 형태만 매칭해서 한글 라벨이 들어오면 호출부의 mapNotNull에서 조용히 누락됩니다. 같은 개념이 다른 모델에서는 값/표시명을 따로 들고 있으니, 여기서도 korean까지 허용해 두면 포맷 변화에 더 견고합니다.

예시 수정안
-        fun fromString(value: String): AttractivePoints? = entries.find { it.name.equals(value, ignoreCase = true) }
+        fun fromString(value: String): AttractivePoints? =
+            entries.find { point ->
+                point.name.equals(value, ignoreCase = true) || point.korean == value
+            }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/into/websoso/ui/main/myPage/model/AttractivePoints.kt`
at line 15, fromString currently only matches enum constant names so API
responses containing the Korean label get dropped; update
AttractivePoints.fromString to also compare the incoming value against the
enum's display label (e.g., the korean property) in a case-insensitive/trimmed
way so it returns the correct AttractivePoints for either the enum name or its
korean label (keep the signature AttractivePoints?.fromString(value: String) and
search entries by name.equals(value, ignoreCase = true) || korean.equals(value,
ignoreCase = true)).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@app/src/main/java/com/into/websoso/ui/main/myPage/model/AttractivePoints.kt`:
- Line 15: fromString currently only matches enum constant names so API
responses containing the Korean label get dropped; update
AttractivePoints.fromString to also compare the incoming value against the
enum's display label (e.g., the korean property) in a case-insensitive/trimmed
way so it returns the correct AttractivePoints for either the enum name or its
korean label (keep the signature AttractivePoints?.fromString(value: String) and
search entries by name.equals(value, ignoreCase = true) || korean.equals(value,
ignoreCase = true)).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3b6c62ce-8e33-4c8b-9e6a-136a2bf73b9b

📥 Commits

Reviewing files that changed from the base of the PR and between e6cb09c and cb10d7a.

📒 Files selected for processing (1)
  • app/src/main/java/com/into/websoso/ui/main/myPage/model/AttractivePoints.kt

chip.isSelected = previousSelectedCharmPoints.contains(
charmPoints.find { charmPoint -> charmPoint.title == chip.text.toString() },
)
val selectedTitles = previousSelectedCharmPoints.map { it.title }.toSet()
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

previousSelectedCharmPoints가 이미 unique한 값들을 가지며 개수가 적다면 toList가 더 빠른 것으로 알고있습니다!

그리고 데이터가 많다면 mapTo(HashSet()) 구문을 써보는 것도 고려하시면 좋을 것 같아요!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

고생하셨습니다

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

이번 케이스는 selectedTitles를 만든 뒤 각 칩에 대해 포함 여부를 여러 번 확인하는 구조라, 생성 비용보다 조회 비용을 줄이는 쪽이 더 적절하다고 판단해 Set은 유지했습니다.

또 mapTo(hashSetOf()) 방식도 생각해봤지만, 현재 데이터 크기가 작고 매력포인트 특성상 크게 확장될 가능성은 낮아 보여 우선은 가독성을 고려해 map { }.toSet() 형태로 유지했습니다.

말씀 주신 덕분에 생성 비용 관점도 함께 생각해볼 수 있었습니다. 감사합니다!

Copy link
Copy Markdown

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/src/main/java/com/into/websoso/ui/novelRating/NovelRatingActivity.kt`:
- Line 255: The charm-point parsing can return an empty list (via
toWrappedCharmPoint()) and wipe the UI; update the caller in NovelRatingActivity
(where val charmPoints =
getString(novel_rating_charm_points).toWrappedCharmPoint() and similarly for the
other two lines) to handle an empty result by falling back to a safe default
(e.g., keep the raw split tokens or a single "unknown" charm point) instead of
applying an empty list to the chip UI, or alternatively adjust
toWrappedCharmPoint() so it never returns an empty list on parse failure but
returns the original tokens or a sensible fallback; ensure the fix is applied
for the three occurrences currently using toWrappedCharmPoint().
- Around line 220-223: The current forced cast in the chipGroup.forEach block
(view as WebsosoChip) can throw ClassCastException if a non-WebsosoChip view is
present; change this to a safe check or filtering: either iterate only over
WebsosoChip instances using chipGroup.filterIsInstance<WebsosoChip>() or use a
safe cast like val chip = view as? WebsosoChip ?: return@forEach and then set
chip.isSelected = chip.text.toString() in selectedTitles so non-chip views are
skipped safely (locate the code in NovelRatingActivity.kt inside the
chipGroup.forEach block).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2bb16af3-d2c1-4057-ab42-7fb6b02c03d5

📥 Commits

Reviewing files that changed from the base of the PR and between cb10d7a and 4c7a0a2.

📒 Files selected for processing (5)
  • app/src/main/java/com/into/websoso/ui/main/myPage/model/AttractivePoints.kt
  • app/src/main/java/com/into/websoso/ui/novelRating/NovelRatingActivity.kt
  • app/src/main/java/com/into/websoso/ui/novelRating/model/CharmPoint.kt
  • app/src/main/res/layout/activity_novel_rating.xml
  • core/resource/src/main/res/values/strings.xml
🚧 Files skipped from review as they are similar to previous changes (2)
  • app/src/main/java/com/into/websoso/ui/main/myPage/model/AttractivePoints.kt
  • app/src/main/res/layout/activity_novel_rating.xml

Comment on lines +220 to +223
chipGroup.forEach { view ->
val chip = view as WebsosoChip
chip.isSelected = chip.text.toString() in selectedTitles
}
Copy link
Copy Markdown

@coderabbitai coderabbitai bot Mar 18, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

칩 순회 중 강제 캐스팅은 런타임 크래시 위험이 있습니다.

view as WebsosoChip는 추후 레이아웃 변경으로 다른 View가 섞이면 ClassCastException을 유발할 수 있습니다.

🔧 제안 수정안
         ).forEach { chipGroup ->
             chipGroup.forEach { view ->
-                val chip = view as WebsosoChip
-                chip.isSelected = chip.text.toString() in selectedTitles
+                (view as? WebsosoChip)?.let { chip ->
+                    chip.isSelected = chip.text.toString() in selectedTitles
+                }
             }
         }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/into/websoso/ui/novelRating/NovelRatingActivity.kt`
around lines 220 - 223, The current forced cast in the chipGroup.forEach block
(view as WebsosoChip) can throw ClassCastException if a non-WebsosoChip view is
present; change this to a safe check or filtering: either iterate only over
WebsosoChip instances using chipGroup.filterIsInstance<WebsosoChip>() or use a
safe cast like val chip = view as? WebsosoChip ?: return@forEach and then set
chip.isSelected = chip.text.toString() in selectedTitles so non-chip views are
skipped safely (locate the code in NovelRatingActivity.kt inside the
chipGroup.forEach block).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

현재 구조에서는 chipGroup에 createCharmPointChip()으로 생성한 WebsosoChip만 추가된다는 전제로 작성해서 강제 캐스팅을 사용했습니다.

추후 다른 View가 섞일 가능성을 열어두는 방향이라면 방어적으로 처리할 수도 있겠지만, 현재는 잘못된 타입이 들어오는 경우 조용히 넘기기보다 빠르게 드러나는 편이 낫다고 판단했습니다.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@devfeijoa, 납득됩니다. setupCharmPointChips()에서 createCharmPointChip()을 통해서만 칩이 추가되므로 해당 불변식이 코드 구조적으로 보장되어 있고, 잘못된 타입이 유입될 경우 조용히 넘기는 것보다 빠르게 크래시로 드러나게 하는 fail-fast 전략은 타당한 판단입니다. 현재 구조에서는 강제 캐스팅이 적절합니다.

Copy link
Copy Markdown

@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: 1

🧹 Nitpick comments (1)
app/src/main/java/com/into/websoso/ui/novelRating/model/CharmPoint.kt (1)

23-28: 에러 처리 방식 불일치.

toWrappedCharmPoint()는 알 수 없는 값에 대해 예외를 던지지만, toFormattedCharmPoint()는 빈 문자열을 반환합니다. 동일한 enum 내에서 일관된 에러 처리 전략을 사용하는 것이 유지보수에 유리합니다.

♻️ 일관성 개선 제안
 fun String.toFormattedCharmPoint(): String {
-    entries.forEach { charmPoint ->
-        if (charmPoint.value == this) return charmPoint.title
-    }
-    return ""
+    return entries.find { it.value == this }?.title ?: ""
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/src/main/java/com/into/websoso/ui/novelRating/model/CharmPoint.kt` around
lines 23 - 28, toFormattedCharmPoint() currently returns an empty string for
unknown values while toWrappedCharmPoint() throws an exception; change
toFormattedCharmPoint() to mirror the enum's consistent error handling by
throwing the same exception type (e.g., IllegalArgumentException) when no
matching charmPoint is found, and include the input string in the error message
so it matches the behavior of toWrappedCharmPoint() and makes failures explicit.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/src/main/java/com/into/websoso/ui/novelRating/model/CharmPoint.kt`:
- Around line 16-21: The new toWrappedCharmPoint implementation throws
IllegalArgumentException for unknown titles causing potential runtime crashes
and also reports the untrimmed rawTitle in the error; change it to safely handle
unknown values by either filtering them out (return only matching entries) or,
if you keep throwing, trim the value used in the message and include
trimmedTitle in the error; update the logic in toWrappedCharmPoint to use
entries.find { charmPoint -> charmPoint.title == trimmedTitle } ?: (either drop
the item or throw IllegalArgumentException("존재하지 않는 매력포인트입니다: $trimmedTitle"))
so the behavior is null-safe and the error message matches the comparison.

---

Nitpick comments:
In `@app/src/main/java/com/into/websoso/ui/novelRating/model/CharmPoint.kt`:
- Around line 23-28: toFormattedCharmPoint() currently returns an empty string
for unknown values while toWrappedCharmPoint() throws an exception; change
toFormattedCharmPoint() to mirror the enum's consistent error handling by
throwing the same exception type (e.g., IllegalArgumentException) when no
matching charmPoint is found, and include the input string in the error message
so it matches the behavior of toWrappedCharmPoint() and makes failures explicit.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 6372ea41-9991-4e25-a1da-25cf1c847f13

📥 Commits

Reviewing files that changed from the base of the PR and between 4c7a0a2 and 2dca29b.

📒 Files selected for processing (1)
  • app/src/main/java/com/into/websoso/ui/novelRating/model/CharmPoint.kt

@Team-WSS Team-WSS deleted a comment from coderabbitai bot Mar 18, 2026
@devfeijoa devfeijoa requested a review from Sadturtleman April 2, 2026 14:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[👸 공주 은영] 🍯 [FEAT] 새로운 기능을 개발합니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: 키워드, 매력포인트 추가

2 participants