Skip to content

Commit e75fb50

Browse files
committed
Feature: Add support for removing an user
1 parent 8562874 commit e75fb50

File tree

6 files changed

+88
-0
lines changed

6 files changed

+88
-0
lines changed

src/main/kotlin/com/mptsix/todaydiary/controller/UserController.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,11 @@ class UserController(
5656
userService.changePassword(userToken, passwordChangeRequest)
5757
return ResponseEntity.noContent().build()
5858
}
59+
60+
@DeleteMapping("/api/v1/user")
61+
fun removeUser(@RequestHeader header: HttpHeaders): ResponseEntity<Unit> {
62+
val userToken: String = header["X-AUTH-TOKEN"]!![0]
63+
userService.removeUser(userToken)
64+
return ResponseEntity.noContent().build()
65+
}
5966
}

src/main/kotlin/com/mptsix/todaydiary/data/user/UserRepository.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.mptsix.todaydiary.data.user
22

3+
import com.mongodb.client.result.DeleteResult
34
import com.mptsix.todaydiary.data.user.journal.CategoryCountResult
45
import com.mptsix.todaydiary.error.exception.NotFoundException
6+
import com.mptsix.todaydiary.error.exception.UnknownErrorException
57
import org.slf4j.Logger
68
import org.slf4j.LoggerFactory
79
import org.springframework.data.mongodb.core.MongoTemplate
@@ -86,4 +88,18 @@ class UserRepository(
8688

8789
return aggregationResult.mappedResults[0].categoryCount
8890
}
91+
92+
fun removeUser(userId: String) {
93+
val removeQuery: Query = Query(
94+
Criteria.where(userIdField).`is`(userId)
95+
)
96+
val removeResult: DeleteResult = mongoTemplate.remove(removeQuery, User::class.java)
97+
98+
if (!removeResult.wasAcknowledged() || removeResult.deletedCount != 1L) {
99+
logger.error("Cannot remove user: ${userId}!")
100+
logger.error("Query: $removeQuery")
101+
logger.error("Result: $removeResult")
102+
throw UnknownErrorException("Remove failed for userId: $userId")
103+
}
104+
}
89105
}

src/main/kotlin/com/mptsix/todaydiary/service/UserService.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,8 @@ class UserService(
122122
}
123123
userRepository.addUser(user)
124124
}
125+
126+
fun removeUser(userToken: String) {
127+
userRepository.removeUser(getUserIdFromToken(userToken))
128+
}
125129
}

src/test/kotlin/com/mptsix/todaydiary/controller/UserControllerTest.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,4 +188,18 @@ internal class UserControllerTest {
188188

189189
assertThat(responseEntity.statusCode).isEqualTo(HttpStatus.NO_CONTENT)
190190
}
191+
192+
@Test
193+
fun is_removeUser_works_well() {
194+
val loginToken: String = loginUser()
195+
val url: String = "${serverUrl}/api/v1/user"
196+
val httpHeaders: HttpHeaders = HttpHeaders().apply {
197+
put("X-AUTH-TOKEN", listOf(loginToken))
198+
}
199+
200+
val responseEntity: ResponseEntity<Unit> =
201+
restTemplate.exchange(url, HttpMethod.DELETE, HttpEntity<Unit>(httpHeaders))
202+
203+
assertThat(responseEntity.statusCode).isEqualTo(HttpStatus.NO_CONTENT)
204+
}
191205
}

src/test/kotlin/com/mptsix/todaydiary/data/UserRepositoryTest.kt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.mptsix.todaydiary.data.user.UserRepository
55
import com.mptsix.todaydiary.data.user.journal.Journal
66
import com.mptsix.todaydiary.data.user.journal.JournalCategory
77
import com.mptsix.todaydiary.error.exception.NotFoundException
8+
import com.mptsix.todaydiary.error.exception.UnknownErrorException
89
import org.assertj.core.api.Assertions.assertThat
910
import org.assertj.core.api.Assertions.fail
1011
import org.junit.jupiter.api.AfterEach
@@ -14,6 +15,7 @@ import org.junit.jupiter.api.extension.ExtendWith
1415
import org.springframework.beans.factory.annotation.Autowired
1516
import org.springframework.boot.test.context.SpringBootTest
1617
import org.springframework.data.mongodb.core.MongoTemplate
18+
import org.springframework.data.mongodb.core.findAll
1719
import org.springframework.data.mongodb.core.query.Query
1820
import org.springframework.data.mongodb.core.remove
1921
import org.springframework.test.context.junit.jupiter.SpringExtension
@@ -172,4 +174,39 @@ internal class UserRepositoryTest {
172174
}
173175
}
174176

177+
@Test
178+
fun is_removeUser_works_well() {
179+
val mockUserWithJournal: User = User(
180+
userId = "KangDroid",
181+
userPassword = "test",
182+
userName = "KDR",
183+
userDateOfBirth = "WHENEVER",
184+
userPasswordAnswer = "WHAT",
185+
userPasswordQuestion = "WHAT",
186+
journalData = mutableListOf()
187+
)
188+
userRepository.addUser(mockUserWithJournal)
189+
190+
runCatching {
191+
userRepository.removeUser(mockUserWithJournal.userId)
192+
}.onFailure {
193+
println(it.stackTraceToString())
194+
fail("Should be succeed!")
195+
}.onSuccess {
196+
val userList: List<User> = mongoTemplate.findAll()
197+
assertThat(userList.isEmpty()).isEqualTo(true)
198+
}
199+
}
200+
201+
@Test
202+
fun is_removeUser_throws_unknownerror() {
203+
runCatching {
204+
userRepository.removeUser("mockUserWithJournal.userId")
205+
}.onFailure {
206+
assertThat(it is UnknownErrorException).isEqualTo(true)
207+
}.onSuccess {
208+
fail("User list is empty but it succeed?")
209+
}
210+
}
211+
175212
}

src/test/kotlin/com/mptsix/todaydiary/service/UserServiceTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.junit.jupiter.api.extension.ExtendWith
2121
import org.springframework.beans.factory.annotation.Autowired
2222
import org.springframework.boot.test.context.SpringBootTest
2323
import org.springframework.data.mongodb.core.MongoTemplate
24+
import org.springframework.data.mongodb.core.findAll
2425
import org.springframework.data.mongodb.core.query.Query
2526
import org.springframework.data.mongodb.core.remove
2627
import org.springframework.mock.web.MockMultipartFile
@@ -309,4 +310,13 @@ internal class UserServiceTest {
309310
val user: User = userRepository.findByUserId(mockUser.userId)
310311
assertThat(user.userPassword).isEqualTo("whatever")
311312
}
313+
314+
@Test
315+
fun is_removeUser_works_well() {
316+
val loginToken: String = loginUser()
317+
userService.removeUser(loginToken)
318+
319+
val userList: List<User> = mongoTemplate.findAll()
320+
assertThat(userList.isEmpty()).isEqualTo(true)
321+
}
312322
}

0 commit comments

Comments
 (0)