본문 바로가기

카테고리 없음

게시글 어느정도 완료

게시글의 컨트롤러는 

@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로 저장된 게시글 아이디를 보여줌

 

그러면 이제 아이디가 제대로 나오게 된다.

 

그리고 다시 소셜 로그인에 열중하는 중이다.