diff --git a/Api-Module/src/docs/asciidoc/Auth.adoc b/Api-Module/src/docs/asciidoc/Auth.adoc index 755c5e84..054bfde5 100644 --- a/Api-Module/src/docs/asciidoc/Auth.adoc +++ b/Api-Module/src/docs/asciidoc/Auth.adoc @@ -19,5 +19,5 @@ operation::AuthControllerTest/reissueToken[snippets='http-request,http-response, [[Auth-Logout]] === 로그아웃 -operation::AuthControllerTest/logout[snippets='http-request,http-response,request-fields'] +operation::AuthControllerTest/logout[snippets='http-request,request-headers,http-response'] diff --git a/Api-Module/src/docs/asciidoc/Tag.adoc b/Api-Module/src/docs/asciidoc/Tag.adoc index 7d9091aa..63a6f1a0 100644 --- a/Api-Module/src/docs/asciidoc/Tag.adoc +++ b/Api-Module/src/docs/asciidoc/Tag.adoc @@ -11,11 +11,26 @@ operation::TagControllerTest/createParentTagTest/[snippets='http-request,request operation::TagControllerTest/createChildTagTest/[snippets='http-request,path-parameters,request-fields,http-response,response-fields'] +[[DeleteTagTest]] +=== 태그 삭제 API + +operation::TagControllerTest/deleteTagTest/[snippets='http-request,path-parameters,http-response'] + +[[GetAllTagTest]] +=== 상위 & 하위 태그 전체 조회 API + +operation::TagControllerTest/getAllTagsTest/[snippets='http-request,http-response,response-fields'] + [[GetParentTagTest]] === 상위 태그 조회 API operation::TagControllerTest/getAllParentTagByUserTest/[snippets='http-request,request-headers,http-response,response-fields'] +[[GetChildTagTest]] +=== 하위 태그 전체 조회 API + +operation::TagControllerTest/getAllChildTagTest/[snippets='http-request,path-parameters,http-response,response-fields'] + [[GetTopRankTagTest]] === 연도 내 경험 최근 추가 순 태그 조회 API @@ -26,16 +41,16 @@ operation::TagControllerTest/getTopRankParentTagTest/[snippets='http-request,req operation::TagControllerTest/getParentTagsByYear/[snippets='http-request,http-response,response-fields'] -[[GetChildTagTest]] -=== 하위 태그 전체 조회 API - -operation::TagControllerTest/getAllChildTagTest/[snippets='http-request,path-parameters,http-response,response-fields'] - [[GetChildTagsByFilter]] === 상위 태그 내 하위 태그 조회 API operation::TagControllerTest/getChildTagsByYear/[snippets='http-request,path-parameters,http-response,response-fields'] +[[GetYearsByParentTagId]] +=== 상위 태그 내 존재 연도 조회 API + +operation::TagControllerTest/getYearsByParentTagId/[snippets='http-request,path-parameters,http-response,response-fields'] + [[duplicatedParentTagTest]] ==== 상위 태그 이름 중복 예외 diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/dto/ExperienceYear.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/dto/ExperienceYear.kt index 1083fd75..00cdd957 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/dto/ExperienceYear.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/experience/application/dto/ExperienceYear.kt @@ -1,7 +1,20 @@ package com.bamyanggang.apimodule.domain.experience.application.dto +import java.util.* + class ExperienceYear { data class Response( - val years : List + val years : List, + val yearTagInfos: List + ) + + data class YearTagInfo( + val year: Int, + val tags: List + ) + + data class TagDetail( + val id: UUID, + val name: String, ) } 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 3c41efa3..73d56384 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 @@ -32,8 +32,29 @@ class ExperienceGetService( fun getAllYearsByExistExperience(): ExperienceYear.Response { val currentUserId = getAuthenticationPrincipal() - return experienceReader.readAllYearsByExistExperience(currentUserId) - .let { ExperienceYear.Response(it) } + val years = experienceReader.readAllYearsByExistExperience(currentUserId) + val yearTagInfos = years.map { year -> + val parentTagIds = experienceReader.readByUserIDAndYearDesc(year, currentUserId) + .distinctBy { it.parentTagId } + .map { it.parentTagId } + + val tagDetails = tagReader.readByIds(parentTagIds).map { + ExperienceYear.TagDetail( + id = it.id, + name = it.name + ) + } + + ExperienceYear.YearTagInfo( + year, + tagDetails + ) + } + + return ExperienceYear.Response( + years, + yearTagInfos + ) } @Transactional(readOnly = true) @@ -47,7 +68,7 @@ class ExperienceGetService( @Transactional(readOnly = true) fun getExperienceByYearAndChildTag(year: Int, childTagId: UUID): GetExperience.Response { - val experiences = experienceReader.readByYearAndChildTagId(year, childTagId).map { + val experiences = experienceReader.readByChildTagIdAndYear(year, childTagId).map { createExperienceDetailResponse(it) } @@ -162,4 +183,12 @@ class ExperienceGetService( ) } } -} + + fun getAllExperienceByYear(year: Int): GetExperience.Response { + val experiences = experienceReader.readByYear(year).map { + createExperienceDetailResponse(it) + } + + return GetExperience.Response(experiences) + } +} 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 c1e64225..06c7bcdc 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 @@ -30,12 +30,13 @@ class ExperienceController( @GetMapping(ExperienceApi.BASE_URL) fun getExperienceByFilter(@RequestParam("year") year: Int, - @RequestParam("parent-tag") parentTagId: UUID, + @RequestParam("parent-tag", required = false) parentTagId: UUID?, @RequestParam("child-tag", required = false) childTagId: UUID? ) : GetExperience.Response = - when (childTagId){ - null -> experienceGetService.getExperienceByYearAndParentTag(year, parentTagId) - else -> experienceGetService.getExperienceByYearAndChildTag(year, childTagId) + when { + childTagId == null && parentTagId == null -> experienceGetService.getAllExperienceByYear(year) + childTagId == null && parentTagId != null -> experienceGetService.getExperienceByYearAndParentTag(year, parentTagId) + else -> experienceGetService.getExperienceByYearAndChildTag(year, childTagId!!) } @GetMapping(ExperienceApi.EXPERIENCE_PATH_VARIABLE_URL) diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/dto/ApplyInfo.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/dto/ApplyInfo.kt index 58c47c04..9114fff9 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/dto/ApplyInfo.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/dto/ApplyInfo.kt @@ -1,5 +1,7 @@ package com.bamyanggang.apimodule.domain.jobDescription.application.dto +import com.bamyanggang.domainmodule.domain.jobDescription.enums.WriteStatus + class ApplyInfo { sealed class Request { @@ -10,7 +12,8 @@ class ApplyInfo { } data class Response( - val applyContentList: List + val applyContentList: List, + val writeStatus: WriteStatus ) data class ContentInfo( diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/service/ApplyCreateService.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/service/ApplyCreateService.kt index 8c8da3fb..c4104a71 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/service/ApplyCreateService.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/service/ApplyCreateService.kt @@ -2,10 +2,8 @@ package com.bamyanggang.apimodule.domain.jobDescription.application.service import com.bamyanggang.apimodule.domain.jobDescription.application.dto.CreateApply import com.bamyanggang.domainmodule.domain.jobDescription.aggregate.ApplyContent -import com.bamyanggang.domainmodule.domain.jobDescription.enums.WriteStatus import com.bamyanggang.domainmodule.domain.jobDescription.service.ApplyAppender import com.bamyanggang.domainmodule.domain.jobDescription.service.JobDescriptionModifier -import com.bamyanggang.domainmodule.domain.jobDescription.service.JobDescriptionReader import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import java.util.* diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/service/ApplyInfoGetService.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/service/ApplyInfoGetService.kt index e5590e8f..ef739d45 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/service/ApplyInfoGetService.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/service/ApplyInfoGetService.kt @@ -2,25 +2,24 @@ package com.bamyanggang.apimodule.domain.jobDescription.application.service import com.bamyanggang.apimodule.domain.jobDescription.application.dto.ApplyInfo import com.bamyanggang.domainmodule.domain.jobDescription.service.ApplyReader +import com.bamyanggang.domainmodule.domain.jobDescription.service.JobDescriptionReader import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import java.util.* @Service class ApplyInfoGetService( - private val applyReader: ApplyReader + private val applyReader: ApplyReader, + private val jobDescriptionReader: JobDescriptionReader ) { @Transactional(readOnly = true) fun getApplyInfo(jobDescriptionId: UUID): ApplyInfo.Response { - return applyReader.readApplyByJobDescriptionId(jobDescriptionId).contents.map { - ApplyInfo.ContentInfo( - it.question, - it.answer - ) - }.let { - ApplyInfo.Response(it) + val jobDescription = jobDescriptionReader.readJobDescriptionById(jobDescriptionId) + val contents = applyReader.readApplyByJobDescriptionId(jobDescriptionId).contents.map { + ApplyInfo.ContentInfo(it.question, it.answer) } + return ApplyInfo.Response(contents, jobDescription.writeStatus) } } diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/service/JobDescriptionInfoUpdateService.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/service/JobDescriptionInfoUpdateService.kt index b1f5e2de..5c1576b8 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/service/JobDescriptionInfoUpdateService.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/service/JobDescriptionInfoUpdateService.kt @@ -23,4 +23,9 @@ class JobDescriptionInfoUpdateService( request.link, request.startedAt, request.endedAt) } + @Transactional + fun invoke() { + jobDescriptionModifier.invoke() + } + } diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/scheduler/UpdateWriteStatusScheduler.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/scheduler/UpdateWriteStatusScheduler.kt new file mode 100644 index 00000000..dee4ea76 --- /dev/null +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/jobDescription/scheduler/UpdateWriteStatusScheduler.kt @@ -0,0 +1,16 @@ +package com.bamyanggang.apimodule.domain.jobDescription.scheduler + +import com.bamyanggang.apimodule.domain.jobDescription.application.service.JobDescriptionInfoUpdateService +import org.springframework.scheduling.annotation.Scheduled +import org.springframework.stereotype.Component + +@Component +class UpdateWriteStatusScheduler( + private val jobDescriptionInfoUpdateService: JobDescriptionInfoUpdateService +) { + + // 1분마다 돌아감 + @Scheduled(cron = "0 * * * * *", zone = "Asia/Seoul") + fun changeJobDescriptionWritingStatus() = jobDescriptionInfoUpdateService.invoke() + +} diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/dto/GetParentTag.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/dto/GetParentTag.kt index 8e15289c..851e0356 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/dto/GetParentTag.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/dto/GetParentTag.kt @@ -23,4 +23,8 @@ class GetParentTag { val strongPointCount: Int, val experienceCount: Int ) + + data class Years( + val years: List + ) } diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/dto/GetTag.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/dto/GetTag.kt new file mode 100644 index 00000000..8c9490b7 --- /dev/null +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/dto/GetTag.kt @@ -0,0 +1,20 @@ +package com.bamyanggang.apimodule.domain.tag.application.dto + +import java.util.* + +class GetTag { + data class Response( + val tags: List + ) + + data class ParentTagDetail( + val id: UUID, + val name: String, + val childTags: List + ) + + data class ChildTagDetail( + val id: UUID, + val name: String, + ) +} diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/service/TagCreateService.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/service/TagCreateService.kt index 1a112aac..9913c2e0 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/service/TagCreateService.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/service/TagCreateService.kt @@ -19,7 +19,7 @@ class TagCreateService( fun createChildTag(request: CreateTag.Request, parentTagId: UUID): CreateTag.Response { return getAuthenticationPrincipal() .also { - val userChildTags = tagReader.readAllChildTagsByUserId(it, parentTagId) + val userChildTags = tagReader.readAllChildTagsByUserIdAndParentTagId(it, parentTagId) validateTagCountLimit(userChildTags.size) validateDuplicatedName(userChildTags, request.name) }.let { diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/service/TagGetService.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/service/TagGetService.kt index 7914f695..9d16c8e2 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/service/TagGetService.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/service/TagGetService.kt @@ -3,6 +3,7 @@ package com.bamyanggang.apimodule.domain.tag.application.service import com.bamyanggang.apimodule.common.getAuthenticationPrincipal import com.bamyanggang.apimodule.domain.tag.application.dto.GetChildTag import com.bamyanggang.apimodule.domain.tag.application.dto.GetParentTag +import com.bamyanggang.apimodule.domain.tag.application.dto.GetTag import com.bamyanggang.domainmodule.domain.experience.service.ExperienceReader import com.bamyanggang.domainmodule.domain.tag.service.TagReader import org.springframework.stereotype.Service @@ -28,7 +29,7 @@ class TagGetService( @Transactional(readOnly = true) fun getAllChildTagsByParentTagId(parentTagId: UUID): GetChildTag.Response { val tagDetails = getAuthenticationPrincipal().let { - tagReader.readAllChildTagsByUserId(it, parentTagId).map { tag -> + tagReader.readAllChildTagsByUserIdAndParentTagId(it, parentTagId).map { tag -> GetParentTag.TagDetail(tag.id, tag.name) } } @@ -39,7 +40,7 @@ class TagGetService( @Transactional(readOnly = true) fun getParentTagsByYearAndLimit(year: Int, limit: Int): GetParentTag.Response { val currentUserId = getAuthenticationPrincipal() - val topParentTagIds = experienceReader.readByYearDesc(year, currentUserId) + val topParentTagIds = experienceReader.readByUserIDAndYearDesc(year, currentUserId) .distinctBy { it.parentTagId } .take(limit) .map { it.parentTagId } @@ -54,7 +55,7 @@ class TagGetService( @Transactional(readOnly = true) fun getAllParentTagsByYear(year: Int): GetParentTag.TotalTagInfo { val currentUserId = getAuthenticationPrincipal() - val experiences = experienceReader.readByYearDesc(year, currentUserId) + val experiences = experienceReader.readByUserIDAndYearDesc(year, currentUserId) val experienceGroup = experiences.groupBy { it.parentTagId } @@ -84,23 +85,60 @@ class TagGetService( @Transactional(readOnly = true) fun getAllChildTagsByYearAndParentTagId(year: Int, parentTagId: UUID): GetChildTag.TotalTagInfo { - val currentUserId = getAuthenticationPrincipal() - val experiences = experienceReader.readByYearDesc(year, currentUserId) - val experienceGroup = experiences.groupBy { it.childTagId } - - val tagSummaries = experienceGroup.map { - val childTag = tagReader.readById(it.key) + val childTags = getAllChildTagsByParentTagId(parentTagId).tags.map { tagReader.readById(it.id) } + var totalExperienceCount = 0 + val childTagDetails = childTags.map { + val experiences = experienceReader.readByChildTagIdAndYear(year, it.id) + totalExperienceCount += experiences.size GetChildTag.ChildTagSummary( - childTag.id, - childTag.name, - it.value.size + it.id, + it.name, + experiences.size ) } return GetChildTag.TotalTagInfo( - experiences.size, - tagSummaries + totalExperienceCount, + childTagDetails ) } + + @Transactional(readOnly = true) + fun getAllYearsByParentTagId(parentTagId: UUID): GetParentTag.Years { + val experiences = getAuthenticationPrincipal().let { + experienceReader.readByUserIdAndParentTagId(it, parentTagId) + } + + val years = experiences + .distinctBy { it.createdAt.year } + .map { it.createdAt.year } + .sorted().reversed() + + return GetParentTag.Years(years) + } + + @Transactional(readOnly = true) + fun getAllTags(): GetTag.Response { + val parentTags = getAuthenticationPrincipal().let { + tagReader.readAllParentTagsByUserId(it) + } + + val parentTagDetails = parentTags.map { + val childTagDetails = tagReader.readChildTagsByParentTagId(it.id).map { + GetTag.ChildTagDetail( + it.id, + it.name + ) + } + + GetTag.ParentTagDetail( + it.id, + it.name, + childTagDetails + ) + } + + return GetTag.Response(parentTagDetails) + } } diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/presentation/TagApi.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/presentation/TagApi.kt index a76f6af7..ae5bab59 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/presentation/TagApi.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/presentation/TagApi.kt @@ -2,8 +2,10 @@ package com.bamyanggang.apimodule.domain.tag.presentation object TagApi { const val BASE_URL = "/api/tags" + const val ALL_TAGS = "${BASE_URL}/all-tags" const val MY_PARENT_TAG_URL = "$BASE_URL/my" const val TOP_RANK_TAG_URL = "$BASE_URL/top-rank" const val TAG_PATH_VARIABLE_URL = "$BASE_URL/{tagId}" const val MY_CHILD_TAG_URL = "$BASE_URL/{tagId}/my" + const val ALL_YEARS = "$BASE_URL/{parentTagId}/all-years" } diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/presentation/TagController.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/presentation/TagController.kt index 27f29ae4..127e42a5 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/presentation/TagController.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/presentation/TagController.kt @@ -3,6 +3,7 @@ package com.bamyanggang.apimodule.domain.tag.presentation import com.bamyanggang.apimodule.domain.tag.application.dto.CreateTag import com.bamyanggang.apimodule.domain.tag.application.dto.GetChildTag import com.bamyanggang.apimodule.domain.tag.application.dto.GetParentTag +import com.bamyanggang.apimodule.domain.tag.application.dto.GetTag import com.bamyanggang.apimodule.domain.tag.application.service.TagCreateService import com.bamyanggang.apimodule.domain.tag.application.service.TagDeleteService import com.bamyanggang.apimodule.domain.tag.application.service.TagGetService @@ -15,6 +16,11 @@ class TagController( private val tagDeleteService: TagDeleteService, private val tagGetService: TagGetService ) { + @GetMapping(TagApi.ALL_YEARS) + fun getAllYearsByParentTag(@PathVariable("parentTagId") parentTagId: UUID): GetParentTag.Years{ + return tagGetService.getAllYearsByParentTagId(parentTagId) + } + @GetMapping(TagApi.TOP_RANK_TAG_URL) fun getTopRankTagsByLimit( @RequestParam("year") year: Int, @@ -33,6 +39,11 @@ class TagController( return tagGetService.getAllChildTagsByParentTagId(parentTagId) } + @GetMapping(TagApi.ALL_TAGS) + fun getAllTags(): GetTag.Response { + return tagGetService.getAllTags() + } + @GetMapping(TagApi.BASE_URL) fun getParentTagsByYear(@RequestParam("year") year: Int): GetParentTag.TotalTagInfo { return tagGetService.getAllParentTagsByYear(year) diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/global/config/SchedulerConfig.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/global/config/SchedulerConfig.kt new file mode 100644 index 00000000..9dc9d0ff --- /dev/null +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/global/config/SchedulerConfig.kt @@ -0,0 +1,9 @@ +package com.bamyanggang.apimodule.global.config + +import org.springframework.context.annotation.Configuration +import org.springframework.scheduling.annotation.EnableScheduling + +@EnableScheduling +@Configuration +class SchedulerConfig { +} 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 d95c9bd0..e10e8b97 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 @@ -607,9 +607,11 @@ class ExperienceControllerTest : BaseRestDocsTest() { @DisplayName("유저의 경험 내 존재하는 연도들을 중복 제거한 리스트를 반환한다.") fun getExperienceYearsTest() { //given - val userId: UUID = generateFixture() val years = arrayListOf(2020,2021,2023, 2024, 2025) - val yearResponse = ExperienceYear.Response(years) + val yearResponse = ExperienceYear.Response( + years, + generateFixture() + ) given(experienceGetService.getAllYearsByExistExperience()).willReturn(yearResponse) @@ -626,7 +628,12 @@ class ExperienceControllerTest : BaseRestDocsTest() { headerWithName("Authorization").description("엑세스 토큰") ), responseFields( - fieldWithPath("years").description("경험이 존재하는 연도 배열(활동 시작 일시 기준)") + fieldWithPath("years").description("경험이 존재하는 연도 배열(활동 시작 일시 기준)"), + fieldWithPath("yearTagInfos").description("연도 내 상위 태그 정보 배열"), + fieldWithPath("yearTagInfos[].year").description("연도"), + fieldWithPath("yearTagInfos[].tags").description("연도 내 상위 태그 정보"), + fieldWithPath("yearTagInfos[].tags[].id").description("상위 태그 id"), + fieldWithPath("yearTagInfos[].tags[].name").description("상위 태그 이름"), ) ) ) diff --git a/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/ApplicationInfoGetServiceTest.kt b/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/ApplyInfoGetServiceTest.kt similarity index 74% rename from Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/ApplicationInfoGetServiceTest.kt rename to Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/ApplyInfoGetServiceTest.kt index 6f46cfbb..48edd6b1 100644 --- a/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/ApplicationInfoGetServiceTest.kt +++ b/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/jobDescription/application/ApplyInfoGetServiceTest.kt @@ -2,14 +2,16 @@ 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 com.bamyanggang.domainmodule.domain.jobDescription.service.JobDescriptionReader import io.kotest.core.spec.style.BehaviorSpec import io.mockk.mockk import io.mockk.verify import java.util.UUID -class ApplicationInfoGetServiceTest: BehaviorSpec({ +class ApplyInfoGetServiceTest: BehaviorSpec({ val mockApplyReader = mockk(relaxed = true) - val service = ApplyInfoGetService(mockApplyReader) + val mockJobDescriptionReader = mockk(relaxed = true) + val service = ApplyInfoGetService(mockApplyReader, mockJobDescriptionReader) given("ApplyInfoGetService.getApplyInfo") { val jobDescriptionId: UUID = UUID.randomUUID() 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 46fc9a04..c6fc3225 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 @@ -408,7 +408,8 @@ class JobDescriptionControllerTest : BaseRestDocsTest() { ), responseFields( fieldWithPath("applyContentList[].question").description("질문"), - fieldWithPath("applyContentList[].answer").description("답변") + fieldWithPath("applyContentList[].answer").description("답변"), + fieldWithPath("writeStatus").description("작성 상태. NOT_APPLIED(칩 없음, 작성 전), WRITING(작성 중), WRITTEN(작성 완료), CLOSED(마감)") ) ) ) diff --git a/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/tag/presentation/TagControllerTest.kt b/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/tag/presentation/TagControllerTest.kt index db85d1d7..51a978b5 100644 --- a/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/tag/presentation/TagControllerTest.kt +++ b/Api-Module/src/test/kotlin/com/bamyanggang/apimodule/domain/tag/presentation/TagControllerTest.kt @@ -4,6 +4,7 @@ import com.bamyanggang.apimodule.BaseRestDocsTest import com.bamyanggang.apimodule.domain.tag.application.dto.CreateTag import com.bamyanggang.apimodule.domain.tag.application.dto.GetChildTag import com.bamyanggang.apimodule.domain.tag.application.dto.GetParentTag +import com.bamyanggang.apimodule.domain.tag.application.dto.GetTag import com.bamyanggang.commonmodule.exception.ExceptionHandler import com.bamyanggang.commonmodule.fixture.generateFixture import com.bamyanggang.domainmodule.domain.tag.exception.TagException @@ -209,6 +210,54 @@ class TagControllerTest : BaseRestDocsTest() { ) } + @Test + @DisplayName("상위 태그와 하위 태그 전체를 조회한다.") + fun getAllTagsTest() { + //given + val childTagDetails = arrayListOf( + GetTag.ChildTagDetail(UUID.randomUUID(), "하위 태그 이름 1"), + GetTag.ChildTagDetail(UUID.randomUUID(), "하위 태그 이름 2") + ) + + val parentTagDetails = arrayListOf( + GetTag.ParentTagDetail(UUID.randomUUID(), + "상위, 태그 이름 1", + childTagDetails + ), + GetTag.ParentTagDetail(UUID.randomUUID(), + "상위, 태그 이름 1", + childTagDetails + ), + ) + + val tagResponse = GetTag.Response(parentTagDetails) + + given(tagController.getAllTags()).willReturn(tagResponse) + + val request = RestDocumentationRequestBuilders.get(TagApi.ALL_TAGS) + .header("Authorization", "Bearer Access Token") + + //when + val result = mockMvc.perform(request) + + //then + result.andExpect(status().isOk) + .andDo(resultHandler.document( + requestHeaders( + headerWithName("Authorization").description("엑세스 토큰") + ), + responseFields( + fieldWithPath("tags").description("태그 리스트"), + fieldWithPath("tags[].id").description("상위 태그 id"), + fieldWithPath("tags[].name").description("상위 태그 이름"), + fieldWithPath("tags[].childTags").description("하위 태그 리스트"), + fieldWithPath("tags[].childTags[].id").description("하위 태그 id"), + fieldWithPath("tags[].childTags[].name").description("하위 태그 이름"), + ) + ) + ) + } + @Test @DisplayName("하위 태그를 전체 조회한다.") fun getAllChildTagTest() { @@ -282,6 +331,40 @@ class TagControllerTest : BaseRestDocsTest() { ) } + @Test + @DisplayName("상위 태그 내 존재하는 경험들의 연도를 반환한다.") + fun getYearsByParentTagId() { + //given + + val yearResponse = GetParentTag.Years( + arrayListOf(2024, 2023, 2022) + ) + + val parentTagId = UUID.randomUUID() + given(tagController.getAllYearsByParentTag(parentTagId)).willReturn(yearResponse) + + val request = RestDocumentationRequestBuilders.get(TagApi.ALL_YEARS, parentTagId) + .header("Authorization", "Bearer Access Token") + + //when + val result = mockMvc.perform(request) + + //then + result.andExpect(status().isOk) + .andDo(resultHandler.document( + requestHeaders( + headerWithName("Authorization").description("엑세스 토큰") + ), + pathParameters( + parameterWithName("parentTagId").description("상위 태그 id") + ), + responseFields( + fieldWithPath("years").description("상위 태그 리스트"), + ) + ) + ) + } + @Test @DisplayName("최근에 추가된 경험이 있는 순으로 상위 태그 정보를 반환한다.") fun getTopRankParentTagTest() { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/config/BookmarkServiceConfiguration.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/config/BookmarkServiceConfiguration.kt new file mode 100644 index 00000000..1f464be4 --- /dev/null +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/config/BookmarkServiceConfiguration.kt @@ -0,0 +1,30 @@ +package com.bamyanggang.domainmodule.domain.bookmark.config + +import com.bamyanggang.domainmodule.domain.bookmark.repository.BookmarkRepository +import com.bamyanggang.domainmodule.domain.bookmark.service.BookmarkAppender +import com.bamyanggang.domainmodule.domain.bookmark.service.BookmarkModifier +import com.bamyanggang.domainmodule.domain.bookmark.service.BookmarkReader +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +@Configuration +class BookmarkServiceConfiguration( + private val bookmarkRepository: BookmarkRepository +) { + + @Bean + fun bookmarkAppender(): BookmarkAppender { + return BookmarkAppender(bookmarkRepository) + } + + @Bean + fun bookmarkModifier(): BookmarkModifier { + return BookmarkModifier(bookmarkRepository) + } + + @Bean + fun bookmarkReader(): BookmarkReader { + return BookmarkReader(bookmarkRepository) + } + +} diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/service/BookmarkAppender.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/service/BookmarkAppender.kt index 5dd5a76c..45d71826 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/service/BookmarkAppender.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/service/BookmarkAppender.kt @@ -2,10 +2,8 @@ package com.bamyanggang.domainmodule.domain.bookmark.service import com.bamyanggang.domainmodule.domain.bookmark.aggregate.Bookmark import com.bamyanggang.domainmodule.domain.bookmark.repository.BookmarkRepository -import org.springframework.stereotype.Service import java.util.* -@Service class BookmarkAppender( private val bookmarkRepository: BookmarkRepository ) { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/service/BookmarkModifier.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/service/BookmarkModifier.kt index de6a9965..64938ac6 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/service/BookmarkModifier.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/service/BookmarkModifier.kt @@ -2,9 +2,8 @@ package com.bamyanggang.domainmodule.domain.bookmark.service import com.bamyanggang.domainmodule.domain.bookmark.aggregate.Bookmark import com.bamyanggang.domainmodule.domain.bookmark.repository.BookmarkRepository -import org.springframework.stereotype.Service -@Service + class BookmarkModifier( private val bookmarkRepository: BookmarkRepository ) { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/service/BookmarkReader.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/service/BookmarkReader.kt index 15ece4bc..01307311 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/service/BookmarkReader.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/bookmark/service/BookmarkReader.kt @@ -3,10 +3,8 @@ package com.bamyanggang.domainmodule.domain.bookmark.service import com.bamyanggang.domainmodule.domain.bookmark.aggregate.Bookmark import com.bamyanggang.domainmodule.domain.bookmark.enums.BookmarkStatus import com.bamyanggang.domainmodule.domain.bookmark.repository.BookmarkRepository -import org.springframework.stereotype.Service import java.util.* -@Service class BookmarkReader( private val bookmarkRepository: BookmarkRepository ) { 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 dd8bfe2c..ff98106c 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 @@ -13,4 +13,7 @@ interface ExperienceRepository { fun findByYearAndChildTagId(year: Int, childTagId: UUID): List fun findByIds(experienceIds: List): List fun findByTitleContains(search: String): List + fun findByUserIdAndParentTagId(userId: UUID, parentTagId: UUID): List + fun findByUserIdAndParentTagIdAndYearDesc(year: Int, parentTagId: UUID, userId: UUID): List + fun findByYear(year: Int): 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 998ff249..3811a6c0 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 @@ -26,7 +26,7 @@ class ExperienceReader( return experienceRepository.findAllByUserId(userId) } - fun readByYearDesc(year: Int, userId: UUID): List { + fun readByUserIDAndYearDesc(year: Int, userId: UUID): List { return experienceRepository.findByUserIdAndYearDesc(year, userId) } @@ -34,7 +34,15 @@ class ExperienceReader( return experienceRepository.findByYearAndParentTagId(year, parentTagId) } - fun readByYearAndChildTagId(year: Int, childTagId: UUID): List { + fun readByUserIdAndParentTagId(userId: UUID, parentTagId: UUID): List { + return experienceRepository.findByUserIdAndParentTagId(userId, parentTagId) + } + + fun readByUserIdAndParentTagIdAndYearDesc(year: Int, parentTagId: UUID, userId: UUID): List { + return experienceRepository.findByUserIdAndParentTagIdAndYearDesc(year, parentTagId, userId) + } + + fun readByChildTagIdAndYear(year: Int, childTagId: UUID): List { return experienceRepository.findByYearAndChildTagId(year, childTagId) } @@ -53,5 +61,8 @@ class ExperienceReader( it.contents.map { content -> content.question.contains(search) || content.answer.contains(search) }.contains(true) }.map { it.id } + + fun readByYear(year: Int): List { + return experienceRepository.findByYear(year) } } diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/config/JobDescriptionServiceConfiguration.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/config/JobDescriptionServiceConfiguration.kt new file mode 100644 index 00000000..ab4d9722 --- /dev/null +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/config/JobDescriptionServiceConfiguration.kt @@ -0,0 +1,51 @@ +package com.bamyanggang.domainmodule.domain.jobDescription.config + +import com.bamyanggang.domainmodule.domain.jobDescription.repository.ApplyRepository +import com.bamyanggang.domainmodule.domain.jobDescription.repository.JobDescriptionRepository +import com.bamyanggang.domainmodule.domain.jobDescription.service.* +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +@Configuration +class JobDescriptionServiceConfiguration( + private val jobDescriptionRepository: JobDescriptionRepository, + private val applyRepository: ApplyRepository +) { + + @Bean + fun jobDescriptionAppender(): JobDescriptionAppender { + return JobDescriptionAppender(jobDescriptionRepository) + } + + @Bean + fun jobDescriptionModifier(): JobDescriptionModifier { + return JobDescriptionModifier(jobDescriptionRepository) + } + + @Bean + fun jobDescriptionReader(): JobDescriptionReader { + return JobDescriptionReader(jobDescriptionRepository) + } + + @Bean + fun jobDescriptionRemover(): JobDescriptionRemover { + return JobDescriptionRemover(jobDescriptionRepository) + } + + @Bean + fun applyAppender(): ApplyAppender { + return ApplyAppender(applyRepository) + } + + @Bean + fun applyModifier(): ApplyModifier { + return ApplyModifier(applyRepository) + } + + @Bean + fun applyReader(): ApplyReader { + return ApplyReader(applyRepository) + } + + +} diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/repository/JobDescriptionRepository.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/repository/JobDescriptionRepository.kt index f4a47762..35eb05c6 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/repository/JobDescriptionRepository.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/repository/JobDescriptionRepository.kt @@ -13,10 +13,10 @@ interface JobDescriptionRepository { fun findAllByUserIdAndSortByCreatedAt(userId: UUID, page: Int, size: Int, writeStatus: WriteStatus?): PageDomain - fun findAllByUserIdAndSortByEndedAt(userId: UUID, page: Int, size: Int, writeStatus: WriteStatus?): PageDomain - fun findAllByUserId(userId: UUID, page: Int, size: Int, writeStatus: WriteStatus?): PageDomain fun deleteById(jobDescriptionId: UUID) + fun changeWriteStatus() + } diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/ApplyAppender.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/ApplyAppender.kt index c85b43af..39814259 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/ApplyAppender.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/ApplyAppender.kt @@ -3,10 +3,8 @@ package com.bamyanggang.domainmodule.domain.jobDescription.service import com.bamyanggang.domainmodule.domain.jobDescription.aggregate.Apply import com.bamyanggang.domainmodule.domain.jobDescription.aggregate.ApplyContent import com.bamyanggang.domainmodule.domain.jobDescription.repository.ApplyRepository -import org.springframework.stereotype.Service import java.util.* -@Service class ApplyAppender( private val applyRepository: ApplyRepository ) { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/ApplyModifier.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/ApplyModifier.kt index 8d845e08..4edc3ec0 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/ApplyModifier.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/ApplyModifier.kt @@ -2,10 +2,8 @@ package com.bamyanggang.domainmodule.domain.jobDescription.service import com.bamyanggang.domainmodule.domain.jobDescription.aggregate.ApplyContent import com.bamyanggang.domainmodule.domain.jobDescription.repository.ApplyRepository -import org.springframework.stereotype.Service import java.util.* -@Service class ApplyModifier( private val applyRepository: ApplyRepository ) { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/ApplyReader.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/ApplyReader.kt index b270206d..94734988 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/ApplyReader.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/ApplyReader.kt @@ -2,10 +2,8 @@ package com.bamyanggang.domainmodule.domain.jobDescription.service import com.bamyanggang.domainmodule.domain.jobDescription.aggregate.Apply import com.bamyanggang.domainmodule.domain.jobDescription.repository.ApplyRepository -import org.springframework.stereotype.Service import java.util.* -@Service class ApplyReader( private val applyRepository: ApplyRepository ) { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionAppender.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionAppender.kt index 9cfae981..76fc641a 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionAppender.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionAppender.kt @@ -1,13 +1,10 @@ package com.bamyanggang.domainmodule.domain.jobDescription.service import com.bamyanggang.domainmodule.domain.jobDescription.aggregate.JobDescription -import com.bamyanggang.domainmodule.domain.jobDescription.enums.WriteStatus import com.bamyanggang.domainmodule.domain.jobDescription.repository.JobDescriptionRepository -import org.springframework.stereotype.Service import java.time.LocalDateTime import java.util.UUID -@Service class JobDescriptionAppender( private val jobDescriptionRepository: JobDescriptionRepository ) { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionModifier.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionModifier.kt index 4abe500d..2f61fb18 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionModifier.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionModifier.kt @@ -1,11 +1,9 @@ package com.bamyanggang.domainmodule.domain.jobDescription.service import com.bamyanggang.domainmodule.domain.jobDescription.repository.JobDescriptionRepository -import org.springframework.stereotype.Service import java.time.LocalDateTime import java.util.UUID -@Service class JobDescriptionModifier( private val jobDescriptionRepository: JobDescriptionRepository ) { @@ -38,4 +36,8 @@ class JobDescriptionModifier( .also { jobDescriptionRepository.save(it) } } + fun invoke() { + jobDescriptionRepository.changeWriteStatus() + } + } diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionReader.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionReader.kt index 84931bba..b9367de9 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionReader.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionReader.kt @@ -5,21 +5,34 @@ import com.bamyanggang.domainmodule.domain.jobDescription.aggregate.JobDescripti import com.bamyanggang.domainmodule.domain.jobDescription.enums.SortType import com.bamyanggang.domainmodule.domain.jobDescription.enums.WriteStatus import com.bamyanggang.domainmodule.domain.jobDescription.repository.JobDescriptionRepository -import org.springframework.stereotype.Service +import java.time.LocalDateTime +import java.time.temporal.ChronoUnit import java.util.* -@Service class JobDescriptionReader( private val jobDescriptionRepository: JobDescriptionRepository ) { fun readJobDescriptionByUserIdAndSortType(userId: UUID, page: Int, size: Int, sortType: SortType?, writeStatus: WriteStatus?): PageDomain { return when(sortType) { SortType.CREATED -> jobDescriptionRepository.findAllByUserIdAndSortByCreatedAt(userId, page, size, writeStatus) - SortType.ENDED -> jobDescriptionRepository.findAllByUserIdAndSortByEndedAt(userId, page, size, writeStatus) + SortType.ENDED -> sortWithEndedAt(jobDescriptionRepository.findAllByUserId(userId, page, size, writeStatus)) else -> jobDescriptionRepository.findAllByUserId(userId, page, size, writeStatus) } } + private fun sortWithEndedAt (pageDomain: PageDomain): PageDomain { + val now = LocalDateTime.now() + val futureList = pageDomain.content.filter { it.endedAt.isAfter(now) } + val pastList = pageDomain.content.filter { it.endedAt.isBefore(now) } + + val sortedFutureList = futureList.sortedWith(compareBy { kotlin.math.abs(ChronoUnit.DAYS.between(it.endedAt, now)) }) + val sortedPastList = pastList.sortedWith(compareByDescending { it.endedAt }) + + val sortedList = sortedFutureList + sortedPastList + + return PageDomain(sortedList, pageDomain.pageNumber, pageDomain.pageSize, pageDomain.totalPage, pageDomain.hasNext) + } + fun readJobDescriptionById(jobDescriptionId: UUID): JobDescription { return jobDescriptionRepository.findById(jobDescriptionId) } diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionRemover.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionRemover.kt index 56988c56..48dded6f 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionRemover.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/jobDescription/service/JobDescriptionRemover.kt @@ -1,10 +1,8 @@ package com.bamyanggang.domainmodule.domain.jobDescription.service import com.bamyanggang.domainmodule.domain.jobDescription.repository.JobDescriptionRepository -import org.springframework.stereotype.Service import java.util.* -@Service class JobDescriptionRemover( private val jobDescriptionRepository: JobDescriptionRepository ) { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/tag/repository/TagRepository.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/tag/repository/TagRepository.kt index b0152cc3..7d7c6dd3 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/tag/repository/TagRepository.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/tag/repository/TagRepository.kt @@ -7,9 +7,10 @@ interface TagRepository { fun save(newTag : Tag) fun findById(id : UUID) : Tag fun findAllParentTagsByUserId(userId: UUID): List - fun findAllChildTagsByUserId(userId: UUID, parentId: UUID): List + fun findAllChildTagsByUserIdAndParentTagId(userId: UUID, parentId: UUID): List fun deleteByTagId(tagId: UUID) fun isExistById(tagId: UUID): Boolean fun findByParentTagIds(tagParentTagIds: List): List fun findByNameContains(search: String): List + fun findAllChildTagsByParentTagId(parentTagId: UUID) : List } diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/tag/service/TagReader.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/tag/service/TagReader.kt index a539aab9..78c74ad5 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/tag/service/TagReader.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/tag/service/TagReader.kt @@ -13,8 +13,8 @@ class TagReader( return tagRepository.findAllParentTagsByUserId(userId) } - fun readAllChildTagsByUserId(userId: UUID, parentId: UUID): List { - return tagRepository.findAllChildTagsByUserId(userId, parentId) + fun readAllChildTagsByUserIdAndParentTagId(userId: UUID, parentId: UUID): List { + return tagRepository.findAllChildTagsByUserIdAndParentTagId(userId, parentId) } fun readById(tagId: UUID): Tag { @@ -28,4 +28,8 @@ class TagReader( fun readIdsByNameContains(search: String) : List { return tagRepository.findByNameContains(search).map { it.id } } + + fun readChildTagsByParentTagId(parentTagId: UUID) : List { + return tagRepository.findAllChildTagsByParentTagId(parentTagId) + } } diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/config/UserServiceConfiguration.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/config/UserServiceConfiguration.kt new file mode 100644 index 00000000..7f3f537a --- /dev/null +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/config/UserServiceConfiguration.kt @@ -0,0 +1,46 @@ +package com.bamyanggang.domainmodule.domain.user.config + +import com.bamyanggang.domainmodule.domain.user.repository.TokenRepository +import com.bamyanggang.domainmodule.domain.user.repository.UserRepository +import com.bamyanggang.domainmodule.domain.user.service.* +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +@Configuration +class UserServiceConfiguration( + private val tokenRepository: TokenRepository, + private val userRepository: UserRepository +) { + + @Bean + fun tokenAppender(): TokenAppender { + return TokenAppender(tokenRepository) + } + + @Bean + fun tokenReader(): TokenReader { + return TokenReader(tokenRepository) + } + + @Bean + fun tokenRemover(): TokenRemover { + return TokenRemover(tokenRepository) + } + + @Bean + fun userAppender(): UserAppender { + return UserAppender(userRepository) + } + + @Bean + fun userModifier(): UserModifier { + return UserModifier(userRepository) + } + + @Bean + fun userReader(): UserReader { + return UserReader(userRepository) + } + + +} diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/TokenAppender.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/TokenAppender.kt index 6d91fd9f..5f0ccb43 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/TokenAppender.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/TokenAppender.kt @@ -2,10 +2,8 @@ package com.bamyanggang.domainmodule.domain.user.service import com.bamyanggang.domainmodule.domain.user.aggregate.Token import com.bamyanggang.domainmodule.domain.user.repository.TokenRepository -import org.springframework.stereotype.Service import java.util.* -@Service class TokenAppender ( private val tokenRepository: TokenRepository ) { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/TokenReader.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/TokenReader.kt index 30e18285..468784cd 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/TokenReader.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/TokenReader.kt @@ -2,9 +2,7 @@ package com.bamyanggang.domainmodule.domain.user.service import com.bamyanggang.domainmodule.domain.user.aggregate.Token import com.bamyanggang.domainmodule.domain.user.repository.TokenRepository -import org.springframework.stereotype.Service -@Service class TokenReader( private val tokenRepository: TokenRepository ) { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/TokenRemover.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/TokenRemover.kt index b835cbcf..38da3f33 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/TokenRemover.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/TokenRemover.kt @@ -2,9 +2,7 @@ package com.bamyanggang.domainmodule.domain.user.service import com.bamyanggang.domainmodule.domain.user.aggregate.Token import com.bamyanggang.domainmodule.domain.user.repository.TokenRepository -import org.springframework.stereotype.Service -@Service class TokenRemover( private val tokenRepository: TokenRepository ) { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserAppender.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserAppender.kt index 14dff092..aca24335 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserAppender.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserAppender.kt @@ -3,9 +3,7 @@ package com.bamyanggang.domainmodule.domain.user.service import com.bamyanggang.domainmodule.domain.user.aggregate.User import com.bamyanggang.domainmodule.domain.user.enums.SocialLoginProvider import com.bamyanggang.domainmodule.domain.user.repository.UserRepository -import org.springframework.stereotype.Service -@Service class UserAppender( private val userRepository: UserRepository ) { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserModifier.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserModifier.kt index 60b9a3e5..1008752a 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserModifier.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserModifier.kt @@ -1,10 +1,8 @@ package com.bamyanggang.domainmodule.domain.user.service import com.bamyanggang.domainmodule.domain.user.repository.UserRepository -import org.springframework.stereotype.Service import java.util.UUID -@Service class UserModifier( private val userRepository: UserRepository ) { @@ -29,4 +27,4 @@ class UserModifier( .also { userRepository.save(it) } } -} \ No newline at end of file +} diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserReader.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserReader.kt index 64ee48c8..8f897444 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserReader.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/user/service/UserReader.kt @@ -2,10 +2,8 @@ package com.bamyanggang.domainmodule.domain.user.service import com.bamyanggang.domainmodule.domain.user.aggregate.User import com.bamyanggang.domainmodule.domain.user.repository.UserRepository -import org.springframework.stereotype.Service import java.util.UUID -@Service class UserReader( private val userRepository: UserRepository ) { @@ -16,4 +14,4 @@ class UserReader( fun readUserById(userId: UUID): User { return userRepository.findById(userId) } -} \ No newline at end of file +} 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 5338ac30..f6ed83c8 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 @@ -84,6 +84,33 @@ public List findByIds(List experienceIds) { public List findByTitleContains(String search) { List experienceJpaEntities = experienceJpaRepository.findByTitleContaining(search); + } + + public List findByUserIdAndParentTagId(UUID userId, UUID parentTagId) { + List experienceJpaEntities = experienceJpaRepository.findByUserIdAndParentTagId(userId, + parentTagId); + + return experienceJpaEntities.stream().map(experienceMapper::toExperienceDomainEntity).toList(); + } + + @Override + public List findByUserIdAndParentTagIdAndYearDesc(int year, UUID parentTagId, UUID userId) { + LocalDateTime startYear = LocalDateTime.of(year, 1, 1, 0, 0); + LocalDateTime endYear = LocalDateTime.of(year, 12, 31, 23, 59); + + List experienceJpaEntities = experienceJpaRepository + .findByUserIdAndParentTagIdAndCreatedAtBetweenOrderByCreatedAtDesc( + userId, parentTagId, startYear, endYear); + return experienceJpaEntities.stream().map(experienceMapper::toExperienceDomainEntity).toList(); + } + + @Override + public List findByYear(int year) { + LocalDateTime startYear = LocalDateTime.of(year, 1, 1, 0, 0); + LocalDateTime endYear = LocalDateTime.of(year, 12, 31, 23, 59); + List experienceJpaEntities = experienceJpaRepository.findByCreatedAtBetween(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 dd2d62ab..cf610970 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 @@ -19,4 +19,9 @@ public interface ExperienceJpaRepository extends JpaRepository findByIds(@Param("experienceIds") List experienceIds); + + List findByCreatedAtBetween(LocalDateTime startYear, LocalDateTime endYear); + List findByUserIdAndParentTagId(UUID userId, UUID parentTagId); + List findByUserIdAndParentTagIdAndCreatedAtBetweenOrderByCreatedAtDesc( + UUID userId, UUID parentTagId, LocalDateTime startYear, LocalDateTime endYear); } diff --git a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/jobDescription/JobDescriptionRepositoryImpl.java b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/jobDescription/JobDescriptionRepositoryImpl.java index 2f9feb2b..de6776df 100644 --- a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/jobDescription/JobDescriptionRepositoryImpl.java +++ b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/jobDescription/JobDescriptionRepositoryImpl.java @@ -29,6 +29,7 @@ public void save(JobDescription jobDescription) { jobDescriptionJpaRepository.save(jobDescriptionJpaEntity); } + @Override public JobDescription findById(UUID jobDescriptionId) { return jobDescriptionJpaRepository.findById(jobDescriptionId) .map(jobDescriptionMapper::toDomainEntity) @@ -54,18 +55,13 @@ public PageDomain findAllByUserId(UUID userId, int page, int siz } @Override - public PageDomain findAllByUserIdAndSortByEndedAt(UUID userId, int page, int size, WriteStatus writeStatus) { - Pageable pageable = PageRequest.of(page, size); - LocalDateTime now = LocalDateTime.now(); - Page jobDescriptionJpaEntities = jobDescriptionJpaRepository.findAllByUserIdAndWriteStatusAndTime(userId, writeStatus, now, pageable); - Page jobDescriptionSlice = jobDescriptionJpaEntities.map(jobDescriptionMapper::toDomainEntity); - return new PageDomain<>(jobDescriptionSlice.getContent(), jobDescriptionSlice.getNumber(), jobDescriptionSlice.getSize() - ,jobDescriptionSlice.getTotalPages(), jobDescriptionSlice.hasNext()); + public void deleteById(UUID jobDescriptionId) { + jobDescriptionJpaRepository.deleteById(jobDescriptionId); } @Override - public void deleteById(UUID jobDescriptionId) { - jobDescriptionJpaRepository.deleteById(jobDescriptionId); + public void changeWriteStatus() { + jobDescriptionJpaRepository.changeWriteStatus(); } } diff --git a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/jobDescription/jpa/repository/JobDescriptionJpaRepository.java b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/jobDescription/jpa/repository/JobDescriptionJpaRepository.java index 10b8ee7a..55cc7fc7 100644 --- a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/jobDescription/jpa/repository/JobDescriptionJpaRepository.java +++ b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/jobDescription/jpa/repository/JobDescriptionJpaRepository.java @@ -7,6 +7,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -15,8 +16,8 @@ public interface JobDescriptionJpaRepository extends JpaRepository findAllByUserIdAndWriteStatus(@Param("userId") UUID userId, @Param("writeStatus") WriteStatus writeStatus, @Param("date") Pageable pageable); - @Query("SELECT j FROM JobDescriptionJpaEntity j WHERE j.userId = :userId AND (:writeStatus is null or j.writeStatus = :writeStatus) AND j.endedAt > :date ORDER BY j.endedAt ASC") - Page findAllByUserIdAndWriteStatusAndTime(@Param("userId") UUID userId, @Param("writeStatus") WriteStatus writeStatus, - @Param("date") LocalDateTime now, Pageable pageable); + @Modifying + @Query("UPDATE JobDescriptionJpaEntity j SET j.writeStatus = 'CLOSED' WHERE j.endedAt < CURRENT_TIMESTAMP") + void changeWriteStatus(); } diff --git a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/tag/TagRepositoryImpl.java b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/tag/TagRepositoryImpl.java index 53bbc2a5..c4ca1aea 100644 --- a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/tag/TagRepositoryImpl.java +++ b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/tag/TagRepositoryImpl.java @@ -30,7 +30,7 @@ public List findAllParentTagsByUserId(UUID userId) { } @Override - public List findAllChildTagsByUserId(UUID userId, UUID parentTagId) { + public List findAllChildTagsByUserIdAndParentTagId(UUID userId, UUID parentTagId) { List childTagJpaEntities = tagJpaRepository.findAllByUserIdAndParentTagId(userId, parentTagId); return childTagJpaEntities.stream().map(tagMapper::toDomainEntity).toList(); } @@ -60,6 +60,10 @@ public Tag findById(UUID tagId) { @Override public List findByNameContains(String search) { List tagJpaEntities = tagJpaRepository.findByNameContaining(search); + } + + public List findAllChildTagsByParentTagId(UUID parentTagId) { + List tagJpaEntities = tagJpaRepository.findAllByParentTagId(parentTagId); return tagJpaEntities.stream().map(tagMapper::toDomainEntity).toList(); } diff --git a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/tag/jpa/repository/TagJpaRepository.java b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/tag/jpa/repository/TagJpaRepository.java index 1c2f0123..3cffd075 100644 --- a/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/tag/jpa/repository/TagJpaRepository.java +++ b/Infrastructure-Module/persistence/src/main/java/com/bamyanggang/persistence/tag/jpa/repository/TagJpaRepository.java @@ -7,8 +7,8 @@ public interface TagJpaRepository extends JpaRepository { List findAllByUserIdAndParentTagIdIsNull(UUID userId); - List findAllByUserIdAndParentTagId(UUID parentTagId, UUID parentId); - List findByNameContaining(String search); + List findAllByUserIdAndParentTagId(UUID userId, UUID parentId); + List findAllByParentTagId(UUID parentTagId); }