Skip to content

Commit

Permalink
Merge pull request #97 from KUSITMS-29th-TEAM-B/feat/flight-83
Browse files Browse the repository at this point in the history
feat: 자기소개서 상세 조회 API 구현
  • Loading branch information
isprogrammingfun authored May 19, 2024
2 parents a361fd5 + 0a24272 commit 4f863c3
Show file tree
Hide file tree
Showing 12 changed files with 160 additions and 8 deletions.
7 changes: 7 additions & 0 deletions Api-Module/src/docs/asciidoc/JobDescription.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,12 @@ operation::JobDescriptionControllerTest/getJobDescription[snippets='http-request

operation::JobDescriptionControllerTest/getJobDescriptionDetail[snippets='http-request,request-headers,path-parameters,http-response,response-fields']

[[GET-APPLY-INFO]]
=== 자기소개서 조회

operation::JobDescriptionControllerTest/getApplyInfo[snippets='http-request,request-headers,path-parameters,http-response,response-fields']





Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.bamyanggang.apimodule.domain.jobDescription.application.dto

class GetApplyInfo {

data class Response(
val applyContentList: List<ContentInfo>
)

data class ContentInfo(
val question: String,
val answer: String
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@ class GetJobDescriptionInfo {
) : Response()

data class Detail(
val remainingDate: Int,
val enterpriseName: String,
val title: String,
val content: String,
val link: String,
val writeStatus: WriteStatus,
val createdAt: LocalDateTime,
val startedAt: LocalDateTime,
val endedAt: LocalDateTime
): Response()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.bamyanggang.apimodule.domain.jobDescription.application.service

import com.bamyanggang.apimodule.domain.jobDescription.application.dto.GetApplyInfo
import com.bamyanggang.domainmodule.domain.jobDescription.service.ApplyReader
import org.springframework.stereotype.Service
import java.util.*

@Service
class ApplyInfoGetService(
private val applyReader: ApplyReader
) {

fun getApplyInfo(jobDescriptionId: UUID): GetApplyInfo.Response {
return applyReader.readApplyByJobDescriptionId(jobDescriptionId).contents.map {
GetApplyInfo.ContentInfo(
it.question,
it.answer
)
}.let {
GetApplyInfo.Response(it)
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,13 @@ class JobDescriptionInfoGetService(
fun getJobDescriptionDetail(jobDescriptionId: UUID): GetJobDescriptionInfo.Response.Detail {
return jobDescriptionReader.readJobDescriptionById(jobDescriptionId).let{ jobDescription ->
GetJobDescriptionInfo.Response.Detail(
jobDescription.getRemainingDate(),
jobDescription.enterpriseName,
jobDescription.title,
jobDescription.content,
jobDescription.link,
jobDescription.writeStatus,
jobDescription.createdAt,
jobDescription.startedAt,
jobDescription.endedAt
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ package com.bamyanggang.apimodule.domain.jobDescription.presentation
import com.bamyanggang.apimodule.common.dto.PageResponse
import com.bamyanggang.apimodule.domain.jobDescription.application.dto.CreateApply
import com.bamyanggang.apimodule.domain.jobDescription.application.dto.CreateJobDescription
import com.bamyanggang.apimodule.domain.jobDescription.application.dto.GetApplyInfo
import com.bamyanggang.apimodule.domain.jobDescription.application.dto.GetJobDescriptionInfo
import com.bamyanggang.apimodule.domain.jobDescription.application.service.ApplyCreateService
import com.bamyanggang.apimodule.domain.jobDescription.application.service.ApplyInfoGetService
import com.bamyanggang.apimodule.domain.jobDescription.application.service.JobDescriptionCreateService
import com.bamyanggang.apimodule.domain.jobDescription.application.service.JobDescriptionInfoGetService
import com.bamyanggang.domainmodule.domain.jobDescription.enums.SortType
Expand All @@ -22,7 +24,8 @@ import java.util.UUID
class JobDescriptionController(
private val jobDescriptionCreateService: JobDescriptionCreateService,
private val applyCreateService: ApplyCreateService,
private val jobDescriptionInfoGetService: JobDescriptionInfoGetService
private val jobDescriptionInfoGetService: JobDescriptionInfoGetService,
private val applyInfoGetService: ApplyInfoGetService
) {

@PostMapping(JobDescriptionApi.BASE_URL)
Expand Down Expand Up @@ -50,4 +53,9 @@ class JobDescriptionController(
@PathVariable("jobDescriptionId") jobDescriptionId: UUID
): GetJobDescriptionInfo.Response.Detail = jobDescriptionInfoGetService.getJobDescriptionDetail(jobDescriptionId)

@GetMapping(JobDescriptionApi.APPLY)
fun getApplyInfo(
@PathVariable("jobDescriptionId") jobDescriptionId: UUID
): GetApplyInfo.Response = applyInfoGetService.getApplyInfo(jobDescriptionId)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.bamyanggang.apimodule.domain.jobDescription.application

import com.bamyanggang.apimodule.domain.jobDescription.application.service.ApplyInfoGetService
import com.bamyanggang.domainmodule.domain.jobDescription.service.ApplyReader
import io.kotest.core.spec.style.BehaviorSpec
import io.mockk.mockk
import io.mockk.verify
import java.util.UUID

class ApplicationInfoGetServiceTest: BehaviorSpec({
val mockApplyReader = mockk<ApplyReader>(relaxed = true)
val service = ApplyInfoGetService(mockApplyReader)

given("ApplyInfoGetService.getApplyInfo") {
val jobDescriptionId: UUID = UUID.randomUUID()
`when`("jobDescriptionId가 주어지면") {
service.getApplyInfo(jobDescriptionId)
then("readApplyByJobDescriptionId가 호출된다.") {
verify {
mockApplyReader.readApplyByJobDescriptionId(jobDescriptionId)
}
}
}
}

})
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@ package com.bamyanggang.apimodule.domain.jobDescription.presentation

import com.bamyanggang.apimodule.BaseRestDocsTest
import com.bamyanggang.apimodule.common.dto.PageResponse
import com.bamyanggang.apimodule.domain.jobDescription.application.dto.CreateApply
import com.bamyanggang.apimodule.domain.jobDescription.application.dto.CreateApplyContent
import com.bamyanggang.apimodule.domain.jobDescription.application.dto.CreateJobDescription
import com.bamyanggang.apimodule.domain.jobDescription.application.dto.GetJobDescriptionInfo
import com.bamyanggang.apimodule.domain.jobDescription.application.dto.*
import com.bamyanggang.apimodule.domain.jobDescription.application.service.ApplyCreateService
import com.bamyanggang.apimodule.domain.jobDescription.application.service.ApplyInfoGetService
import com.bamyanggang.apimodule.domain.jobDescription.application.service.JobDescriptionCreateService
import com.bamyanggang.apimodule.domain.jobDescription.application.service.JobDescriptionInfoGetService
import com.bamyanggang.commonmodule.exception.ExceptionHandler
Expand Down Expand Up @@ -45,6 +43,9 @@ class JobDescriptionControllerTest : BaseRestDocsTest() {
@MockBean
private lateinit var jobDescriptionInfoGetService: JobDescriptionInfoGetService

@MockBean
private lateinit var applyInfoGetService: ApplyInfoGetService

@Test
@DisplayName("직무 공고를 등록한다.")
fun createJobDescription() {
Expand Down Expand Up @@ -319,11 +320,13 @@ class JobDescriptionControllerTest : BaseRestDocsTest() {
// given
val jobDescriptionId = UUID.randomUUID()
val getJobDescriptionInfoResponse: GetJobDescriptionInfo.Response.Detail = generateFixture {
it.set("remainingDate", 1)
it.set("enterpriseName", "기업 이름")
it.set("title", "직무 공고 제목")
it.set("content", "직무 공고 내용")
it.set("link", "직무 공고 링크")
it.set("writeStatus", WriteStatus.WRITING)
it.set("createdAt", LocalDateTime.now())
it.set("startedAt", LocalDateTime.now())
it.set("endedAt", LocalDateTime.now())
}
Expand All @@ -348,16 +351,58 @@ class JobDescriptionControllerTest : BaseRestDocsTest() {
RequestDocumentation.parameterWithName("jobDescriptionId").description("jd 공고 ID")
),
responseFields(
fieldWithPath("remainingDate").description("디데이"),
fieldWithPath("enterpriseName").description("기업 이름"),
fieldWithPath("title").description("직무 공고 제목"),
fieldWithPath("content").description("직무 공고 내용"),
fieldWithPath("link").description("직무 공고 링크"),
fieldWithPath("writeStatus").description("작성 상태. NOT_APPLIED(칩 없음, 작성 전), WRITING(작성 중), WRITTEN(작성 완료), CLOSED(마감)"),
fieldWithPath("createdAt").description("생성일"),
fieldWithPath("startedAt").description("시작일"),
fieldWithPath("endedAt").description("종료일")
)
)
)
}

@Test
@DisplayName("JD 공고 자기소개서 정보를 조회한다")
fun getApplyInfo() {
// given
val jobDescriptionId = UUID.randomUUID()
val contentInfo: GetApplyInfo.ContentInfo = generateFixture {
it.set("question", "질문")
it.set("answer", "답변")
}
val getApplyInfoResponse: GetApplyInfo.Response = generateFixture {
it.set("applyContentList", listOf(contentInfo))
}

given(applyInfoGetService.getApplyInfo(jobDescriptionId)).willReturn(getApplyInfoResponse)

val request = RestDocumentationRequestBuilders.get(JobDescriptionApi.APPLY, jobDescriptionId)
.header("Authorization", "Bearer Access Token")
.contentType(MediaType.APPLICATION_JSON_VALUE)

//when
val result = mockMvc.perform(request)

//then
result.andExpect(status().isOk)
.andDo(
resultHandler.document(
requestHeaders(
headerWithName("Authorization").description("엑세스 토큰")
),
pathParameters(
RequestDocumentation.parameterWithName("jobDescriptionId").description("jd 공고 ID")
),
responseFields(
fieldWithPath("applyContentList[].question").description("질문"),
fieldWithPath("applyContentList[].answer").description("답변")
)
)
)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ import java.util.*
interface ApplyRepository {
fun save(apply: Apply)

fun findByJobDescriptionId(jobDescriptionId: UUID): Apply?
fun findByJobDescriptionId(jobDescriptionId: UUID): Apply

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class ApplyReader(
private val applyRepository: ApplyRepository
) {

fun readApplyByJobDescriptionId(JobDescriptionId: UUID): Apply?{
fun readApplyByJobDescriptionId(JobDescriptionId: UUID): Apply{
return applyRepository.findByJobDescriptionId(JobDescriptionId)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.bamyanggang.domainmodule.domain.jobDescription.service

import com.bamyanggang.domainmodule.domain.jobDescription.repository.ApplyRepository
import io.kotest.core.spec.style.BehaviorSpec
import io.mockk.mockk
import io.mockk.verify
import java.util.UUID

class ApplyReaderTest: BehaviorSpec({
val applyRepository = mockk<ApplyRepository>(relaxed = true)
val applyReader = ApplyReader(applyRepository)

given("ApplyReader.readApplyByJobDescriptionId") {
val jobDescriptionId: UUID = UUID.randomUUID()
`when`("jobDescriptionId가 주어지면") {
applyReader.readApplyByJobDescriptionId(jobDescriptionId)
then("applyRepository.findByJobDescriptionId가 호출된다.") {
verify {
applyRepository.findByJobDescriptionId(jobDescriptionId)
}
}
}
}

})
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,6 @@ public void save(Apply apply) {
public Apply findByJobDescriptionId(UUID jobDescriptionId) {
return applyJpaRepository.findByJobDescriptionId(jobDescriptionId)
.map(jobDescriptionMapper::toApplyDomainEntity)
.orElse(null);
.orElseThrow(() -> new PersistenceException.NotFound());
}
}

0 comments on commit 4f863c3

Please sign in to comment.