게시글의 컨트롤러는
@RestController
@RequestMapping("/posts")
class PostController(private val postService: PostService) {
@PostMapping
fun createPost(
@RequestBody postRequest: PostRequest,
@AuthenticationPrincipal userPrincipal: UserPrincipal
): ResponseEntity<PostResponse> {
return ResponseEntity.ok(postService.createPost(postRequest, userPrincipal))
}
@PutMapping("/{id}")
fun updatePost(
@PathVariable id: Long,
@RequestBody postRequest: PostRequest,
@AuthenticationPrincipal userPrincipal: UserPrincipal
): ResponseEntity<PostResponse> {
return ResponseEntity.ok(postService.updatePost(id, postRequest, userPrincipal))
}
@GetMapping("/{id}")
fun getPostById(@PathVariable id: Long): ResponseEntity<PostResponse> {
return ResponseEntity.ok(postService.getPostById(id))
}
@DeleteMapping("/{id}")
fun deletePost(
@PathVariable id: Long,
@AuthenticationPrincipal userPrincipal: UserPrincipal
): ResponseEntity<PostResponse> {
postService.deletePost(id, userPrincipal)
return ResponseEntity.noContent().build()
}
@GetMapping
fun getAllPosts(): ResponseEntity<List<PostResponse>> {
return ResponseEntity.ok(postService.getAllPosts())
}
}
이렇게 userPrincipal로 직접 아이디를 인식하게 해서
data class PostRequest(
val title: String,
val content: String,
)
여기에 아이디를 직접 입력하지 않아도 되도록 한다. 나중에 댓글에는 컨트롤러에 직접post의 아이디를 입력하도록 하면 된다.
data class PostResponse(
val id: Long?,
val title: String,
val content: String,
val userId: Long?,
val adminId: Long?
) {
companion object {
fun toResponse(post: Post): PostResponse {
return PostResponse(
id = post.id,
title = post.title,
content = post.content,
userId = post.user?.id,
adminId = post.admin?.id
)
}
}
}
글을 쓰면 이렇세 id, 제목, 내용, 작성한 어드민이나 유저의 아이디를 보여주도록 하고
@Transactional
override fun createPost(postRequest: PostRequest, userPrincipal: UserPrincipal): PostResponse {
// userPrincipal에서 사용자 정보를 받고
val userId = userPrincipal.id
// 각자의 Repository에서 사용자가 존재하는지 확인
val user = userRepository.findById(userId).orElse(null)
val admin = adminRepository.findById(userId).orElse(null)
// 사용자가 존재하지 않으면 예외
if (user == null && admin == null) {
throw ModelNotFoundException("User or Admin not found or deleted", userId)
}
// Post 객체를 생성하고 저장합니다.
val post = Post(
title = postRequest.title,
content = postRequest.content,
user = user,
admin = admin
)
return PostResponse.toResponse(post)//toResponse는 PostResponse의 companion object와 연결
}
서비스 임플은 이렇게 만들었는데 이러면
{
"id": null,
"title": "string",
"content": "string",
"userId": null,
"adminId": 1
} 이런식으로 아이디가 널이 나온다.
@Transactional
override fun createPost(postRequest: PostRequest, userPrincipal: UserPrincipal): PostResponse {
// userPrincipal에서 사용자 정보를 받고
val userId = userPrincipal.id
// 각자의 Repository에서 사용자가 존재하는지 확인
val user = userRepository.findById(userId).orElse(null)
val admin = adminRepository.findById(userId).orElse(null)
// 사용자가 존재하지 않으면 예외
if (user == null && admin == null) {
throw ModelNotFoundException("User or Admin not found or deleted", userId)
}
// Post 객체를 생성하고 저장합니다.
val post = Post(
title = postRequest.title,
content = postRequest.content,
user = user,
admin = admin
)
val savedPost = postRepository.save(post)// 이게 있어야 아이디가 널이 안나오고 아이디 저장 가능
return PostResponse.toResponse(savedPost)//toResponse는 PostResponse의 companion object와 연결
}// savedPost로 저장된 게시글 아이디를 보여줌
그러면 이제 아이디가 제대로 나오게 된다.
그리고 다시 소셜 로그인에 열중하는 중이다.