Skip to content
2 changes: 0 additions & 2 deletions src/main/kotlin/upbrella/be/rent/controller/RentController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,7 @@ class RentController(
val userToReturn = userReader.findUserById(user.id)

rentService.returnUmbrellaByUser(userToReturn, returnUmbrellaByUserRequest)
val unrefundedRentCount = rentService.countUnrefundedRent()

slackAlarmService.notifyReturn(unrefundedRentCount)
return ResponseEntity
.ok()
.body(CustomResponse(
Expand Down
2 changes: 1 addition & 1 deletion src/main/kotlin/upbrella/be/rent/entity/ConditionReport.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import javax.persistence.*
class ConditionReport(
@OneToOne
@JoinColumn(name = "history_id")
val history: History? = null,
val history: History,
val content: String? = null,
val etc: String? = null,
@Id
Expand Down
26 changes: 3 additions & 23 deletions src/main/kotlin/upbrella/be/rent/entity/History.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,11 @@ class History(

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "rent_store_meta_id")
val rentStoreMeta: StoreMeta,
var rentStoreMeta: StoreMeta,

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "return_store_meta_id")
val returnStoreMeta: StoreMeta? = null,
var returnStoreMeta: StoreMeta? = null,

val rentedAt: LocalDateTime = LocalDateTime.now(),
var returnedAt: LocalDateTime? = null,
Expand Down Expand Up @@ -60,26 +60,6 @@ class History(
)
}

@JvmStatic
fun updateHistoryForReturn(
rentedHistory: History,
returnStoreMeta: StoreMeta,
request: ReturnUmbrellaByUserRequest
): History {
return History(
id = rentedHistory.id,
umbrella = rentedHistory.umbrella,
user = rentedHistory.user,
paidAt = rentedHistory.paidAt,
bank = request.bank,
accountNumber = request.accountNumber,
rentStoreMeta = rentedHistory.rentStoreMeta,
returnStoreMeta = returnStoreMeta,
rentedAt = rentedHistory.rentedAt,
returnedAt = LocalDateTime.now(),
)
}

fun ofUserHistory(history: History): SingleHistoryResponse {
var isReturned = true
var isRefunded = false
Expand Down Expand Up @@ -139,4 +119,4 @@ class History(
this.bank = null
this.accountNumber = null
}
}
}
16 changes: 3 additions & 13 deletions src/main/kotlin/upbrella/be/rent/entity/ImprovementReport.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,10 @@ import javax.persistence.*
class ImprovementReport(
@OneToOne
@JoinColumn(name = "history_id")
val history: History? = null,
val history: History,
val content: String? = null,
val etc: String? = null,
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? =null
) {
companion object {
@JvmStatic
fun createFromReturn(history: History, content: String): ImprovementReport {
return ImprovementReport(
history = history,
content = content,
)
}
}
}
val id: Long? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ class ImprovementReportService(
fun findAll(): ImprovementReportPageResponse =
ImprovementReportPageResponse.of(findAllImprovementReport())

fun addImprovementReportFromReturn(history: History, content: String) {
val report = ImprovementReport.createFromReturn(history, content)
improvementReportRepository.save(report)
fun save(improvementReport: ImprovementReport) {

improvementReportRepository.save(improvementReport)
}

private fun findAllImprovementReport(): List<ImprovementReportResponse> =
Expand Down
81 changes: 58 additions & 23 deletions src/main/kotlin/upbrella/be/rent/service/RentService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ import upbrella.be.rent.dto.request.ReturnUmbrellaByUserRequest
import upbrella.be.rent.dto.response.*
import upbrella.be.rent.entity.ConditionReport
import upbrella.be.rent.entity.History
import upbrella.be.rent.entity.ImprovementReport
import upbrella.be.rent.exception.*
import upbrella.be.rent.repository.RentRepository
import upbrella.be.slack.service.SlackAlarmService
import upbrella.be.store.entity.StoreMeta
import upbrella.be.store.repository.StoreMetaReader
import upbrella.be.umbrella.entity.Umbrella
Expand All @@ -30,6 +32,7 @@ import java.time.temporal.ChronoUnit
class RentService(
private val umbrellaService: UmbrellaService,
private val storeMetaReader: StoreMetaReader,
private val slackAlarmService: SlackAlarmService,
private val improvementReportService: ImprovementReportService,
private val rentRepository: RentRepository,
private val conditionReportService: ConditionReportService,
Expand Down Expand Up @@ -65,24 +68,31 @@ class RentService(
rentRepository.findByUserIdAndReturnedAtIsNull(userToRent.id).ifPresent {
throw ExistingUmbrellaForRentException("[ERROR] 해당 유저가 대여 중인 우산이 있습니다.")
}
val willRentUmbrella = umbrellaService.findUmbrellaById(rentUmbrellaByUserRequest.umbrellaId)
if (willRentUmbrella.storeMeta.id != rentUmbrellaByUserRequest.storeId) {
val umbrella = umbrellaService.findUmbrellaById(rentUmbrellaByUserRequest.umbrellaId)
if (umbrella.storeMeta.id != rentUmbrellaByUserRequest.storeId) {
throw UmbrellaStoreMissMatchException("[ERROR] 해당 우산은 해당 매장에 존재하지 않습니다.")
}
if (willRentUmbrella.missed) {
if (umbrella.missed) {
throw MissingUmbrellaException("[ERROR] 해당 우산은 분실되었습니다.")
}
if (!willRentUmbrella.rentable) {
if (!umbrella.rentable) {
throw NotAvailableUmbrellaException("[ERROR] 해당 우산은 대여중입니다.")
}
willRentUmbrella.rentUmbrella()
umbrella.rentUmbrella()
val rentalStore = storeMetaReader.findById(rentUmbrellaByUserRequest.storeId)
val conditionReport = rentUmbrellaByUserRequest.conditionReport
val history = rentRepository.save(
History.ofCreatedByNewRent(willRentUmbrella, userToRent, rentalStore)
History.ofCreatedByNewRent(umbrella, userToRent, rentalStore)
)
val conditionReportToSave = ConditionReport(history, conditionReport, null, null)
conditionReportService.saveConditionReport(conditionReportToSave)
slackAlarmService.notifyRent(userToRent, history)

rentUmbrellaByUserRequest.conditionReport
?.takeIf { it.isNotBlank() }
?.let { content ->
ConditionReport(history = history, content = content).also { conditionReport ->
conditionReportService.saveConditionReport(conditionReport)
slackAlarmService.notifyConditionReport(conditionReport)
}
}
}

@Transactional
Expand All @@ -91,15 +101,34 @@ class RentService(
val history = rentRepository.findByUserIdAndReturnedAtIsNull(userToReturn.id)
.orElseThrow { NonExistingUmbrellaForRentException("[ERROR] 해당 유저가 대여 중인 우산이 없습니다.") }
val returnStore = storeMetaReader.findById(request.returnStoreId)
val updatedHistory = History.updateHistoryForReturn(history, returnStore, request)

history.bank = request.bank
history.accountNumber = request.accountNumber
history.returnStoreMeta = returnStore
history.returnedAt = LocalDateTime.now()

val returnedUmbrella: Umbrella = history.umbrella
returnedUmbrella.returnUmbrella(returnStore)
rentRepository.save(updatedHistory)
addImprovementReportFromReturnByUser(updatedHistory, request)

val unrefundedRentCount = countUnrefundedRent()

slackAlarmService.notifyReturn(userToReturn, history, unrefundedRentCount)
rentRepository.save(history)

request.improvementReportContent?.takeIf { it.isNotBlank() }
?.let { content ->
ImprovementReport(history = history, content = content).also { improvementReport ->
improvementReportService.save(improvementReport)
slackAlarmService.notifyImprovementReport(improvementReport)
}
}
}

@Transactional
fun findAllHistories(filter: HistoryFilterRequest, pageable: Pageable): RentalHistoriesPageResponse {
fun findAllHistories(
filter: HistoryFilterRequest,
pageable: Pageable
): RentalHistoriesPageResponse {
val countOfAllHistories = rentRepository.countAll(filter, pageable)
val countOfAllPages = countOfAllHistories / pageable.pageSize
val rentalHistories = findAllRentalHistory(filter, pageable)
Expand All @@ -109,19 +138,16 @@ class RentService(
fun findAllHistoriesByUser(userId: Long): AllHistoryResponse =
AllHistoryResponse.of(findAllByUserId(userId))

private fun addImprovementReportFromReturnByUser(history: History, request: ReturnUmbrellaByUserRequest) {
request.improvementReportContent?.let { content ->
improvementReportService.addImprovementReportFromReturn(history, content)
}
}

private fun findAllByUserId(userId: Long): List<SingleHistoryResponse> =
findAllByUser(userId).map { toSingleHistoryResponse(it) }

private fun findAllByUser(userId: Long): List<History> =
rentRepository.findAllByUserId(userId)

private fun findAllRentalHistory(filter: HistoryFilterRequest, pageable: Pageable): List<RentalHistoryResponse> =
private fun findAllRentalHistory(
filter: HistoryFilterRequest,
pageable: Pageable
): List<RentalHistoryResponse> =
findHistoryInfos(filter, pageable).map { toRentalHistoryResponse(it) }

private fun toSingleHistoryResponse(history: History): SingleHistoryResponse {
Expand All @@ -141,8 +167,14 @@ class RentService(
private fun toRentalHistoryResponse(history: HistoryInfoDto): RentalHistoryResponse {
var elapsedDay = ChronoUnit.DAYS.between(history.rentAt, LocalDateTime.now()).toInt()
return if (history.returnAt != null) {
elapsedDay = ChronoUnit.DAYS.between(history.rentAt.toLocalDate(), history.returnAt.toLocalDate()).toInt()
val totalRentalDay = ChronoUnit.DAYS.between(history.rentAt.toLocalDate(), history.returnAt.toLocalDate()).toInt()
elapsedDay = ChronoUnit.DAYS.between(
history.rentAt.toLocalDate(),
history.returnAt.toLocalDate()
).toInt()
val totalRentalDay = ChronoUnit.DAYS.between(
history.rentAt.toLocalDate(),
history.returnAt.toLocalDate()
).toInt()
RentalHistoryResponse.createReturnedHistory(history, elapsedDay, totalRentalDay)
} else {
RentalHistoryResponse.createNonReturnedHistory(history, elapsedDay)
Expand Down Expand Up @@ -187,6 +219,9 @@ class RentService(
history.deleteBankAccount()
}

private fun findHistoryInfos(filter: HistoryFilterRequest, pageable: Pageable): List<HistoryInfoDto> =
private fun findHistoryInfos(
filter: HistoryFilterRequest,
pageable: Pageable
): List<HistoryInfoDto> =
rentRepository.findHistoryInfos(filter, pageable)
}
49 changes: 45 additions & 4 deletions src/main/kotlin/upbrella/be/slack/slack/SlackAlarmService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,36 @@ import org.springframework.http.HttpMethod.POST
import org.springframework.stereotype.Service
import org.springframework.web.client.RestTemplate
import upbrella.be.config.SlackBotConfig
import upbrella.be.rent.entity.ConditionReport
import upbrella.be.rent.entity.History
import upbrella.be.rent.entity.ImprovementReport
import upbrella.be.user.entity.User

@Service
class SlackAlarmService(
private val slackBotConfig: SlackBotConfig,
private val restTemplate: RestTemplate
) {

fun notifyReturn(unrefundedCount: Long) {
fun notifyRent(user: User, history: History) {
val message = buildString {
append("*우산이 반납되었습니다. 보증금을 환급해주세요.*\n\n")
append("*환급 대기 건수* : ")
append(unrefundedCount)
append("*우산 대여 알림: 입금을 확인해주세요.*\n\n")
append("사용자 ID : ${user.id}\n")
append("예금주 이름 : ${user.name}\n")
append("대여 지점 이름 : ${history.rentStoreMeta.name}\n")
}
send(message)
}

fun notifyReturn(user: User, history: History, unrefundedCount: Long) {
val message = buildString {
append("*우산 반납 알림: 보증금을 환급해주세요.*\n\n")
append("사용자 ID : ${user.id}\n")
append("대여 지점 이름 : ${history.rentStoreMeta.name}\n")
append("대여 시각: ${history.rentedAt}\n")
append("반납 지점 이름 : ${history.returnStoreMeta?.name}\n")
append("반납 시각: ${history.returnedAt}\n")
append("*잔여 환급 대기 건수* : $unrefundedCount")
}
send(message)
}
Expand All @@ -28,4 +46,27 @@ class SlackAlarmService(
val entity = HttpEntity(request)
restTemplate.exchange(slackBotConfig.webHookUrl, POST, entity, String::class.java)
}

fun notifyConditionReport(conditionReport: ConditionReport) {
val message = buildString {
append("*우산 상태 신고 접수*\n\n")
append("우산 ID : ${conditionReport.history.umbrella.id}\n")
append("대여 지점 이름 : ${conditionReport.history.rentStoreMeta.name}\n")
append("신고 내용 : ${conditionReport.content}\n")
}
send(message)
}

fun notifyImprovementReport(improvementReport: ImprovementReport) {
val message = buildString {
append("*우산 개선 사항 신고가 접수되었습니다.*\n\n")
append("우산 ID : ${improvementReport.history.umbrella.id}\n")
append("대여 지점 이름 : ${improvementReport.history.rentStoreMeta.name}\n")
append("대여 시각: ${improvementReport.history.rentedAt}\n")
append("반납 지점 이름 : ${improvementReport.history.returnStoreMeta?.name}\n")
append("반납 시각: ${improvementReport.history.returnedAt}\n")
append("신고 내용 : ${improvementReport.content}\n")
}
send(message)
}
}
Loading
Loading