Skip to content

Commit 7b2f5be

Browse files
authored
Merge pull request #8 from SkyLightQP/feature/user-update-delete-api
feat: implement api to update and delete user data
2 parents 25cf3e4 + 0f806ba commit 7b2f5be

File tree

13 files changed

+168
-17
lines changed

13 files changed

+168
-17
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ NAVER_SECRET=
2828
DIARY_SECRET=
2929
3030
CORS_ORIGINS=http://localhost:3000,http://frontend
31+
32+
MINIO_ENDPOINT=
33+
MINIO_ACCESS_KEY=
34+
MINIO_SECRET_KEY=
35+
MINIO_BUCKET_NAME=
36+
MINIO_PRESIGNED_URL_EXPIRATION=
3137
```
3238

3339
## 프론트엔드
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package me.daegyeo.maru.user.adaptor.`in`.web
2+
3+
import me.daegyeo.maru.auth.application.domain.CustomUserDetails
4+
import me.daegyeo.maru.user.adaptor.`in`.web.dto.UpdateUserDto
5+
import me.daegyeo.maru.user.application.port.`in`.DeleteUserUseCase
6+
import me.daegyeo.maru.user.application.port.`in`.UpdateUserUseCase
7+
import me.daegyeo.maru.user.application.port.`in`.command.UpdateUserUseCaseCommand
8+
import org.springframework.security.access.prepost.PreAuthorize
9+
import org.springframework.security.core.annotation.AuthenticationPrincipal
10+
import org.springframework.web.bind.annotation.DeleteMapping
11+
import org.springframework.web.bind.annotation.PutMapping
12+
import org.springframework.web.bind.annotation.RequestBody
13+
import org.springframework.web.bind.annotation.RequestMapping
14+
import org.springframework.web.bind.annotation.RestController
15+
16+
@RestController
17+
@RequestMapping("/user")
18+
class UserController(
19+
private val updateUserUseCase: UpdateUserUseCase,
20+
private val deleteUserUseCase: DeleteUserUseCase,
21+
) {
22+
@PreAuthorize("hasRole('USER')")
23+
@PutMapping
24+
fun updateUser(
25+
@RequestBody body: UpdateUserDto,
26+
@AuthenticationPrincipal auth: CustomUserDetails,
27+
): Boolean {
28+
updateUserUseCase.updateUser(
29+
auth.userId,
30+
UpdateUserUseCaseCommand(
31+
nickname = body.nickname,
32+
),
33+
)
34+
return true
35+
}
36+
37+
@PreAuthorize("hasRole('USER')")
38+
@DeleteMapping
39+
fun deleteUser(
40+
@AuthenticationPrincipal auth: CustomUserDetails,
41+
): Boolean {
42+
deleteUserUseCase.deleteUser(auth.userId)
43+
return true
44+
}
45+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package me.daegyeo.maru.user.adaptor.`in`.web.dto
2+
3+
data class UpdateUserDto(
4+
val nickname: String,
5+
)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package me.daegyeo.maru.user.adaptor.out.persistence
2+
3+
import me.daegyeo.maru.user.application.port.out.DeleteUserPort
4+
import org.springframework.stereotype.Component
5+
import java.util.UUID
6+
7+
@Component
8+
class DeleteUserPersistenceAdapter(private val userRepository: UserRepository) : DeleteUserPort {
9+
override fun deleteUser(userId: UUID): Boolean {
10+
userRepository.deleteById(userId)
11+
return true
12+
}
13+
}

src/main/kotlin/me/daegyeo/maru/user/adaptor/out/persistence/UpdateUserPersistence.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ class UpdateUserPersistence(private val userRepository: UserRepository, private
1818
val user = userRepository.findById(userId).getOrNull()
1919
user?.let {
2020
if (inputUser.nickname != null) it.nickname = inputUser.nickname
21-
if (inputUser.deletedAt != null) it.deletedAt = inputUser.deletedAt
2221
return userMapper.toDomain(userRepository.save(it))
2322
}
2423
return null
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package me.daegyeo.maru.user.application.port.`in`
2+
3+
import java.util.UUID
4+
5+
fun interface DeleteUserUseCase {
6+
fun deleteUser(userId: UUID)
7+
}
Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package me.daegyeo.maru.user.application.port.`in`.command
22

3-
import java.time.ZonedDateTime
4-
53
data class UpdateUserUseCaseCommand(
6-
val nickname: String?,
7-
val deletedAt: ZonedDateTime?,
4+
val nickname: String,
85
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package me.daegyeo.maru.user.application.port.out
2+
3+
import java.util.UUID
4+
5+
fun interface DeleteUserPort {
6+
fun deleteUser(userId: UUID): Boolean
7+
}
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package me.daegyeo.maru.user.application.port.out.dto
22

3-
import java.time.ZonedDateTime
4-
53
data class UpdateUserDto(
64
val nickname: String?,
7-
val deletedAt: ZonedDateTime?,
85
)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package me.daegyeo.maru.user.application.service
2+
3+
import me.daegyeo.maru.diary.application.port.`in`.DeleteDiaryUseCase
4+
import me.daegyeo.maru.diary.application.port.`in`.GetAllDiaryUseCase
5+
import me.daegyeo.maru.user.application.port.`in`.DeleteUserUseCase
6+
import me.daegyeo.maru.user.application.port.`in`.GetUserUseCase
7+
import me.daegyeo.maru.user.application.port.out.DeleteUserPort
8+
import org.slf4j.LoggerFactory
9+
import org.springframework.stereotype.Service
10+
import org.springframework.transaction.annotation.Transactional
11+
import java.util.UUID
12+
13+
@Service
14+
class DeleteUserService(
15+
private val deleteUserPort: DeleteUserPort,
16+
private val getUserUseCase: GetUserUseCase,
17+
private val getAllDiaryUseCase: GetAllDiaryUseCase,
18+
private val deleteDiaryUseCase: DeleteDiaryUseCase,
19+
) : DeleteUserUseCase {
20+
private val logger = LoggerFactory.getLogger(this::class.java)
21+
22+
@Transactional
23+
override fun deleteUser(userId: UUID) {
24+
val isExistsUser = getUserUseCase.getUser(userId)
25+
26+
val diaries = getAllDiaryUseCase.getAllDiaryByUserId(isExistsUser.userId)
27+
diaries.forEach {
28+
deleteDiaryUseCase.deleteDiary(it.diaryId, isExistsUser.userId)
29+
}
30+
deleteUserPort.deleteUser(isExistsUser.userId)
31+
32+
logger.info("User 데이터를 삭제하고 탈퇴했습니다. $userId")
33+
}
34+
}

0 commit comments

Comments
 (0)