diff --git a/README.md b/README.md index 45d3f5a..c99c1d9 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,8 @@ --- -### ๐Ÿ ๋ฉ”๋ชจ ์กฐํšŒ ๊ธฐ๋Šฅ +### โœ… ๋ฉ”๋ชจ ์กฐํšŒ ๊ธฐ๋Šฅ -- ๋ฉ”๋ชจ์˜ id๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. - ์ „์ฒด ๋ฉ”๋ชจ๋ฅผ ๋‚ ์งœ์ˆœ์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ### โš ๏ธ ๋ฉ”๋ชจ ์กฐํšŒ ๊ธฐ๋Šฅ ๊ณ ๋ ค ์‚ฌํ•ญ @@ -41,13 +40,15 @@ --- -### โ˜‘๏ธ ๋ฉ”๋ชจ ์‚ญ์ œ ๊ธฐ๋Šฅ +### โœ… ๋ฉ”๋ชจ ์‚ญ์ œ ๊ธฐ๋Šฅ - ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. - ๋ฉ”๋ชจ๋ฅผ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ๊ฐœ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ### โš ๏ธ ๋ฉ”๋ชจ ์‚ญ์ œ ๊ธฐ๋Šฅ ์˜ˆ์™ธ ์ƒํ™ฉ +- ์‚ญ์ œํ•  ๋ฉ”๋ชจ๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ์ˆ˜ํ–‰๋„ ํ•ด์„  ์•ˆ๋œ๋‹ค. + --- ### โ˜‘๏ธ ๋ฉ”๋ชจ ์ˆ˜์ • ๊ธฐ๋Šฅ diff --git a/src/main/kotlin/com/github/yeoli/devlog/domain/memo/repository/MemoRepository.kt b/src/main/kotlin/com/github/yeoli/devlog/domain/memo/repository/MemoRepository.kt index df5cadb..2d6d123 100644 --- a/src/main/kotlin/com/github/yeoli/devlog/domain/memo/repository/MemoRepository.kt +++ b/src/main/kotlin/com/github/yeoli/devlog/domain/memo/repository/MemoRepository.kt @@ -27,4 +27,14 @@ class MemoRepository : PersistentStateComponent { fun getAll(): List { return state.memos.map { it.toDomain() } } + + private fun removeMemoById(memoId: Long) { + state.memos.removeIf { it.id == memoId } + } + + fun removeMemosById(memoIds: List) { + for (memoId in memoIds) { + removeMemoById(memoId) + } + } } diff --git a/src/main/kotlin/com/github/yeoli/devlog/domain/memo/service/MemoService.kt b/src/main/kotlin/com/github/yeoli/devlog/domain/memo/service/MemoService.kt index fe09bbe..50ab391 100644 --- a/src/main/kotlin/com/github/yeoli/devlog/domain/memo/service/MemoService.kt +++ b/src/main/kotlin/com/github/yeoli/devlog/domain/memo/service/MemoService.kt @@ -97,4 +97,15 @@ class MemoService(private val project: Project) { return mutableListOf() } + + fun removeMemos(memos: List) { + if (memos.isEmpty()) return + + try { + val ids: List = memos.map { it.id } + memoRepository.removeMemosById(ids) + } catch (e: Exception) { + logger.warn("[removeMemos] ๋ฉ”๋ชจ ์‚ญ์ œ ์ค‘ ์•Œ ์ˆ˜ ์—†๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ${e.message}", e) + } + } } \ No newline at end of file diff --git a/src/test/kotlin/com/github/yeoli/devlog/domain/memo/service/MemoServiceTest.kt b/src/test/kotlin/com/github/yeoli/devlog/domain/memo/service/MemoServiceTest.kt index f8c7736..de59ddf 100644 --- a/src/test/kotlin/com/github/yeoli/devlog/domain/memo/service/MemoServiceTest.kt +++ b/src/test/kotlin/com/github/yeoli/devlog/domain/memo/service/MemoServiceTest.kt @@ -14,6 +14,7 @@ import com.intellij.util.Function import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import java.awt.Point +import java.time.LocalDateTime import kotlin.test.assertTrue class MemoServiceTest : BasePlatformTestCase() { @@ -240,5 +241,74 @@ class MemoServiceTest : BasePlatformTestCase() { assertTrue(result.isEmpty(), "์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.") } + // ========= ๋ฉ”๋ชจ ์‚ญ์ œ ๊ธฐ๋Šฅ ========= + fun `test ๋ฉ”๋ชจ ์‚ญ์ œ ๊ธฐ๋Šฅ - ์ •์ƒ ์‚ญ์ œ`() { + val now = java.time.LocalDateTime.now() + val memo1 = Memo( + id = 1L, + createdAt = now, + updatedAt = now, + content = "a", + commitHash = null, + filePath = "/path/to/file1", + selectedCodeSnippet = null, + selectionStart = null, + selectionEnd = null, + visibleStart = null, + visibleEnd = null + ) + val memo2 = Memo( + id = 2L, + createdAt = now, + updatedAt = now, + content = "b", + commitHash = null, + filePath = "/path/to/file2", + selectedCodeSnippet = null, + selectionStart = null, + selectionEnd = null, + visibleStart = null, + visibleEnd = null + ) + val memos = listOf(memo1, memo2) + + MemoService(project).removeMemos(memos) + + org.mockito.kotlin.verify(memoRepository) + .removeMemosById(listOf(1L, 2L)) + } + + fun `test ๋ฉ”๋ชจ ์‚ญ์ œ ๊ธฐ๋Šฅ - ๋นˆ ๋ฆฌ์ŠคํŠธ๋Š” Repository๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Œ`() { + MemoService(project).removeMemos(emptyList()) + + org.mockito.kotlin.verify(memoRepository, org.mockito.kotlin.never()) + .removeMemosById(org.mockito.kotlin.any()) + } + + fun `test ๋ฉ”๋ชจ ์‚ญ์ œ ๊ธฐ๋Šฅ - Repository ์˜ˆ์™ธ ๋ฐœ์ƒํ•ด๋„ ์„œ๋น„์Šค๋Š” throw ํ•˜์ง€ ์•Š์Œ`() { + val now = LocalDateTime.now() + val memo = Memo( + id = 10L, + createdAt = now, + updatedAt = now, + content = "x", + commitHash = null, + filePath = "/path/to/file", + selectedCodeSnippet = null, + selectionStart = null, + selectionEnd = null, + visibleStart = null, + visibleEnd = null + ) + + whenever( + memoRepository.removeMemosById(listOf(10L)) + ).thenThrow(RuntimeException("DB error")) + + val result = runCatching { + MemoService(project).removeMemos(listOf(memo)) + } + assertTrue(result.isSuccess, "์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.") + } }