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 @@ -3,7 +3,6 @@ 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
Expand All @@ -12,17 +11,19 @@ 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.ArchiveRecordUpdateRequest
import picklab.backend.archive.entrypoint.request.ArchiveStatusUpdateRequest
import picklab.backend.archive.entrypoint.response.ArchiveActivityResponse
import picklab.backend.common.model.BusinessException
import picklab.backend.common.model.ErrorCode
import picklab.backend.common.model.MemberPrincipal
import picklab.backend.file.application.FileManagementService
import picklab.backend.member.domain.MemberService
import picklab.backend.participation.domain.service.ActivityParticipationService

@Component
class ArchiveUseCase(
private val memberService: MemberService,
private val archiveService: ArchiveService,
private val activityService: ActivityService,
private val participationService: ActivityParticipationService,
private val archiveReferenceUrlService: ArchiveReferenceUrlService,
private val archiveUploadFileUrlService: ArchiveUploadFileUrlService,
private val fileManagementService: FileManagementService,
Expand All @@ -33,17 +34,23 @@ class ArchiveUseCase(
memberPrincipal: MemberPrincipal,
) {
val member = memberService.findActiveMember(memberPrincipal.memberId)
val activity = activityService.mustFindById(request.activityId)
val participation = participationService.mustFindByIdAndMemberId(request.participationId, member.id)
if (!participation.canArchive()) {
throw BusinessException(ErrorCode.CANNOT_CREATE_ARCHIVE)
}
if (archiveService.existsActiveByParticipationId(participation.id)) {
throw BusinessException(ErrorCode.ALREADY_EXISTS_ARCHIVE)
}

val permanentFileUrls =
fileManagementService.verifyAndMoveTempFilesToPermanent(
fileUrls = request.fileUrls,
memberId = member.id,
activityId = request.activityId,
activityId = participation.activity.id,
category = "archive",
)

val entity = request.toCreateEntity(member, activity)
val entity = request.toCreateEntity(participation)
val archive = archiveService.save(entity)

val referenceUrls = request.referenceUrls.map { url -> ArchiveReferenceUrl(archive, url) }
Expand All @@ -53,23 +60,6 @@ class ArchiveUseCase(
archiveUploadFileUrlService.saveAll(uploadedFileUrls)
}

@Transactional
fun updateArchiveStatus(
archiveId: Long,
request: ArchiveStatusUpdateRequest,
memberPrincipal: MemberPrincipal,
) {
val member = memberService.findActiveMember(memberPrincipal.memberId)
val archive = archiveService.mustFindByIdAndMember(archiveId, member)

archive.update(
activityProgressStatus = request.activityProgressStatus,
passOrFailStatus = request.passOrFailStatus,
)

archiveService.save(archive)
}

@Transactional
fun updateArchiveRecord(
archiveId: Long,
Expand All @@ -83,7 +73,7 @@ class ArchiveUseCase(
fileManagementService.processUpdatedFileUrls(
fileUrls = request.fileUrls,
memberId = member.id,
activityId = archive.activity.id,
activityId = archive.participation.activity.id,
category = "archive",
)

Expand Down Expand Up @@ -111,8 +101,22 @@ class ArchiveUseCase(
memberPrincipal: MemberPrincipal,
): List<ArchiveActivityResponse> {
val member = memberService.findActiveMember(memberPrincipal.memberId)
return archiveService
.findCompletedArchives(member, activityType, sort)
.map { ArchiveActivityResponse.from(it) }
val participations =
participationService.findCompletedForArchive(
memberId = member.id,
activityType = activityType,
sort = sort.toSort(),
)
val archivesByParticipationId =
archiveService
.findAllByParticipationIds(participations.map { it.id })
.associateBy { it.participation.id }

return participations.map { participation ->
ArchiveActivityResponse.from(
participation = participation,
archive = archivesByParticipationId[participation.id],
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,11 @@ import jakarta.persistence.Table
import org.hibernate.annotations.Comment
import org.hibernate.annotations.SQLDelete
import org.hibernate.annotations.SQLRestriction
import picklab.backend.activity.domain.entity.Activity
import picklab.backend.activity.domain.enums.ActivityType
import picklab.backend.archive.domain.enums.DetailRoleType
import picklab.backend.archive.domain.enums.PassOrFailStatus
import picklab.backend.archive.domain.enums.ProgressStatus
import picklab.backend.archive.domain.enums.RoleType
import picklab.backend.archive.domain.enums.WriteStatus
import picklab.backend.common.model.SoftDeleteEntity
import picklab.backend.member.domain.entity.Member
import picklab.backend.participation.domain.entity.ActivityParticipation
import java.time.LocalDate

@Entity
Expand All @@ -35,23 +31,17 @@ class Archive(
@Comment("활동 종료일")
var userEndDate: LocalDate,
@Column(name = "role", length = 50, nullable = false)
@Enumerated(EnumType.STRING)
@Comment("활동 역할")
var role: RoleType,
@Column(name = "detail_role", length = 50, nullable = false)
@Enumerated(EnumType.STRING)
@Comment("상세 역할")
var detailRole: DetailRoleType,
@Lob
@Column(name = "activity_record", nullable = false, columnDefinition = "TEXT")
@Comment("활동 기록")
var activityRecord: String,
@Column(name = "activity_type", length = 50, nullable = false)
@Enumerated(EnumType.STRING)
@Comment("활동 구분")
var activityType: ActivityType,
@Column(name = "activity_progress_status", length = 50, nullable = false)
@Enumerated(EnumType.STRING)
@Comment("활동 진행 상태")
var activityProgressStatus: ProgressStatus,
@Column(name = "write_status", length = 50, nullable = false)
@Enumerated(EnumType.STRING)
@Comment("작성 상태")
Expand All @@ -60,24 +50,9 @@ class Archive(
@Comment("상세 역할에서 기타를 선택하여 직접 입력한 역할")
var customRole: String? = null,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", nullable = false)
val member: Member,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "activity_id", nullable = false)
val activity: Activity,
@Comment("합불 여부")
@Enumerated(EnumType.STRING)
@Column(name = "pass_or_fail_status", nullable = false)
var passOrFailStatus: PassOrFailStatus = PassOrFailStatus.FAIL,
@JoinColumn(name = "participation_id", nullable = false)
val participation: ActivityParticipation,
) : SoftDeleteEntity() {
fun update(
activityProgressStatus: ProgressStatus = this.activityProgressStatus,
passOrFailStatus: PassOrFailStatus = this.passOrFailStatus,
) {
this.activityProgressStatus = activityProgressStatus
this.passOrFailStatus = passOrFailStatus
}

fun updateRecord(
activityRecord: String,
role: RoleType,
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,41 +1,25 @@
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
interface ArchiveRepository : JpaRepository<Archive, Long> {
fun findByIdAndMember(
fun findByIdAndParticipationMember(
id: Long,
member: Member,
): Archive?

fun existsByActivityIdAndMemberIdAndDeletedAtIsNull(
fun findByParticipationId(participationId: Long): Archive?

fun existsByParticipationActivityIdAndParticipationMemberIdAndDeletedAtIsNull(
activityId: Long,
memberId: Long,
): Boolean

@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>
fun existsByParticipationIdAndDeletedAtIsNull(participationId: Long): Boolean

@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>
fun findAllByParticipationIdIn(participationIds: Collection<Long>): List<Archive>
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ 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 @@ -23,28 +20,28 @@ class ArchiveService(
member: Member,
): Archive =
archiveRepository
.findByIdAndMember(archiveId, member) ?: throw BusinessException(ErrorCode.NOT_FOUND_ARCHIVE)
.findByIdAndParticipationMember(archiveId, member) ?: throw BusinessException(ErrorCode.NOT_FOUND_ARCHIVE)

fun findByParticipationId(participationId: Long): Archive? = archiveRepository.findByParticipationId(participationId)

fun existsActiveByActivityIdAndMemberId(
activityId: Long,
memberId: Long,
): Boolean = archiveRepository.existsByActivityIdAndMemberIdAndDeletedAtIsNull(activityId, memberId)
): Boolean =
archiveRepository.existsByParticipationActivityIdAndParticipationMemberIdAndDeletedAtIsNull(
activityId,
memberId,
)

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,
)
fun existsActiveByParticipationId(participationId: Long): Boolean =
archiveRepository.existsByParticipationIdAndDeletedAtIsNull(
participationId,
)

fun findAllByParticipationIds(participationIds: Collection<Long>): List<Archive> =
if (participationIds.isEmpty()) {
emptyList()
} else {
archiveRepository.findByMemberAndProgressStatus(member, ProgressStatus.COMPLETED, domainSort)
archiveRepository.findAllByParticipationIdIn(participationIds)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ 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.ArchiveRecordUpdateRequest
import picklab.backend.archive.entrypoint.request.ArchiveStatusUpdateRequest
import picklab.backend.archive.entrypoint.response.ArchiveActivityResponse
import picklab.backend.common.model.MemberPrincipal
import picklab.backend.common.model.ResponseWrapper
Expand All @@ -35,22 +34,6 @@ interface ArchiveApi {
request: ArchiveCreateRequest,
): ResponseEntity<ResponseWrapper<Unit>>

@Operation(
summary = "아카이브 상태 수정",
description = "아카이브의 활동 진행 상태 및 합불 여부를 수정합니다",
)
@ApiResponses(
value = [
ApiResponse(responseCode = "200", description = "아카이브 상태 수정에 성공했습니다."),
ApiResponse(responseCode = "404", description = "아카이브 정보를 찾을 수 없습니다."),
],
)
fun updateStatus(
@AuthenticationPrincipal member: MemberPrincipal,
@PathVariable archiveId: Long,
@RequestBody request: ArchiveStatusUpdateRequest,
): ResponseEntity<ResponseWrapper<Unit>>

@Operation(
summary = "아카이브 기록 내용 수정",
description = "아카이브의 활동 기록 내용(역할, 파일, 연관 URL 등)을 작성하거나 수정합니다",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ 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.ArchiveRecordUpdateRequest
import picklab.backend.archive.entrypoint.request.ArchiveStatusUpdateRequest
import picklab.backend.archive.entrypoint.response.ArchiveActivityResponse
import picklab.backend.common.model.MemberPrincipal
import picklab.backend.common.model.ResponseWrapper
Expand All @@ -33,16 +32,6 @@ class ArchiveController(
return ResponseEntity.ok(ResponseWrapper.success(SuccessCode.CREATE_ARCHIVE_SUCCESS))
}

@PatchMapping("/v1/archive/{archiveId}/status")
override fun updateStatus(
@AuthenticationPrincipal member: MemberPrincipal,
@PathVariable archiveId: Long,
@RequestBody request: ArchiveStatusUpdateRequest,
): ResponseEntity<ResponseWrapper<Unit>> {
archiveUseCase.updateArchiveStatus(archiveId, request, member)
return ResponseEntity.ok(ResponseWrapper.success(SuccessCode.UPDATE_ARCHIVE_SUCCESS))
}

@PatchMapping("/v1/archive/{archiveId}/record")
override fun updateRecord(
@AuthenticationPrincipal member: MemberPrincipal,
Expand Down
Loading
Loading