| @@ -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 | ||||
|             ) | ||||
|         ) | ||||
|     } | ||||
| } | ||||
| @@ -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 | ||||
|     } | ||||
| } | ||||
| @@ -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 | ||||
|         ) | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,3 @@ | ||||
| package kr.co.vividnext.sodalive.alarm | ||||
|  | ||||
| data class GetSlotQuantityAndPriceResponse(val slotQuantity: Int, val price: Int) | ||||
| @@ -68,6 +68,7 @@ class CanService(private val repository: CanRepository) { | ||||
|                     } | ||||
|  | ||||
|                     CanUsage.CHANGE_NICKNAME -> "닉네임 변경" | ||||
|                     CanUsage.ALARM_SLOT -> "알람 슬롯 구매" | ||||
|                     CanUsage.ORDER_CONTENT -> "[콘텐츠 구매] ${it.audioContent!!.title}" | ||||
|                     CanUsage.PAID_COMMUNITY_POST -> "[게시글 보기] ${it.communityPost?.member?.nickname ?: ""}" | ||||
|                 } | ||||
|   | ||||
| @@ -96,6 +96,8 @@ class CanPaymentService( | ||||
|             recipientId = communityPost.member!!.id!! | ||||
|             useCan.communityPost = communityPost | ||||
|             useCan.member = member | ||||
|         } else if (canUsage == CanUsage.ALARM_SLOT) { | ||||
|             useCan.member = member | ||||
|         } else { | ||||
|             throw SodaException("잘못된 요청입니다.") | ||||
|         } | ||||
|   | ||||
| @@ -6,5 +6,6 @@ enum class CanUsage { | ||||
|     CHANGE_NICKNAME, | ||||
|     ORDER_CONTENT, | ||||
|     SPIN_ROULETTE, | ||||
|     PAID_COMMUNITY_POST | ||||
|     PAID_COMMUNITY_POST, | ||||
|     ALARM_SLOT | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user