diff --git a/Api-Module/src/docs/asciidoc/Experience.adoc b/Api-Module/src/docs/asciidoc/Experience.adoc index 6d63d2b2..7184e136 100644 --- a/Api-Module/src/docs/asciidoc/Experience.adoc +++ b/Api-Module/src/docs/asciidoc/Experience.adoc @@ -21,6 +21,11 @@ operation::ExperienceControllerTest/deleteExperienceTest/[snippets='http-request operation::ExperienceControllerTest/getExperienceDetailTest/[snippets='http-request,path-parameters,request-headers,request-body,http-response,response-body'] +[[GetExperiencesTest]] +=== 경험 목록 조회 API + +operation::ExperienceControllerTest/getExperienceYearAndChildTagTest/[snippets='http-request,request-headers,request-body,http-response,response-body'] + [[getExperienceYearsTest]] === 유저 경험 내 존재 연도 조회 API diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/dto/DetailExperience.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/dto/GetExperience.kt similarity index 86% rename from Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/dto/DetailExperience.kt rename to Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/dto/GetExperience.kt index d6aff10e..38c65b01 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/dto/DetailExperience.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/dto/GetExperience.kt @@ -3,8 +3,12 @@ package com.bamyanggang.apimodule.domain.experience.application.dto import java.time.LocalDateTime import java.util.* -class DetailExperience { +class GetExperience { data class Response( + val experiences: List + ) + + data class DetailExperience( val id: UUID, val title: String, val parentTag: DetailTag, diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/service/ExperienceGetService.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/service/ExperienceGetService.kt index 01a7a4b9..2b0559df 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/service/ExperienceGetService.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/service/ExperienceGetService.kt @@ -1,8 +1,9 @@ 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.experience.application.dto.GetExperience +import com.bamyanggang.domainmodule.domain.experience.aggregate.Experience import com.bamyanggang.domainmodule.domain.experience.service.ExperienceReader import com.bamyanggang.domainmodule.domain.strongpoint.service.StrongPointReader import com.bamyanggang.domainmodule.domain.tag.service.TagReader @@ -15,56 +16,82 @@ class ExperienceGetService( private val strongPointReader: StrongPointReader, private val tagReader: TagReader, ) { - fun getExperienceDetailById(experienceId: UUID) : DetailExperience.Response { + fun getExperienceDetailById(experienceId: UUID) : GetExperience.DetailExperience { val oneExperience = experienceReader.readExperience(experienceId) + return createExperienceDetailResponse(oneExperience) + } - val detailExperienceContents = oneExperience.contents.map { - DetailExperience.DetailExperienceContent( - it.question, - it.answer - ) + fun getAllYearsByExistExperience(): ExperienceYear.Response { + val currentUserId = getAuthenticationPrincipal() + + return experienceReader.readAllYearsByExistExperience(currentUserId) + .let { ExperienceYear.Response(it) } + } + + fun getExperienceByYearAndParentTag(year: Int, parentTagId: UUID): GetExperience.Response { + val experiences = experienceReader.readByYearAndParentTagId(year, parentTagId).map { + createExperienceDetailResponse(it) } - val strongPointIds = oneExperience.strongPoints.map { it.strongPointId } - val strongPointDetails = strongPointReader.readByIds(strongPointIds).map { - DetailExperience.DetailStrongPoint( - it.id, - it.name - ) + return GetExperience.Response(experiences) + } + + fun getExperienceByYearAndChildTag(year: Int, childTagId: UUID): GetExperience.Response { + val experiences = experienceReader.readByYearAndParentTagId(year, childTagId).map { + createExperienceDetailResponse(it) } - val detailParentTag = tagReader.readById(oneExperience.parentTagId).let { - DetailExperience.DetailTag( + return GetExperience.Response(experiences) + } + + private fun createExperienceDetailResponse(experience: Experience): GetExperience.DetailExperience { + val detailExperienceContents = convertDetailExperienceContent(experience) + val strongPointDetails = convertStrongPoints(experience) + val detailParentTag = convertParentTag(experience) + val detailChildTag = convertChildTag(experience) + + return GetExperience.DetailExperience( + id = experience.id, + title = experience.title, + parentTag = detailParentTag, + childTag = detailChildTag, + strongPoints = strongPointDetails, + contents = detailExperienceContents, + startedAt = experience.startedAt, + endedAt = experience.endedAt + ) + } + + private fun convertChildTag(oneExperience: Experience) = + tagReader.readById(oneExperience.childTagId).let { + GetExperience.DetailTag( it.id, it.name ) } - val detailChildTag = tagReader.readById(oneExperience.childTagId).let { - DetailExperience.DetailTag( + private fun convertParentTag(oneExperience: Experience) = + tagReader.readById(oneExperience.parentTagId).let { + GetExperience.DetailTag( it.id, it.name ) } - return oneExperience.let { - DetailExperience.Response( - id = it.id, - title = it.title, - parentTag = detailParentTag, - childTag = detailChildTag, - strongPoints = strongPointDetails, - contents = detailExperienceContents, - startedAt = it.startedAt, - endedAt = it.endedAt + private fun convertDetailExperienceContent(experience: Experience) = + experience.contents.map { GetExperience.DetailExperienceContent( + it.question, + it.answer ) } - } - - fun getAllYearsByExistExperience(): ExperienceYear.Response { - val currentUserId = getAuthenticationPrincipal() - return experienceReader.readAllYearsByExistExperience(currentUserId) - .let { ExperienceYear.Response(it) } + private fun convertStrongPoints(experience: Experience) = + experience.strongPoints.map { it.strongPointId }.let { + strongPointReader.readByIds(it).map { strongPoint -> + GetExperience.DetailStrongPoint( + strongPoint.id, + strongPoint.name + ) + } } } diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/presentation/ExperienceController.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/presentation/ExperienceController.kt index b20f96bf..e412fb6c 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/presentation/ExperienceController.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/presentation/ExperienceController.kt @@ -1,9 +1,6 @@ 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.dto.* 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 @@ -18,8 +15,18 @@ class ExperienceController( private val experienceEditService: ExperienceEditService, private val experienceGetService: ExperienceGetService ) { + @GetMapping(ExperienceApi.BASE_URL) + fun getExperienceByFilter(@RequestParam("year") year: Int, + @RequestParam("parent-tag") parentTagId: UUID, + @RequestParam("child-tag", required = false) childTagId: UUID? + ) : GetExperience.Response = + when (childTagId){ + null -> experienceGetService.getExperienceByYearAndParentTag(year, parentTagId) + else -> experienceGetService.getExperienceByYearAndChildTag(year, childTagId) + } + @GetMapping(ExperienceApi.EXPERIENCE_PATH_VARIABLE_URL) - fun getExperience(@PathVariable("experienceId") experienceId: UUID): DetailExperience.Response { + fun getExperience(@PathVariable("experienceId") experienceId: UUID): GetExperience.DetailExperience { return experienceGetService.getExperienceDetailById(experienceId) } diff --git a/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/experience/presentation/ExperienceControllerTest.kt b/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/experience/presentation/ExperienceControllerTest.kt index 70fa0130..0d66d9b5 100644 --- a/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/experience/presentation/ExperienceControllerTest.kt +++ b/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/experience/presentation/ExperienceControllerTest.kt @@ -2,9 +2,9 @@ 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.dto.GetExperience 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 @@ -294,20 +294,20 @@ class ExperienceControllerTest : BaseRestDocsTest() { @Test @DisplayName("경험을 상세조회한다.") fun getExperienceDetailTest() { - val content1 = DetailExperience.DetailExperienceContent("질문1", "답변1") - val content2 = DetailExperience.DetailExperienceContent("질문2", "답변2") + val content1 = GetExperience.DetailExperienceContent("질문1", "답변1") + val content2 = GetExperience.DetailExperienceContent("질문2", "답변2") val contentResponse = arrayListOf(content1, content2) val experienceId: UUID = UUID.randomUUID() - val experienceDetailResponse : DetailExperience.Response = generateFixture { + val experienceDetailResponse : GetExperience.DetailExperience = generateFixture { it.set("id", experienceId) it.set("title", "제목") it.set("contents", contentResponse) - it.set("strongPoints", generateFixture>()) - it.set("parentTag", generateFixture()) - it.set("childTag", generateFixture()) + it.set("strongPoints", generateFixture>()) + it.set("parentTag", generateFixture()) + it.set("childTag", generateFixture()) it.set("startedAt", generateFixture()) it.set("endedAt", generateFixture()) } @@ -352,12 +352,178 @@ class ExperienceControllerTest : BaseRestDocsTest() { ) ) } - + + @Test + @DisplayName("경험 목록을 상위 태그 id를 기준으로 조회한다.") + fun getExperienceYearAndParentTagTest() { + val content1 = GetExperience.DetailExperienceContent("질문1", "답변1") + val content2 = GetExperience.DetailExperienceContent("질문2", "답변2") + val strongPoint1 = GetExperience.DetailStrongPoint(UUID.randomUUID(), "역량 키워드 이름 1") + val strongPoint2 = GetExperience.DetailStrongPoint(UUID.randomUUID(), "역량 키워드 이름 2") + val parentTag = GetExperience.DetailTag(UUID.randomUUID(), "상위 태그 이름") + val childTag = GetExperience.DetailTag(UUID.randomUUID(), "하위 태그 이름") + val startedAt = LocalDateTime.now() + val endedAt = LocalDateTime.now().plusDays(1) + + val contentResponse = arrayListOf(content1, content2) + val strongPointResponse = arrayListOf(strongPoint1, strongPoint2) + + val experienceResponses = + GetExperience.Response( + arrayListOf( + GetExperience.DetailExperience( + id = UUID.randomUUID(), + title = "경험 제목1 ", + contents = contentResponse, + strongPoints = strongPointResponse, + parentTag = parentTag, + childTag = childTag, + startedAt = startedAt, + endedAt = endedAt + ), + GetExperience.DetailExperience( + id = UUID.randomUUID(), + title = "경험 제목 2", + contents = contentResponse, + strongPoints = strongPointResponse, + parentTag = parentTag, + childTag = childTag, + startedAt = startedAt.minusYears(1), + endedAt = endedAt + ) + ) + ) + + val year = 2024 + given(experienceGetService.getExperienceByYearAndParentTag(year, parentTag.id)).willReturn(experienceResponses) + + //given + val request = RestDocumentationRequestBuilders.get(ExperienceApi.BASE_URL) + .header("Authorization", "Bearer Access Token") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .queryParam("year", year.toString()) + .queryParam("parent-tag", parentTag.id.toString()) + + //when + val result = mockMvc.perform(request) + + //then + result.andExpect(status().isOk).andDo( + resultHandler.document( + requestHeaders( + headerWithName("Authorization").description("엑세스 토큰") + ), + responseFields( + fieldWithPath("experiences[].id").description("경험 id"), + fieldWithPath("experiences[].title").description("경험 제목"), + fieldWithPath("experiences[].contents").description("경험 내용"), + fieldWithPath("experiences[].contents[].question").description("경험 내용 질문"), + fieldWithPath("experiences[].contents[].answer").description("경험 내용 답변"), + fieldWithPath("experiences[].strongPoints").description("관련된 역량 키워드"), + fieldWithPath("experiences[].strongPoints[].id").description("역량 키워드 id"), + fieldWithPath("experiences[].strongPoints[].name").description("역량 키워드 이름"), + fieldWithPath("experiences[].parentTag").description("속한 상위 태그"), + fieldWithPath("experiences[].parentTag.id").description("상위 태그 id"), + fieldWithPath("experiences[].parentTag.name").description("상위 태그 이름"), + fieldWithPath("experiences[].childTag").description("속한 하위 태그"), + fieldWithPath("experiences[].childTag.id").description("하위 태그 id"), + fieldWithPath("experiences[].childTag.name").description("하위 태그 이름"), + fieldWithPath("experiences[].startedAt").description("경험 시작 날짜"), + fieldWithPath("experiences[].endedAt").description("경험 종료 날짜"), + ), + ) + ) + } + + @Test + @DisplayName("경험 목록을 하위 태그 id를 기준으로 조회한다.") + fun getExperienceYearAndChildTagTest() { + val content1 = GetExperience.DetailExperienceContent("질문1", "답변1") + val content2 = GetExperience.DetailExperienceContent("질문2", "답변2") + val strongPoint1 = GetExperience.DetailStrongPoint(UUID.randomUUID(), "역량 키워드 이름 1") + val strongPoint2 = GetExperience.DetailStrongPoint(UUID.randomUUID(), "역량 키워드 이름 2") + val parentTag = GetExperience.DetailTag(UUID.randomUUID(), "상위 태그 이름") + val childTag = GetExperience.DetailTag(UUID.randomUUID(), "하위 태그 이름") + val startedAt = LocalDateTime.now() + val endedAt = LocalDateTime.now().plusDays(1) + + val contentResponse = arrayListOf(content1, content2) + val strongPointResponse = arrayListOf(strongPoint1, strongPoint2) + + val experienceResponses = + GetExperience.Response( + arrayListOf( + GetExperience.DetailExperience( + id = UUID.randomUUID(), + title = "경험 제목1 ", + contents = contentResponse, + strongPoints = strongPointResponse, + parentTag = parentTag, + childTag = childTag, + startedAt = startedAt, + endedAt = endedAt + ), + GetExperience.DetailExperience( + id = UUID.randomUUID(), + title = "경험 제목 2", + contents = contentResponse, + strongPoints = strongPointResponse, + parentTag = parentTag, + childTag = childTag, + startedAt = startedAt.minusYears(1), + endedAt = endedAt + ) + ) + ) + + val year = 2024 + given(experienceGetService.getExperienceByYearAndChildTag(year, childTag.id)).willReturn(experienceResponses) + + //given + val request = RestDocumentationRequestBuilders.get(ExperienceApi.BASE_URL) + .header("Authorization", "Bearer Access Token") + .contentType(MediaType.APPLICATION_JSON_VALUE) + .queryParam("year", year.toString()) + .queryParam("parent-tag", parentTag.id.toString()) + .queryParam("child-tag", childTag.id.toString()) + //when + val result = mockMvc.perform(request) + + //then + result.andExpect(status().isOk).andDo( + resultHandler.document( + requestHeaders( + headerWithName("Authorization").description("엑세스 토큰") + ), + responseFields( + fieldWithPath("experiences").description("경험 목록"), + fieldWithPath("experiences[].id").description("경험 id"), + fieldWithPath("experiences[].title").description("경험 제목"), + fieldWithPath("experiences[].contents").description("경험 내용"), + fieldWithPath("experiences[].contents[].question").description("경험 내용 질문"), + fieldWithPath("experiences[].contents[].answer").description("경험 내용 답변"), + fieldWithPath("experiences[].strongPoints").description("관련된 역량 키워드"), + fieldWithPath("experiences[].strongPoints[].id").description("역량 키워드 id"), + fieldWithPath("experiences[].strongPoints[].name").description("역량 키워드 이름"), + fieldWithPath("experiences[].parentTag").description("속한 상위 태그"), + fieldWithPath("experiences[].parentTag.id").description("상위 태그 id"), + fieldWithPath("experiences[].parentTag.name").description("상위 태그 이름"), + fieldWithPath("experiences[].childTag").description("속한 하위 태그"), + fieldWithPath("experiences[].childTag.id").description("하위 태그 id"), + fieldWithPath("experiences[].childTag.name").description("하위 태그 이름"), + fieldWithPath("experiences[].startedAt").description("경험 시작 날짜"), + fieldWithPath("experiences[].endedAt").description("경험 종료 날짜"), + ) + ) + ) + } + + @Test @DisplayName("유저의 경험 내 존재하는 연도들을 중복 제거한 리스트를 반환한다.") fun getExperienceYearsTest() { //given val userId: UUID = generateFixture() - val years = arrayListOf(2023, 2024, 2025) + val years = arrayListOf(2020,2021,2023, 2024, 2025) val yearResponse = ExperienceYear.Response(years) given(experienceGetService.getAllYearsByExistExperience()).willReturn(yearResponse) @@ -371,6 +537,9 @@ class ExperienceControllerTest : BaseRestDocsTest() { result.andExpect(status().isOk).andDo( resultHandler.document( + requestHeaders( + headerWithName("Authorization").description("엑세스 토큰") + ), responseFields( fieldWithPath("years").description("경험이 존재하는 연도 배열(활동 시작 일시 기준)") ) diff --git a/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/jobDescription/presentation/JobDescriptionControllerTest.kt b/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/jobDescription/presentation/JobDescriptionControllerTest.kt index 6257df91..46fc9a04 100644 --- a/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/jobDescription/presentation/JobDescriptionControllerTest.kt +++ b/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/jobDescription/presentation/JobDescriptionControllerTest.kt @@ -2,7 +2,10 @@ 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.* +import com.bamyanggang.apimodule.domain.jobDescription.application.dto.ApplyInfo +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.JobDescriptionInfo import com.bamyanggang.apimodule.domain.jobDescription.application.service.* import com.bamyanggang.commonmodule.exception.ExceptionHandler import com.bamyanggang.commonmodule.fixture.generateFixture @@ -416,7 +419,7 @@ class JobDescriptionControllerTest : BaseRestDocsTest() { fun updateApplyInfo() { // given val jobDescriptionId = UUID.randomUUID() - val updateApplyRequest: ApplyInfo.Request = generateFixture { + val updateApplyRequest: ApplyInfo.Request.Update = generateFixture { it.set("contents", listOf(ApplyInfo.ContentInfo("질문", "답변"))) } diff --git a/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/strongpoint/presentation/StrongPointControllerTest.kt b/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/strongpoint/presentation/StrongPointControllerTest.kt index 45d89df1..54ab2771 100644 --- a/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/strongpoint/presentation/StrongPointControllerTest.kt +++ b/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/strongpoint/presentation/StrongPointControllerTest.kt @@ -34,7 +34,11 @@ class StrongPointControllerTest : BaseRestDocsTest() { @Test @DisplayName("역량 키워드를 저장한 뒤 생성된 역량 키워드 정보를 반환한다.") fun createStrongPointTest() { - val createStrongPoint: CreateStrongPoint.Request = generateFixture() + val createStrongPoint = CreateStrongPoint.Request( + arrayListOf( + CreateStrongPoint.StrongPointName("이름 1"), + CreateStrongPoint.StrongPointName("이름 2"), + )) val strongPoints = arrayListOf( CreateStrongPoint.DetailStrongPoint(generateFixture(), "역량 키워드 이름 1"), diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/repository/ExperienceRepository.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/repository/ExperienceRepository.kt index 7c3a5f4b..f2679125 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/repository/ExperienceRepository.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/repository/ExperienceRepository.kt @@ -9,4 +9,6 @@ interface ExperienceRepository { fun findByExperienceId(id: UUID): Experience fun findAllByUserId(userId: UUID): List fun findByUserIdAndYearDesc(year: Int, userId: UUID): List + fun findByYearAndParentTagId(year: Int, parentTagId: UUID): List + fun findByYearAndChildTagId(year: Int, childTagId: UUID): List } diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceReader.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceReader.kt index f0b2754e..29849643 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceReader.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceReader.kt @@ -29,4 +29,12 @@ class ExperienceReader( fun readByYearDesc(year: Int, userId: UUID): List { return experienceRepository.findByUserIdAndYearDesc(year, userId) } + + fun readByYearAndParentTagId(year: Int, parentTagId: UUID) : List { + return experienceRepository.findByYearAndParentTagId(year, parentTagId) + } + + fun readByYearAndChildTagId(year: Int, childTagId: UUID): List { + return experienceRepository.findByYearAndChildTagId(year, childTagId) + } } diff --git a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/experience/ExperienceRepositoryImpl.java b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/experience/ExperienceRepositoryImpl.java index 48f5aa44..28119760 100644 --- a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/experience/ExperienceRepositoryImpl.java +++ b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/experience/ExperienceRepositoryImpl.java @@ -6,7 +6,6 @@ import com.bamyanggang.persistence.experience.jpa.entity.ExperienceJpaEntity; import com.bamyanggang.persistence.experience.jpa.repository.ExperienceJpaRepository; import com.bamyanggang.persistence.experience.mapper.ExperienceMapper; -import com.bamyanggang.persistence.user.UserRepositoryImpl; import java.time.LocalDateTime; import java.util.List; import java.util.UUID; @@ -18,7 +17,6 @@ public class ExperienceRepositoryImpl implements ExperienceRepository { private final ExperienceJpaRepository experienceJpaRepository; private final ExperienceMapper experienceMapper; - private final UserRepositoryImpl userRepositoryImpl; @Override public void save(Experience experience) { @@ -49,9 +47,32 @@ public List findAllByUserId(UUID userId) { public List findByUserIdAndYearDesc(int year, UUID userId) { LocalDateTime startYear = LocalDateTime.of(year, 1, 1, 0, 0); LocalDateTime endYear = LocalDateTime.of(year, 12, 31, 23, 59); + List experienceJpaEntities = experienceJpaRepository .findByUserIdAndCreatedAtBetweenOrderByCreatedAtDesc(userId, startYear, endYear); return experienceJpaEntities.stream().map(experienceMapper::toExperienceDomainEntity).toList(); } + + @Override + public List findByYearAndParentTagId(int year, UUID parentTagId) { + LocalDateTime startYear = LocalDateTime.of(year, 1, 1, 0, 0); + LocalDateTime endYear = LocalDateTime.of(year, 12, 31, 23, 59); + + List experienceJpaEntities = experienceJpaRepository + .findByParentTagIdAndCreatedAtBetweenOrderByCreatedAtDesc(parentTagId, startYear, endYear); + + return experienceJpaEntities.stream().map(experienceMapper::toExperienceDomainEntity).toList(); + } + + @Override + public List findByYearAndChildTagId(int year, UUID childTagId) { + LocalDateTime startYear = LocalDateTime.of(year, 1, 1, 0, 0); + LocalDateTime endYear = LocalDateTime.of(year, 12, 31, 23, 59); + + List experienceJpaEntities = experienceJpaRepository + .findByChildTagIdAndCreatedAtBetweenOrderByCreatedAtDesc(childTagId, startYear, endYear); + + return experienceJpaEntities.stream().map(experienceMapper::toExperienceDomainEntity).toList(); + } } diff --git a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/experience/jpa/repository/ExperienceJpaRepository.java b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/experience/jpa/repository/ExperienceJpaRepository.java index 5e2f9694..a8ad4f05 100644 --- a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/experience/jpa/repository/ExperienceJpaRepository.java +++ b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/experience/jpa/repository/ExperienceJpaRepository.java @@ -9,4 +9,6 @@ public interface ExperienceJpaRepository extends JpaRepository { List findAllByUserId(UUID userId); List findByUserIdAndCreatedAtBetweenOrderByCreatedAtDesc(UUID userId, LocalDateTime startYear, LocalDateTime endYear); + List findByParentTagIdAndCreatedAtBetweenOrderByCreatedAtDesc(UUID parentTagId, LocalDateTime startYear, LocalDateTime endYear); + List findByChildTagIdAndCreatedAtBetweenOrderByCreatedAtDesc(UUID childTagId, LocalDateTime startYear, LocalDateTime endYear); }