Merge pull request 'test' (#199) from test into main

Reviewed-on: #199
This commit is contained in:
klaus 2024-07-25 16:08:20 +00:00
commit 2cdbbb1b37
7 changed files with 138 additions and 1 deletions

View File

@ -0,0 +1,41 @@
package kr.co.vividnext.sodalive.alarm
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.member.Member
import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/alarm")
class AlarmController(private val service: AlarmService) {
@GetMapping
fun getSlotQuantityAndPrice(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(
service.getSlotQuantityAndPrice(memberId = member.id!!)
)
}
@PostMapping("/buy-slot/{container}")
fun buyExtraSlot(
@PathVariable("container") container: String,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(
service.buyExtraSlot(
memberId = member.id!!,
container = container
)
)
}
}

View File

@ -0,0 +1,22 @@
package kr.co.vividnext.sodalive.alarm
import com.querydsl.jpa.impl.JPAQueryFactory
import kr.co.vividnext.sodalive.can.use.CanUsage
import kr.co.vividnext.sodalive.can.use.QUseCan.useCan
import org.springframework.stereotype.Repository
@Repository
class AlarmRepository(private val queryFactory: JPAQueryFactory) {
fun getSlotQuantity(memberId: Long): Int {
return queryFactory
.select(useCan.id)
.from(useCan)
.where(
useCan.member.id.eq(memberId)
.and(useCan.isRefund.isFalse)
.and(useCan.canUsage.eq(CanUsage.ALARM_SLOT))
)
.fetch()
.size
}
}

View File

@ -0,0 +1,67 @@
package kr.co.vividnext.sodalive.alarm
import kr.co.vividnext.sodalive.can.payment.CanPaymentService
import kr.co.vividnext.sodalive.can.use.CanUsage
import kr.co.vividnext.sodalive.common.SodaException
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
@Service
class AlarmService(
private val canPaymentService: CanPaymentService,
private val repository: AlarmRepository
) {
fun getSlotQuantityAndPrice(memberId: Long): GetSlotQuantityAndPriceResponse {
val slotQuantity = repository.getSlotQuantity(memberId)
return GetSlotQuantityAndPriceResponse(
slotQuantity = slotQuantity,
price = when (slotQuantity) {
0 -> {
30
}
1 -> {
60
}
2 -> {
100
}
else -> {
0
}
}
)
}
@Transactional
fun buyExtraSlot(memberId: Long, container: String) {
val slotQuantity = repository.getSlotQuantity(memberId)
val needCan = when (slotQuantity) {
0 -> {
30
}
1 -> {
60
}
2 -> {
100
}
else -> {
throw SodaException("이미 구매하셨습니다")
}
}
canPaymentService.spendCan(
memberId = memberId,
needCan = needCan,
canUsage = CanUsage.ALARM_SLOT,
container = container
)
}
}

View File

@ -0,0 +1,3 @@
package kr.co.vividnext.sodalive.alarm
data class GetSlotQuantityAndPriceResponse(val slotQuantity: Int, val price: Int)

View File

@ -68,6 +68,7 @@ class CanService(private val repository: CanRepository) {
} }
CanUsage.CHANGE_NICKNAME -> "닉네임 변경" CanUsage.CHANGE_NICKNAME -> "닉네임 변경"
CanUsage.ALARM_SLOT -> "알람 슬롯 구매"
CanUsage.ORDER_CONTENT -> "[콘텐츠 구매] ${it.audioContent!!.title}" CanUsage.ORDER_CONTENT -> "[콘텐츠 구매] ${it.audioContent!!.title}"
CanUsage.PAID_COMMUNITY_POST -> "[게시글 보기] ${it.communityPost?.member?.nickname ?: ""}" CanUsage.PAID_COMMUNITY_POST -> "[게시글 보기] ${it.communityPost?.member?.nickname ?: ""}"
} }

View File

@ -96,6 +96,8 @@ class CanPaymentService(
recipientId = communityPost.member!!.id!! recipientId = communityPost.member!!.id!!
useCan.communityPost = communityPost useCan.communityPost = communityPost
useCan.member = member useCan.member = member
} else if (canUsage == CanUsage.ALARM_SLOT) {
useCan.member = member
} else { } else {
throw SodaException("잘못된 요청입니다.") throw SodaException("잘못된 요청입니다.")
} }

View File

@ -6,5 +6,6 @@ enum class CanUsage {
CHANGE_NICKNAME, CHANGE_NICKNAME,
ORDER_CONTENT, ORDER_CONTENT,
SPIN_ROULETTE, SPIN_ROULETTE,
PAID_COMMUNITY_POST PAID_COMMUNITY_POST,
ALARM_SLOT
} }