Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@ package picklab.backend.archive.application

import org.springframework.stereotype.Component
import org.springframework.transaction.annotation.Transactional
import picklab.backend.activity.domain.enums.ActivityType
import picklab.backend.activity.domain.service.ActivityService
import picklab.backend.archive.domain.entity.ArchiveReferenceUrl
import picklab.backend.archive.domain.entity.ArchiveUploadFileUrl
import picklab.backend.archive.domain.enums.ArchiveSortType
import picklab.backend.archive.domain.service.ArchiveReferenceUrlService
import picklab.backend.archive.domain.service.ArchiveService
import picklab.backend.archive.domain.service.ArchiveUploadFileUrlService
import picklab.backend.archive.entrypoint.request.ArchiveCreateRequest
import picklab.backend.archive.entrypoint.request.ArchiveUpdateRequest
import picklab.backend.archive.entrypoint.response.ArchiveActivityResponse
import picklab.backend.common.model.MemberPrincipal
import picklab.backend.file.application.FileManagementService
import picklab.backend.member.domain.MemberService
Expand Down Expand Up @@ -65,4 +68,16 @@ class ArchiveUseCase(

archiveService.save(archive)
}

@Transactional(readOnly = true)
fun getArchiveList(
activityType: ActivityType?,
sort: ArchiveSortType,
memberPrincipal: MemberPrincipal,
): List<ArchiveActivityResponse> {
val member = memberService.findActiveMember(memberPrincipal.memberId)
return archiveService
.findCompletedArchives(member, activityType, sort)
.map { ArchiveActivityResponse.from(it) }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package picklab.backend.archive.domain.enums

import org.springframework.data.domain.Sort

enum class ArchiveSortType {
LATEST,
OLDEST,
;

fun toSort(): Sort =
when (this) {
LATEST -> Sort.by(Sort.Direction.DESC, "createdAt")
OLDEST -> Sort.by(Sort.Direction.ASC, "createdAt")
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package picklab.backend.archive.domain.repository

import org.springframework.data.domain.Sort
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.query.Param
import org.springframework.stereotype.Repository
import picklab.backend.activity.domain.enums.ActivityType
import picklab.backend.archive.domain.entity.Archive
import picklab.backend.archive.domain.enums.ProgressStatus
import picklab.backend.member.domain.entity.Member

@Repository
Expand All @@ -11,4 +16,21 @@ interface ArchiveRepository : JpaRepository<Archive, Long> {
id: Long,
member: Member,
): Archive?

@Query("SELECT a FROM Archive a JOIN FETCH a.activity WHERE a.member = :member AND a.activityProgressStatus = :status")
fun findByMemberAndProgressStatus(
@Param("member") member: Member,
@Param("status") status: ProgressStatus,
sort: Sort,
): List<Archive>

@Query(
"SELECT a FROM Archive a JOIN FETCH a.activity WHERE a.member = :member AND a.activityProgressStatus = :status AND a.activityType = :activityType",
)
fun findByMemberAndProgressStatusAndActivityType(
@Param("member") member: Member,
@Param("status") status: ProgressStatus,
@Param("activityType") activityType: ActivityType,
sort: Sort,
): List<Archive>
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ package picklab.backend.archive.domain.service

import jakarta.transaction.Transactional
import org.springframework.stereotype.Service
import picklab.backend.activity.domain.enums.ActivityType
import picklab.backend.archive.domain.entity.Archive
import picklab.backend.archive.domain.enums.ArchiveSortType
import picklab.backend.archive.domain.enums.ProgressStatus
import picklab.backend.archive.domain.repository.ArchiveRepository
import picklab.backend.common.model.BusinessException
import picklab.backend.common.model.ErrorCode
Expand All @@ -21,4 +24,22 @@ class ArchiveService(
): Archive =
archiveRepository
.findByIdAndMember(archiveId, member) ?: throw BusinessException(ErrorCode.NOT_FOUND_ARCHIVE)

fun findCompletedArchives(
member: Member,
activityType: ActivityType?,
sort: ArchiveSortType,
): List<Archive> {
val domainSort = sort.toSort()
return if (activityType != null) {
archiveRepository.findByMemberAndProgressStatusAndActivityType(
member,
ProgressStatus.COMPLETED,
activityType,
domainSort,
)
} else {
archiveRepository.findByMemberAndProgressStatus(member, ProgressStatus.COMPLETED, domainSort)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package picklab.backend.archive.entrypoint

import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.Parameter
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
import io.swagger.v3.oas.annotations.tags.Tag
import org.springframework.http.ResponseEntity
import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestParam
import picklab.backend.activity.domain.enums.ActivityType
import picklab.backend.archive.domain.enums.ArchiveSortType
import picklab.backend.archive.entrypoint.request.ArchiveCreateRequest
import picklab.backend.archive.entrypoint.request.ArchiveUpdateRequest
import picklab.backend.archive.entrypoint.response.ArchiveActivityResponse
import picklab.backend.common.model.MemberPrincipal
import picklab.backend.common.model.ResponseWrapper

Expand Down Expand Up @@ -44,4 +49,19 @@ interface ArchiveApi {
@PathVariable archiveId: Long,
@RequestBody request: ArchiveUpdateRequest,
): ResponseEntity<ResponseWrapper<Unit>>

@Operation(
summary = "아카이브 활동 목록 조회",
description = "수료 완료한 활동 목록을 조회합니다.",
)
@ApiResponses(
value = [
ApiResponse(responseCode = "200", description = "아카이브 목록 조회에 성공했습니다."),
],
)
fun getList(
@AuthenticationPrincipal member: MemberPrincipal,
@Parameter(description = "활동 유형 필터 (미입력 시 전체)") @RequestParam(required = false) activityType: ActivityType?,
@Parameter(description = "정렬 순서 (LATEST: 최신순, OLDEST: 오래된순)") @RequestParam(defaultValue = "LATEST") sort: ArchiveSortType,
): ResponseEntity<ResponseWrapper<List<ArchiveActivityResponse>>>
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,19 @@ package picklab.backend.archive.entrypoint

import org.springframework.http.ResponseEntity
import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PatchMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
import picklab.backend.activity.domain.enums.ActivityType
import picklab.backend.archive.application.ArchiveUseCase
import picklab.backend.archive.domain.enums.ArchiveSortType
import picklab.backend.archive.entrypoint.request.ArchiveCreateRequest
import picklab.backend.archive.entrypoint.request.ArchiveUpdateRequest
import picklab.backend.archive.entrypoint.response.ArchiveActivityResponse
import picklab.backend.common.model.MemberPrincipal
import picklab.backend.common.model.ResponseWrapper
import picklab.backend.common.model.SuccessCode
Expand All @@ -36,4 +41,14 @@ class ArchiveController(
archiveUseCase.updateArchive(archiveId, request, member)
return ResponseEntity.ok(ResponseWrapper.success(SuccessCode.UPDATE_ARCHIVE_SUCCESS))
}

@GetMapping("/v1/archive")
override fun getList(
@AuthenticationPrincipal member: MemberPrincipal,
@RequestParam(required = false) activityType: ActivityType?,
@RequestParam(defaultValue = "LATEST") sort: ArchiveSortType,
): ResponseEntity<ResponseWrapper<List<ArchiveActivityResponse>>> {
val result = archiveUseCase.getArchiveList(activityType, sort, member)
return ResponseEntity.ok(ResponseWrapper.success(SuccessCode.GET_ARCHIVE_LIST, result))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class ArchiveCreateRequest(
userEndDate = endDate,
role = role,
activityProgressStatus = ProgressStatus.IN_PROGRESSING,
writeStatus = WriteStatus.IN_PROGRESS,
writeStatus = WriteStatus.COMPLETED,
customRole = customRole,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package picklab.backend.archive.entrypoint.response

import io.swagger.v3.oas.annotations.media.Schema
import picklab.backend.archive.domain.entity.Archive
import picklab.backend.archive.domain.enums.WriteStatus
import java.time.LocalDate

data class ArchiveActivityResponse(
@field:Schema(description = "아카이브 ID")
val id: Long,
@field:Schema(description = "활동 썸네일 이미지 URL")
val activityThumbnailUrl: String?,
@field:Schema(description = "활동 유형")
val activityType: String,
@field:Schema(description = "활동명")
val title: String,
@field:Schema(description = "주최기관/단체명")
val organizer: String?,
@field:Schema(description = "활동 시작일")
val userStartDate: LocalDate,
@field:Schema(description = "활동 종료일")
val userEndDate: LocalDate,
@field:Schema(description = "작성 여부")
val writeStatus: WriteStatus,
) {
companion object {
fun from(archive: Archive): ArchiveActivityResponse =
ArchiveActivityResponse(
id = archive.id,
activityThumbnailUrl = archive.activity.activityThumbnailUrl,
activityType = archive.activityType.name,
title = archive.activity.title,
organizer = archive.activity.organizer,
userStartDate = archive.userStartDate,
userEndDate = archive.userEndDate,
writeStatus = archive.writeStatus,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ enum class SuccessCode(
// Archive 관련
CREATE_ARCHIVE_SUCCESS(HttpStatus.OK, "아카이브 생성에 성공했습니다."),
UPDATE_ARCHIVE_SUCCESS(HttpStatus.OK, "아카이브 수정에 성공했습니다."),
GET_ARCHIVE_LIST(HttpStatus.OK, "아카이브 목록 조회에 성공했습니다."),

// Notification 관련
SEND_NOTIFICATION_SUCCESS(HttpStatus.OK, "알림 전송에 성공했습니다."),
Expand Down
Loading