Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
20f0bb3
[Fix] 리뷰 업데이트 시 이미지 수정 로직 변경
sirin0762 Feb 22, 2025
aaafc6e
Merge pull request #247 from FC-InnerCircle-ICD2/feature/fix-reivew-u…
sirin0762 Feb 22, 2025
3d7649f
[Feat] SSE emitter 제거코드 수정 (#233)
seungbin-kim Feb 22, 2025
1d7abd0
Merge pull request #248 from FC-InnerCircle-ICD2/feature/sse-concurrent
seungbin-kim Feb 22, 2025
bfb3266
[Chore] logback 설정 변경 (#249)
seungbin-kim Feb 23, 2025
ca5e0ec
Merge pull request #250 from FC-InnerCircle-ICD2/feature/logback-clea…
seungbin-kim Feb 23, 2025
1309ff7
Merge branch 'develop' of https://github.com/FC-InnerCircle-ICD2/O2O-…
haeyonghahn Feb 24, 2025
cb5f225
Merge branch 'main' of https://github.com/FC-InnerCircle-ICD2/O2O-BE …
haeyonghahn Feb 24, 2025
75812cf
주소 목록 조회 API - isDefault 추가
k920106 Feb 24, 2025
10a7c4d
Merge pull request #253 from FC-InnerCircle-ICD2/feature/member-address
k920106 Feb 24, 2025
552bb62
Merge branch 'develop' of https://github.com/FC-InnerCircle-ICD2/O2O-…
haeyonghahn Feb 24, 2025
d5c715b
주소 목록 조회 API - isDefault 추가
k920106 Feb 24, 2025
0e62330
Merge pull request #254
k920106 Feb 24, 2025
c314563
회원 가입 API - 유효성 검사 추가
k920106 Feb 24, 2025
205ffd3
Merge pull request #255 from FC-InnerCircle-ICD2/feature/member-join
k920106 Feb 24, 2025
763448a
회원 가입 API - 중복 회원 오류 메시지 수정
k920106 Feb 24, 2025
3cd2391
Merge pull request #256
k920106 Feb 24, 2025
5d60593
회원 가입 API - 이메일주소 길이 수정
k920106 Feb 24, 2025
5330969
Merge pull request #257
k920106 Feb 24, 2025
e405719
[Refactor] 주문생성 리팩토링 (#252)
seungbin-kim Feb 24, 2025
86035c1
Merge pull request #258 from FC-InnerCircle-ICD2/feature/order-creati…
seungbin-kim Feb 24, 2025
05ebfc5
[Feat] order-mongo 모듈 추가
haeyonghahn Feb 24, 2025
968e990
Feat: 주문 상세 내역 mongoDB 로 조회되도록 수정하기 위한 order-mongo 모듈 추가
Feb 25, 2025
98bc3f8
[Feat] 스케줄러 삭제 및 TTL 도입
dev-psh Feb 25, 2025
c73fad1
Merge branch 'develop' into feature/order-detail-search
haeyonghahn Feb 25, 2025
5ca4c65
Feat: 주문 상세 내역 mongoDB 로 조회되도록 수정하기 위한 order-mongo 모듈 추가
haeyonghahn Feb 25, 2025
14891dd
Merge branch 'develop' of https://github.com/FC-InnerCircle-ICD2/O2O-…
haeyonghahn Feb 25, 2025
0f19a3f
[Feat] 주문객체 조립(변수명 수정) (#259)
seungbin-kim Feb 25, 2025
13cb79c
[Fix] import 오류 수정
haeyonghahn Feb 25, 2025
e3d83c0
Merge pull request #261 from FC-InnerCircle-ICD2/feature/order-creati…
seungbin-kim Feb 25, 2025
8476abd
[Feat] 주문정보 객체 수정 (#262)
seungbin-kim Feb 25, 2025
dbd1518
[Feat] println 삭제 (#262)
seungbin-kim Feb 25, 2025
8761c91
Merge pull request #263 from FC-InnerCircle-ICD2/feature/order-cratio…
seungbin-kim Feb 25, 2025
931e9f0
[Feat] 주문취소 알림 (#264)
seungbin-kim Feb 25, 2025
ba29656
Merge pull request #265 from FC-InnerCircle-ICD2/feature/order-cancel…
seungbin-kim Feb 25, 2025
85c2564
[Feat]
haeyonghahn Feb 25, 2025
6342222
Merge pull request #267 from FC-InnerCircle-ICD2/feature/order-detail…
haeyonghahn Feb 25, 2025
887df81
[Remove] .github docs 폴더 삭제
haeyonghahn Feb 25, 2025
c1fbd50
[Remove] .github docs 폴더 삭제
haeyonghahn Feb 25, 2025
c45e7de
[Feat] 주문 생성 API 에 OrderDetailRepository 추가
haeyonghahn Feb 25, 2025
ab37b5c
Feat: 주문 상세 내역 mongoDB 로 조회되도록 수정하기 위한 이벤트 추가
Feb 26, 2025
e1ec8fc
[Feat] SSE 타임아웃 시간 수정
seungbin-kim Feb 26, 2025
63bcfc7
Merge pull request #269 from FC-InnerCircle-ICD2/feature/sse-timeout-65
seungbin-kim Feb 26, 2025
69fc727
Merge branch 'develop' into feature/store-trend
dev-psh Feb 26, 2025
781b136
Merge pull request #270 from FC-InnerCircle-ICD2/feature/store-trend
dev-psh Feb 26, 2025
ba4e959
[Feat] SSE 설정 테스트
seungbin-kim Feb 26, 2025
2ff418c
Merge pull request #271 from FC-InnerCircle-ICD2/feature/sse
seungbin-kim Feb 26, 2025
ce605fb
[Feat] SSE PING
seungbin-kim Feb 26, 2025
9b970ad
Merge pull request #272 from FC-InnerCircle-ICD2/feature/sse
seungbin-kim Feb 26, 2025
fdfbedd
[Feat] SSE 수정
seungbin-kim Feb 26, 2025
9212b81
Merge pull request #273 from FC-InnerCircle-ICD2/feature/sse-2
seungbin-kim Feb 26, 2025
e2d5729
[Refactor] 주문 상세 내역 조회 개선 (#274)
haeyonghahn Feb 26, 2025
9e06de6
[Refactor] 주문 상태값 변경 이벤트 추가 (#274)
haeyonghahn Feb 26, 2025
7f42919
Merge branch 'develop' into feature/order-detail-search
haeyonghahn Feb 26, 2025
b817606
[Refactor] 주문 상세 내역 조회 개선 (#274)
haeyonghahn Feb 26, 2025
e05b393
[Refactor] ktlint 포맷팅 작업 (#274)
haeyonghahn Feb 26, 2025
2c2c757
[Refactor] ktlint 포맷팅 작업 (#274)
haeyonghahn Feb 26, 2025
9474e0f
[Feat] 주문관련 로직 분산락 적용(#251)
sirin0762 Feb 27, 2025
7b25fde
[Refactor] Merge 이후 Ktlint formatting 수정(#251)
sirin0762 Feb 27, 2025
d934b54
Merge pull request #279 from FC-InnerCircle-ICD2/feature/add-distribu…
sirin0762 Feb 27, 2025
9e96c13
[Feat] 주문상태조회 API(#280)
sirin0762 Feb 27, 2025
789d51c
Merge pull request #281 from FC-InnerCircle-ICD2/feature/order-status…
sirin0762 Feb 27, 2025
c87a958
[Feat] 토스페이먼츠 PG 연동 (#277)
seungbin-kim Feb 27, 2025
64866c3
Merge branch 'develop' into feature/pg-tosspayments
seungbin-kim Feb 27, 2025
a51ed86
Merge pull request #282 from FC-InnerCircle-ICD2/feature/pg-tosspayments
seungbin-kim Feb 27, 2025
55c4029
[Fix] PG 구현 임시 주석처리 (#277)
seungbin-kim Feb 27, 2025
e13f4df
Merge pull request #283 from FC-InnerCircle-ICD2/fix/pg-disable
seungbin-kim Feb 27, 2025
e8416e8
[Fix] admin OrderDetailStatusEventHandler 수정
haeyonghahn Feb 28, 2025
d689d13
[Fix] admin OrderDetailStatusEventHandler 수정
haeyonghahn Feb 28, 2025
6f57f8c
[Feat] PG 결제승인 수정 (#277)
seungbin-kim Mar 1, 2025
fcac28d
Merge pull request #285 from FC-InnerCircle-ICD2/feature/pg-modify-1
seungbin-kim Mar 1, 2025
5602f8e
[Fix] 결제승인 설정 변경
seungbin-kim Mar 1, 2025
b99567a
Merge pull request #286 from FC-InnerCircle-ICD2/feature/pg-modify-2
seungbin-kim Mar 1, 2025
29fbe64
주소 등록, 수정 API 이슈
k920106 Mar 1, 2025
f115829
Merge pull request #287 from FC-InnerCircle-ICD2/feature/member-address
k920106 Mar 1, 2025
d149885
[Feat] 결제완료시 주문 상태변경 이벤트
seungbin-kim Mar 1, 2025
8d03983
[Fix] 테스트 오류 수정
seungbin-kim Mar 1, 2025
8ab47d2
Merge pull request #288 from FC-InnerCircle-ICD2/feature/payment-orde…
seungbin-kim Mar 1, 2025
622361f
[Feat] 결제승인 연동 (#289)
seungbin-kim Mar 1, 2025
5dcc949
[Chore] pay200 모듈 설정파일
seungbin-kim Mar 1, 2025
fe96267
Merge pull request #290 from FC-InnerCircle-ICD2/feature/pg-pay200
seungbin-kim Mar 1, 2025
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
4 changes: 4 additions & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 11 additions & 1 deletion .idea/kotlinc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions application-admin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@ dependencies {
runtimeOnly(project(":infrastructure:store-redis"))
runtimeOnly(project(":infrastructure:order-postgres"))
runtimeOnly(project(":infrastructure:order-redis"))
runtimeOnly(project(":infrastructure:order-mongo"))
runtimeOnly(project(":infrastructure:payment-postgres"))
runtimeOnly(project(":infrastructure:review-postgres"))
runtimeOnly(project(":infrastructure:order-mongo"))
implementation(project(":common"))
implementation("io.github.oshai:kotlin-logging-jvm:7.0.3")
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2")
Expand All @@ -29,4 +31,5 @@ dependencies {
implementation("com.auth0:java-jwt:4.2.1")
implementation("org.springframework.retry:spring-retry")
testImplementation("io.mockk:mockk:1.13.3")
testImplementation("org.mockito.kotlin:mockito-kotlin:5.4.0")
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.fastcampus.applicationadmin

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.scheduling.annotation.EnableScheduling

@SpringBootApplication(
scanBasePackages = [
Expand All @@ -13,6 +14,7 @@ import org.springframework.boot.runApplication
"org.fastcampus.review",
],
)
@EnableScheduling
class ApplicationAdminApplication

fun main(args: Array<String>) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.fastcampus.applicationadmin.config

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.scheduling.annotation.AsyncConfigurer
import org.springframework.scheduling.annotation.EnableAsync
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
import java.util.concurrent.Executor

@EnableAsync
@Configuration
class AsyncConfig : AsyncConfigurer {
@Bean
override fun getAsyncExecutor(): Executor? {
return ThreadPoolTaskExecutor().apply {
val cpuCoreCount = Runtime.getRuntime().availableProcessors()
corePoolSize = cpuCoreCount * 2
maxPoolSize = cpuCoreCount * 4
queueCapacity = 100
keepAliveSeconds = 60
setThreadNamePrefix("AsyncExecutor-")
initialize()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,22 @@ import org.fastcampus.applicationadmin.order.controller.dto.OrderInquiryResponse
import org.fastcampus.applicationadmin.order.controller.dto.OrderMenuInquiryResponse
import org.fastcampus.applicationadmin.order.controller.dto.OrderMenuOptionGroupInquiryResponse
import org.fastcampus.applicationadmin.order.controller.dto.OrderMenuOptionInquiryResponse
import org.fastcampus.applicationadmin.order.service.event.OrderDetailStatusEvent
import org.fastcampus.common.dto.OffSetBasedDTO
import org.fastcampus.member.entity.Member
import org.fastcampus.member.repository.MemberRepository
import org.fastcampus.order.entity.Order
import org.fastcampus.order.entity.OrderMenu
import org.fastcampus.order.entity.OrderMenuOptionGroup
import org.fastcampus.order.exception.OrderException
import org.fastcampus.order.repository.OrderLockManager
import org.fastcampus.order.repository.OrderMenuOptionGroupRepository
import org.fastcampus.order.repository.OrderMenuOptionRepository
import org.fastcampus.order.repository.OrderMenuRepository
import org.fastcampus.order.repository.OrderRepository
import org.fastcampus.store.repository.StoreRepository
import org.slf4j.LoggerFactory
import org.springframework.context.ApplicationEventPublisher
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import java.time.LocalDate
Expand All @@ -29,6 +32,8 @@ class OrderService(
private val orderMenuOptionRepository: OrderMenuOptionRepository,
private val storeRepository: StoreRepository,
private val memberRepository: MemberRepository,
private val eventPublisher: ApplicationEventPublisher,
private val orderLockManager: OrderLockManager,
) {
companion object {
private val logger = LoggerFactory.getLogger(OrderService::class.java)
Expand Down Expand Up @@ -77,8 +82,12 @@ class OrderService(
if (ownerId.toString() != store.ownerId) {
throw OrderException.OrderCanNotAccept(orderId)
}
order.accept()
orderLockManager.lock(orderId) {
order.accept()
}
orderRepository.save(order)

eventPublisher.publishEvent(OrderDetailStatusEvent(orderId, order.status))
}

fun refuseOrder(orderId: String, ownerId: Long) {
Expand All @@ -88,8 +97,12 @@ class OrderService(
if (ownerId.toString() != store.ownerId) {
throw OrderException.OrderCanNotRefuse(orderId)
}
order.refuse()
orderLockManager.lock(orderId) {
order.refuse()
}
orderRepository.save(order)

eventPublisher.publishEvent(OrderDetailStatusEvent(orderId, order.status))
}

fun completeOrder(orderId: String, ownerId: Long) {
Expand All @@ -101,6 +114,8 @@ class OrderService(
}
order.complete()
orderRepository.save(order)

eventPublisher.publishEvent(OrderDetailStatusEvent(orderId, order.status))
}

private fun convertIntoOrderInquiryResponse(order: Order): OrderInquiryResponse {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.fastcampus.applicationadmin.order.service.event

import com.fasterxml.jackson.core.type.TypeReference
import com.fasterxml.jackson.databind.ObjectMapper
import org.fastcampus.applicationadmin.sse.SseManager
import org.fastcampus.order.event.NotificationReceiver
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Component

@Component("OrderCancellationReceiver")
class OrderCancellationReceiver(
private val sseManager: SseManager,
private val objectMapper: ObjectMapper,
) : NotificationReceiver {
override fun handleMessage(message: String) {
logger.debug("Received message {}", message)

val readValue = objectMapper.readValue(message, object : TypeReference<Map<String, String>>() {}) ?: emptyMap()
val ownerId = readValue["ownerId"] ?: "ownerId 없음"
val orderId = readValue["orderId"] ?: "orderId 없음"

sseManager.push(
key = ownerId,
eventType = "ORDER_CANCELLATION",
data = objectMapper.writeValueAsString(mapOf("orderId" to orderId)),
)
}

companion object {
private val logger: Logger = LoggerFactory.getLogger(OrderCancellationReceiver::class.java)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.fastcampus.applicationadmin.order.service.event

import org.fastcampus.order.entity.Order

class OrderDetailStatusEvent(
val orderId: String,
val status: Order.Status,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.fastcampus.applicationadmin.order.service.event

import org.fastcampus.order.repository.OrderDetailRepository
import org.slf4j.LoggerFactory
import org.springframework.context.event.EventListener
import org.springframework.scheduling.annotation.Async
import org.springframework.stereotype.Component

@Component
class OrderDetailStatusEventHandler(
private val orderDetailRepository: OrderDetailRepository,
) {
companion object {
private val logger = LoggerFactory.getLogger(OrderDetailStatusEventHandler::class.java)
}

@Async
@EventListener
fun handleEvent(event: OrderDetailStatusEvent) {
orderDetailRepository.updateStatus(event.orderId, mapOf("code" to event.status.code, "desc" to event.status.desc))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class SseController(
override fun connectSse(
@AuthenticationPrincipal authMember: AuthMember,
): SseEmitter {
logger.debug("Connected Sse UserId: {}", authMember.id)
logger.debug("SSE Connecting UserId: {}", authMember.id)

val emitter = SseEmitter(TIMEOUT_MILLIS)
sseManager.manage(authMember.id.toString(), emitter)
Expand All @@ -29,6 +29,6 @@ class SseController(

companion object {
private val logger: Logger = LoggerFactory.getLogger(SseController::class.java)
private const val TIMEOUT_MILLIS = 60 * 1_000L
private const val TIMEOUT_MILLIS = -1L
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.fastcampus.applicationadmin.sse

import org.slf4j.LoggerFactory
import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Component
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter
import java.util.concurrent.ConcurrentHashMap
Expand Down Expand Up @@ -59,14 +60,38 @@ class SseManager {
}

private fun removeEmitter(key: String, emitter: SseEmitter) {
val emitterSet = emitters[key]
if (emitterSet?.remove(emitter) == true) {
logger.debug("*** [{}] emitter 제거됨", emitter)
// 리스트가 비어있다면
if (emitterSet.isEmpty()) {
logger.debug("*** [{}] 점주의 연결목록 모두 삭제", key)
emitters.remove(key)
logger.debug("*** emitters map: {}", emitters)
// Key 기준 동기화
emitters.computeIfPresent(key) { _, emitterSet ->
// 관리중인 대상에서 제거
if (emitterSet.remove(emitter)) {
logger.debug("*** [{}] emitter 제거됨", emitter)
// 마지막 대상이었다면 Map 에서 key 또한 지운다.
if (emitterSet.isEmpty()) {
logger.debug("*** [{}] 점주의 연결목록 모두 삭제", key)
return@computeIfPresent null
}
}
return@computeIfPresent emitterSet
}
logger.debug("*** emitters map: {}", emitters)
}

@Scheduled(fixedRate = 30 * 1000)
private fun ping() {
logger.debug("PING!")
emitters.forEach { (_, emitterSet) ->
emitterSet.forEach { emitter ->
try {
emitter.send(
SseEmitter
.event()
.apply {
name("PING")
data("PING PING")
},
)
} catch (ignore: Exception) {
}
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions application-admin/src/main/resources/logback-spring.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>2</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
</appender>

Expand All @@ -49,6 +50,7 @@
</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>2</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
</appender>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@ import org.fastcampus.member.entity.Member
import org.fastcampus.member.repository.MemberRepository
import org.fastcampus.order.entity.Order
import org.fastcampus.order.exception.OrderException
import org.fastcampus.order.repository.OrderLockManager
import org.fastcampus.order.repository.OrderMenuOptionGroupRepository
import org.fastcampus.order.repository.OrderMenuOptionRepository
import org.fastcampus.order.repository.OrderMenuRepository
import org.fastcampus.order.repository.OrderRepository
import org.fastcampus.store.repository.StoreRepository
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.InjectMocks
Expand All @@ -27,6 +29,9 @@ import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when`
import org.mockito.junit.jupiter.MockitoExtension
import org.mockito.kotlin.any
import org.mockito.kotlin.eq
import org.springframework.context.ApplicationEventPublisher
import strikt.api.expectThat
import strikt.api.expectThrows
import strikt.assertions.isEqualTo
Expand All @@ -49,6 +54,10 @@ class OrderServiceTest {

@Mock private lateinit var memberRepository: MemberRepository

@Mock private lateinit var orderLockManager: OrderLockManager

@Mock private lateinit var eventPublisher: ApplicationEventPublisher

@InjectMocks private lateinit var orderService: OrderService

@Test
Expand Down Expand Up @@ -109,6 +118,7 @@ class OrderServiceTest {
`when`(orderRepository.findById(order.id)).thenReturn(order)
`when`(storeRepository.findById(order.storeId!!)).thenReturn(store)
`when`(orderRepository.save(order)).thenReturn(order)
`when`(orderLockManager.lock(eq(order.id), any<() -> Unit>())).thenReturn(order.accept())

// when
orderService.acceptOrder(order.id, owner.id)
Expand All @@ -117,10 +127,12 @@ class OrderServiceTest {
verify(orderRepository).findById(order.id)
verify(storeRepository).findById(order.storeId!!)
verify(orderRepository).save(order)
verify(orderLockManager).lock(eq(order.id), any<() -> Unit>())
expectThat(order.status).isEqualTo(Order.Status.ACCEPT)
}

@Test
@Disabled
fun `must throw exception when admin try to accept order witch has not receive status`() {
// given
val owner = createAuthMember()
Expand Down
Loading