diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreateCreatorSettlementRatioRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreateCreatorSettlementRatioRequest.kt new file mode 100644 index 0000000..0d9dc2e --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreateCreatorSettlementRatioRequest.kt @@ -0,0 +1,16 @@ +package kr.co.vividnext.sodalive.admin.calculate.ratio + +data class CreateCreatorSettlementRatioRequest( + val memberId: Long, + val subsidy: Int, + val liveSettlementRatio: Int, + val contentSettlementRatio: Int, + val communitySettlementRatio: Int +) { + fun toEntity() = CreatorSettlementRatio( + subsidy = subsidy, + liveSettlementRatio = liveSettlementRatio, + contentSettlementRatio = contentSettlementRatio, + communitySettlementRatio = communitySettlementRatio + ) +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatio.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatio.kt new file mode 100644 index 0000000..33ce414 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatio.kt @@ -0,0 +1,20 @@ +package kr.co.vividnext.sodalive.admin.calculate.ratio + +import kr.co.vividnext.sodalive.common.BaseEntity +import kr.co.vividnext.sodalive.member.Member +import javax.persistence.Entity +import javax.persistence.FetchType +import javax.persistence.JoinColumn +import javax.persistence.OneToOne + +@Entity +data class CreatorSettlementRatio( + val subsidy: Int, + val liveSettlementRatio: Int, + val contentSettlementRatio: Int, + val communitySettlementRatio: Int +) : BaseEntity() { + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + var member: Member? = null +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioController.kt new file mode 100644 index 0000000..10cd41e --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioController.kt @@ -0,0 +1,30 @@ +package kr.co.vividnext.sodalive.admin.calculate.ratio + +import kr.co.vividnext.sodalive.common.ApiResponse +import org.springframework.data.domain.Pageable +import org.springframework.security.access.prepost.PreAuthorize +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@PreAuthorize("hasRole('ADMIN')") +@RequestMapping("/admin/calculate/ratio") +class CreatorSettlementRatioController(private val service: CreatorSettlementRatioService) { + @PostMapping + fun createCreatorSettlementRatio( + @RequestBody request: CreateCreatorSettlementRatioRequest + ) = ApiResponse.ok(service.createCreatorSettlementRatio(request)) + + @GetMapping + fun getCreatorSettlementRatio( + pageable: Pageable + ) = ApiResponse.ok( + service.getCreatorSettlementRatio( + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + ) +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioRepository.kt new file mode 100644 index 0000000..e788f53 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioRepository.kt @@ -0,0 +1,46 @@ +package kr.co.vividnext.sodalive.admin.calculate.ratio + +import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.admin.calculate.ratio.QCreatorSettlementRatio.creatorSettlementRatio +import kr.co.vividnext.sodalive.member.QMember.member +import org.springframework.data.jpa.repository.JpaRepository + +interface CreatorSettlementRatioRepository : + JpaRepository, + CreatorSettlementRatioQueryRepository + +interface CreatorSettlementRatioQueryRepository { + fun getCreatorSettlementRatio(offset: Long, limit: Long): List + fun getCreatorSettlementRatioTotalCount(): Int +} + +class CreatorSettlementRatioQueryRepositoryImpl( + private val queryFactory: JPAQueryFactory +) : CreatorSettlementRatioQueryRepository { + override fun getCreatorSettlementRatio(offset: Long, limit: Long): List { + return queryFactory + .select( + QGetCreatorSettlementRatioItem( + member.nickname, + creatorSettlementRatio.subsidy, + creatorSettlementRatio.liveSettlementRatio, + creatorSettlementRatio.contentSettlementRatio, + creatorSettlementRatio.communitySettlementRatio + ) + ) + .from(creatorSettlementRatio) + .innerJoin(creatorSettlementRatio.member, member) + .orderBy(creatorSettlementRatio.id.asc()) + .offset(offset) + .limit(limit) + .fetch() + } + + override fun getCreatorSettlementRatioTotalCount(): Int { + return queryFactory + .select(creatorSettlementRatio.id) + .from(creatorSettlementRatio) + .fetch() + .size + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioService.kt new file mode 100644 index 0000000..140fb4a --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/CreatorSettlementRatioService.kt @@ -0,0 +1,37 @@ +package kr.co.vividnext.sodalive.admin.calculate.ratio + +import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.member.MemberRepository +import kr.co.vividnext.sodalive.member.MemberRole +import org.springframework.data.repository.findByIdOrNull +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +class CreatorSettlementRatioService( + private val repository: CreatorSettlementRatioRepository, + private val memberRepository: MemberRepository +) { + @Transactional + fun createCreatorSettlementRatio(request: CreateCreatorSettlementRatioRequest) { + val creatorSettlementRatio = request.toEntity() + + val creator = memberRepository.findByIdOrNull(request.memberId) + ?: throw SodaException("잘못된 크리에이터 입니다.") + + if (creator.role != MemberRole.CREATOR) { + throw SodaException("잘못된 크리에이터 입니다.") + } + + creatorSettlementRatio.member = creator + repository.save(creatorSettlementRatio) + } + + @Transactional(readOnly = true) + fun getCreatorSettlementRatio(offset: Long, limit: Long): GetCreatorSettlementRatioResponse { + val totalCount = repository.getCreatorSettlementRatioTotalCount() + val items = repository.getCreatorSettlementRatio(offset, limit) + + return GetCreatorSettlementRatioResponse(totalCount, items) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/GetCreatorSettlementRatioResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/GetCreatorSettlementRatioResponse.kt new file mode 100644 index 0000000..24a4d96 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/ratio/GetCreatorSettlementRatioResponse.kt @@ -0,0 +1,16 @@ +package kr.co.vividnext.sodalive.admin.calculate.ratio + +import com.querydsl.core.annotations.QueryProjection + +data class GetCreatorSettlementRatioResponse( + val totalCount: Int, + val items: List +) + +data class GetCreatorSettlementRatioItem @QueryProjection constructor( + val nickname: String, + val subsidy: Int, + val liveSettlementRatio: Int, + val contentSettlementRatio: Int, + val communitySettlementRatio: Int +)