Skip to content

Commit

Permalink
Merge pull request #79 from KUSITMS-29th-TEAM-B/feat/flight-41
Browse files Browse the repository at this point in the history
feat: 경험 상세 조회 API 구현(#41)
  • Loading branch information
whereami2048 authored May 19, 2024
2 parents de800df + 6d18e4b commit 13a1b50
Show file tree
Hide file tree
Showing 16 changed files with 180 additions and 38 deletions.
27 changes: 16 additions & 11 deletions Api-Module/src/docs/asciidoc/Experience.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,6 @@

operation::ExperienceControllerTest/createExperienceTest/[snippets='http-request,request-headers,request-body,request-fields,http-response,response-body,response-fields']

[[CreateOverTitleLengthTest]]
=== 제목 글자 수 제한(50자) 예외

operation::ExperienceControllerTest/createOverTitleLengthTest/[snippets='http-request,request-headers,request-body,request-fields,http-response,response-body,response-fields']

[[CreateOverStrongPointCountTest]]
=== 역량 키워드 제한(5개) 초과 예외

operation::ExperienceControllerTest/createOverStrongPointCountTest/[snippets='http-request,request-headers,request-body,http-response,response-body,response-fields']

[[EditExperienceTest]]
=== 경험 수정 API

Expand All @@ -26,7 +16,22 @@ operation::ExperienceControllerTest/editExperienceTest/[snippets='http-request,p

operation::ExperienceControllerTest/deleteExperienceTest/[snippets='http-request,path-parameters,request-headers,request-body,http-response,response-body']

[[DeleteExperienceTest]]
[[GetExperienceTest]]
=== 경험 상세 조회 API

operation::ExperienceControllerTest/getExperienceDetailTest/[snippets='http-request,path-parameters,request-headers,request-body,http-response,response-body']

[[getExperienceYearsTest]]
=== 유저 경험 내 존재 연도 조회 API

operation::ExperienceControllerTest/getExperienceYearsTest/[snippets='http-request,request-headers,request-body,http-response,response-body']

[[CreateOverTitleLengthTest]]
=== 경험 등록 시 제목 글자 수 제한(50자) 예외

operation::ExperienceControllerTest/createOverTitleLengthTest/[snippets='http-request,request-headers,request-body,request-fields,http-response,response-body,response-fields']

[[CreateOverStrongPointCountTest]]
=== 경험 등록 시 역량 키워드 제한(5개) 초과 예외

operation::ExperienceControllerTest/createOverStrongPointCountTest/[snippets='http-request,request-headers,request-body,http-response,response-body,response-fields']
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.bamyanggang.apimodule.domain.experience.application.dto

import com.bamyanggang.apimodule.domain.strongpoint.application.dto.GetStrongPoint.DetailStrongPoint
import java.time.LocalDateTime
import java.util.*

class DetailExperience {
data class Response(
val id: UUID,
val title: String,
val parentTagId: UUID,
val childTagId: UUID,
val strongPoints: List<DetailStrongPoint>,
val contents: List<DetailExperienceContent>,
val startedAt: LocalDateTime,
val endedAt: LocalDateTime,
)

data class DetailExperienceContent(
val question: String,
val answer: String,
)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.bamyanggang.apimodule.domain.experience.application.dto

import com.bamyanggang.apimodule.domain.experience.application.dto.CreateExperience.ExperienceContentRequest
import java.time.LocalDateTime
import java.util.*

Expand All @@ -17,7 +16,7 @@ class EditExperience {

data class ExperienceContentRequest(
val question: String,
val answer: String,
val answer: String
)

data class Response(val id: UUID)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class ExperienceEditService(
private val experienceModifier: ExperienceModifier,
) {
@Transactional
fun editExperience(request: EditExperience.Request, experienceId: UUID) : EditExperience.Response{
fun editExperienceById(request: EditExperience.Request, experienceId: UUID) : EditExperience.Response{
val newContents = request.contents.map {
ExperienceContent.create(it.question, it.answer)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,55 @@
package com.bamyanggang.apimodule.domain.experience.application.service

import com.bamyanggang.apimodule.common.getAuthenticationPrincipal
import com.bamyanggang.apimodule.domain.experience.application.dto.DetailExperience
import com.bamyanggang.apimodule.domain.experience.application.dto.ExperienceYear
import com.bamyanggang.apimodule.domain.strongpoint.application.dto.GetStrongPoint
import com.bamyanggang.domainmodule.domain.experience.service.ExperienceReader
import com.bamyanggang.domainmodule.domain.strongpoint.service.StrongPointReader
import org.springframework.stereotype.Service
import java.util.*

@Service
class ExperienceGetService(
private val experienceReader: ExperienceReader
private val experienceReader: ExperienceReader,
private val strongPointReader: StrongPointReader,
) {
fun getExperienceDetailById(experienceId: UUID) : DetailExperience.Response {
val oneExperience = experienceReader.readExperience(experienceId)

val detailExperienceContents = oneExperience.contents.map {
DetailExperience.DetailExperienceContent(
it.question,
it.answer
)
}

val strongPointIds = oneExperience.strongPoints.map { it.id }
val strongPointDetails = strongPointReader.readByIds(strongPointIds).map {
GetStrongPoint.DetailStrongPoint(
it.id,
it.name
)
}

return oneExperience.let {
DetailExperience.Response(
id = it.id,
title = it.title,
parentTagId = it.parentTagId,
childTagId = it.childTagId,
strongPoints = strongPointDetails,
contents = detailExperienceContents,
startedAt = it.startedAt,
endedAt = it.endedAt
)
}
}

fun getAllYearsByExistExperience(): ExperienceYear.Response {
val currentUserId = getAuthenticationPrincipal()

return experienceReader.readAllYearsByExistExperience(currentUserId)
.let { ExperienceYear.Response(it) }
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.bamyanggang.apimodule.domain.experience.presentation

import com.bamyanggang.apimodule.domain.experience.application.dto.CreateExperience
import com.bamyanggang.apimodule.domain.experience.application.dto.DetailExperience
import com.bamyanggang.apimodule.domain.experience.application.dto.EditExperience
import com.bamyanggang.apimodule.domain.experience.application.dto.ExperienceYear
import com.bamyanggang.apimodule.domain.experience.application.service.ExperienceCreateService
Expand All @@ -17,6 +18,11 @@ class ExperienceController(
private val experienceEditService: ExperienceEditService,
private val experienceGetService: ExperienceGetService
) {
@GetMapping(ExperienceApi.EXPERIENCE_PATH_VARIABLE_URL)
fun getExperience(@PathVariable("experienceId") experienceId: UUID): DetailExperience.Response {
return experienceGetService.getExperienceDetailById(experienceId)
}

@GetMapping(ExperienceApi.ALL_YEARS)
fun getAllYearsByExistExperience() : ExperienceYear.Response {
return experienceGetService.getAllYearsByExistExperience()
Expand All @@ -35,6 +41,6 @@ class ExperienceController(
@PatchMapping(ExperienceApi.EXPERIENCE_PATH_VARIABLE_URL)
fun editExperience(@RequestBody request: EditExperience.Request,
@PathVariable experienceId: UUID): EditExperience.Response {
return experienceEditService.editExperience(request, experienceId)
return experienceEditService.editExperienceById(request, experienceId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import java.util.*
class GetStrongPoint {
data class Response(
val count: Int,
val strongPoints: List<StrongPoint>
val strongPoints: List<DetailStrongPoint>
)

data class StrongPoint(
data class DetailStrongPoint(
val id : UUID,
val name : String,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ class StrongPointGetService(
) {
fun getAllStrongPoints(): GetStrongPoint.Response {
return getAuthenticationPrincipal().let {
val strongPoints = strongPointReader.readAllByUserId(it).map { strongPoint ->
GetStrongPoint.StrongPoint(strongPoint.id, strongPoint.name)
val detailStrongPoints = strongPointReader.readAllByUserId(it).map { strongPoint ->
GetStrongPoint.DetailStrongPoint(strongPoint.id, strongPoint.name)
}

GetStrongPoint.Response(strongPoints.size, strongPoints)
GetStrongPoint.Response(detailStrongPoints.size, detailStrongPoints)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ package com.bamyanggang.apimodule.domain.experience.presentation

import com.bamyanggang.apimodule.BaseRestDocsTest
import com.bamyanggang.apimodule.domain.experience.application.dto.CreateExperience
import com.bamyanggang.apimodule.domain.experience.application.dto.DetailExperience
import com.bamyanggang.apimodule.domain.experience.application.dto.EditExperience
import com.bamyanggang.apimodule.domain.experience.application.dto.ExperienceYear
import com.bamyanggang.apimodule.domain.experience.application.service.ExperienceCreateService
import com.bamyanggang.apimodule.domain.experience.application.service.ExperienceDeleteService
import com.bamyanggang.apimodule.domain.experience.application.service.ExperienceEditService
import com.bamyanggang.apimodule.domain.experience.application.service.ExperienceGetService
import com.bamyanggang.apimodule.domain.strongpoint.application.dto.GetStrongPoint.DetailStrongPoint
import com.bamyanggang.commonmodule.exception.ExceptionHandler
import com.bamyanggang.commonmodule.fixture.generateFixture
import org.junit.jupiter.api.DisplayName
Expand Down Expand Up @@ -253,7 +255,7 @@ class ExperienceControllerTest : BaseRestDocsTest() {
val editedExperienceId : UUID = UUID.randomUUID()
val editExperienceResponse : EditExperience.Response = generateFixture()

given(experienceEditService.editExperience(editExperienceRequest, editedExperienceId)).willReturn(editExperienceResponse)
given(experienceEditService.editExperienceById(editExperienceRequest, editedExperienceId)).willReturn(editExperienceResponse)

val request = RestDocumentationRequestBuilders.patch(ExperienceApi.EXPERIENCE_PATH_VARIABLE_URL, editedExperienceId)
.header("Authorization", "Bearer Access Token")
Expand Down Expand Up @@ -291,6 +293,62 @@ class ExperienceControllerTest : BaseRestDocsTest() {
}

@Test
@DisplayName("경험을 상세조회한다.")
fun getExperienceDetailTest() {
val content1 = DetailExperience.DetailExperienceContent("질문1", "답변1")
val content2 = DetailExperience.DetailExperienceContent("질문2", "답변2")

val contentResponse = arrayListOf(content1, content2)

val experienceId: UUID = UUID.randomUUID()
val experienceDetailResponse : DetailExperience.Response = generateFixture {
it.set("id", experienceId)
it.set("title", "제목")
it.set("contents", contentResponse)
it.set("strongPoints", generateFixture<List<DetailStrongPoint>>())
it.set("parentTagId", generateFixture<UUID>())
it.set("childTagId", generateFixture<UUID>())
it.set("startedAt", generateFixture<LocalDateTime>())
it.set("endedAt", generateFixture<LocalDateTime>())
}

given(experienceGetService.getExperienceDetailById(experienceId)).willReturn(experienceDetailResponse)

//given
val request = RestDocumentationRequestBuilders.get(ExperienceApi.EXPERIENCE_PATH_VARIABLE_URL, experienceId)
.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(
parameterWithName("experienceId").description("경험 id")
),
responseFields(
fieldWithPath("id").description("경험 id"),
fieldWithPath("title").description("경험 제목"),
fieldWithPath("contents").description("경험 내용"),
fieldWithPath("contents[].question").description("경험 내용 질문"),
fieldWithPath("contents[].answer").description("경험 내용 답변"),
fieldWithPath("strongPoints").description("관련된 역량 키워드"),
fieldWithPath("strongPoints[].id").description("역량 키워드 id"),
fieldWithPath("strongPoints[].name").description("역량 키워드 이름"),
fieldWithPath("parentTagId").description("속한 상위 태그"),
fieldWithPath("childTagId").description("속한 하위 태그"),
fieldWithPath("startedAt").description("경험 시작 날짜"),
fieldWithPath("endedAt").description("경험 종료 날짜"),
),
)
)
}

@DisplayName("유저의 경험 내 존재하는 연도들을 중복 제거한 리스트를 반환한다.")
fun getExperienceYearsTest() {
//given
Expand All @@ -301,18 +359,14 @@ class ExperienceControllerTest : BaseRestDocsTest() {
given(experienceGetService.getAllYearsByExistExperience()).willReturn(yearResponse)

val request = RestDocumentationRequestBuilders.get(ExperienceApi.ALL_YEARS)
.header("Authorization", "Bearer Access Token")
.contentType(MediaType.APPLICATION_JSON_VALUE)
.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("엑세스 토큰")
),
responseFields(
fieldWithPath("years").description("경험이 존재하는 연도 배열(활동 시작 일시 기준)")
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,10 +212,10 @@ class StrongPointControllerTest : BaseRestDocsTest() {
@DisplayName("유저가 등록한 역량 키워드를 전체 조회한다.")
fun getAllStrongPointTest() {

val strongPoint1 = GetStrongPoint.StrongPoint(generateFixture<UUID>(), "역량 키워드 1")
val strongPoint2 = GetStrongPoint.StrongPoint(generateFixture<UUID>(), "역량 키워드 2")
val detailStrongPoint1 = GetStrongPoint.DetailStrongPoint(generateFixture<UUID>(), "역량 키워드 1")
val detailStrongPoint2 = GetStrongPoint.DetailStrongPoint(generateFixture<UUID>(), "역량 키워드 2")

val strongPointInfos = arrayListOf(strongPoint1, strongPoint2)
val strongPointInfos = arrayListOf(detailStrongPoint1, detailStrongPoint2)
val getStrongPointResponse = GetStrongPoint.Response(strongPointInfos.size, strongPointInfos)

given(strongPointController.getAllStrongPoints()).willReturn(getStrongPointResponse)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ data class Experience(
val userId : UUID,
val parentTagId: UUID,
val childTagId: UUID,
val experienceStrongPoints: List<ExperienceStrongPoint> = emptyList(),
val strongPoints: List<ExperienceStrongPoint> = emptyList(),
val contents: List<ExperienceContent>,
val startedAt : LocalDateTime,
val endedAt : LocalDateTime,
Expand All @@ -34,7 +34,7 @@ data class Experience(
parentTagId = parentTagId,
childTagId = childTagId,
contents = contents,
experienceStrongPoints = experienceStrongPoints,
strongPoints = experienceStrongPoints,
startedAt = startedAt,
endedAt = endedAt,
createdAt = createdAt,
Expand Down Expand Up @@ -62,7 +62,7 @@ data class Experience(
parentTagId = parentTagId,
childTagId = childTagId,
contents = contents,
experienceStrongPoints = experienceStrongPoints,
strongPoints = experienceStrongPoints,
startedAt = startedAt,
endedAt = endedAt,
createdAt = LocalDateTime.now(),
Expand Down Expand Up @@ -90,7 +90,7 @@ data class Experience(
parentTagId = parentTagId,
childTagId = childTagId,
contents = contents,
experienceStrongPoints = experienceStrongPoints,
strongPoints = experienceStrongPoints,
startedAt = startedAt,
endedAt = endedAt,
createdAt = createdAt,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ interface StrongPointRepository {
fun findAllByUserId(userId: UUID): List<StrongPoint>
fun deleteByStrongPointId(strongPointId: UUID)
fun isExistByStrongPointId(strongPointId: UUID): Boolean
fun findByIds(strongPointIds: List<UUID>) : List<StrongPoint>
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,8 @@ class StrongPointReader(
fun readAllByUserId(userId: UUID): List<StrongPoint> {
return strongPointRepository.findAllByUserId(userId)
}

fun readByIds(strongPointIds: List<UUID>) : List<StrongPoint> {
return strongPointRepository.findByIds(strongPointIds)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public ExperienceJpaEntity toExperienceJpaEntity(Experience experience) {
List<ExperienceContentJpaEntity> experienceContentJpaEntities = experience.getContents().stream()
.map(this::toExperienceContentJpaEntity).toList();

List<ExperienceStrongPointJpaEntity> strongPointInfoJpaEntities = experience.getExperienceStrongPoints().stream()
List<ExperienceStrongPointJpaEntity> strongPointInfoJpaEntities = experience.getStrongPoints().stream()
.map(this::toExperienceStrongPointJpaEntity).toList();

return new ExperienceJpaEntity(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,10 @@ public void deleteByStrongPointId(UUID strongPointId) {
public boolean isExistByStrongPointId(UUID strongPointId) {
return strongPointJpaRepository.existsById(strongPointId);
}

@Override
public List<StrongPoint> findByIds(List<UUID> strongPointIds) {
List<StrongPointJpaEntity> strongPointJpaEntities = strongPointJpaRepository.findByIds(strongPointIds);
return strongPointJpaEntities.stream().map(strongPointMapper::toDomainEntity).toList();
}
}
Loading

0 comments on commit 13a1b50

Please sign in to comment.