diff --git a/common/caching/src/main/java/caching/repository/RedisRepository.java b/common/caching/src/main/java/caching/repository/RedisRepository.java index 8a2527ed..846a064f 100644 --- a/common/caching/src/main/java/caching/repository/RedisRepository.java +++ b/common/caching/src/main/java/caching/repository/RedisRepository.java @@ -53,4 +53,16 @@ public void decrement(String key) { redisTemplate.opsForValue().decrement(key); } + public Object getValue(String key) { + return redisTemplate.opsForValue().get(key); + } + + public Long getSortedSetSize(String key) { + return redisTemplate.opsForZSet().size(key); + } + + public Boolean hasKey(String key) { + return redisTemplate.hasKey(key); + } + } diff --git a/common/dtos/src/main/java/user/LoginRequest.java b/common/dtos/src/main/java/user/LoginRequest.java new file mode 100644 index 00000000..0517dfcf --- /dev/null +++ b/common/dtos/src/main/java/user/LoginRequest.java @@ -0,0 +1,5 @@ +package user; + +public record LoginRequest(String email, String password) { + +} \ No newline at end of file diff --git a/common/dtos/src/main/java/user/UserLookupRequest.java b/common/dtos/src/main/java/user/UserLookupRequest.java deleted file mode 100644 index 32632358..00000000 --- a/common/dtos/src/main/java/user/UserLookupRequest.java +++ /dev/null @@ -1,5 +0,0 @@ -package user; - -public record UserLookupRequest(String email, String password) { - -} \ No newline at end of file diff --git a/docker-compose-redis.yml b/docker-compose-redis.yml index 4b04115b..83fef31e 100644 --- a/docker-compose-redis.yml +++ b/docker-compose-redis.yml @@ -94,4 +94,8 @@ services: - redis-master-3 - redis-replica-1 - redis-replica-2 - - redis-replica-3 \ No newline at end of file + - redis-replica-3 + +networks: + redis: + driver: bridge \ No newline at end of file diff --git a/gateway/build.gradle b/gateway/build.gradle index 0551cea3..5fa15adb 100644 --- a/gateway/build.gradle +++ b/gateway/build.gradle @@ -22,21 +22,27 @@ ext { } dependencies { - implementation 'org.springframework.cloud:spring-cloud-starter-gateway' + implementation project(':common:caching') + + // Cloud implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' - implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' + implementation 'org.springframework.cloud:spring-cloud-starter-gateway' + + // Security + implementation 'org.springframework.boot:spring-boot-starter-security' // JWT implementation 'io.jsonwebtoken:jjwt-api:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' + // Swagger + implementation 'org.springdoc:springdoc-openapi-starter-webflux-ui:2.0.2' + // Monitoring implementation 'org.springframework.boot:spring-boot-starter-actuator' runtimeOnly 'io.micrometer:micrometer-registry-prometheus' - - implementation 'org.springframework.boot:spring-boot-starter-data-redis' } dependencyManagement { diff --git a/gateway/src/main/java/com/ticketping/gateway/GatewayApplication.java b/gateway/src/main/java/com/ticketPing/gateway/GatewayApplication.java similarity index 80% rename from gateway/src/main/java/com/ticketping/gateway/GatewayApplication.java rename to gateway/src/main/java/com/ticketPing/gateway/GatewayApplication.java index 68e41acf..a5fb11d6 100644 --- a/gateway/src/main/java/com/ticketping/gateway/GatewayApplication.java +++ b/gateway/src/main/java/com/ticketPing/gateway/GatewayApplication.java @@ -1,16 +1,15 @@ -package com.ticketping.gateway; +package com.ticketPing.gateway; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.ComponentScan; +@ComponentScan(basePackages = {"com.ticketPing.gateway", "caching"}) @EnableFeignClients @SpringBootApplication public class GatewayApplication { - public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } - } diff --git a/gateway/src/main/java/com/ticketping/gateway/application/dto/UserCache.java b/gateway/src/main/java/com/ticketPing/gateway/application/dto/UserCache.java similarity index 66% rename from gateway/src/main/java/com/ticketping/gateway/application/dto/UserCache.java rename to gateway/src/main/java/com/ticketPing/gateway/application/dto/UserCache.java index 089db89c..38da1390 100644 --- a/gateway/src/main/java/com/ticketping/gateway/application/dto/UserCache.java +++ b/gateway/src/main/java/com/ticketPing/gateway/application/dto/UserCache.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway.application.dto; +package com.ticketPing.gateway.application.dto; import java.util.UUID; diff --git a/gateway/src/main/java/com/ticketping/gateway/application/service/QueueCheckService.java b/gateway/src/main/java/com/ticketPing/gateway/application/service/QueueCheckService.java similarity index 79% rename from gateway/src/main/java/com/ticketping/gateway/application/service/QueueCheckService.java rename to gateway/src/main/java/com/ticketPing/gateway/application/service/QueueCheckService.java index bc45bfa5..03a1e146 100644 --- a/gateway/src/main/java/com/ticketping/gateway/application/service/QueueCheckService.java +++ b/gateway/src/main/java/com/ticketPing/gateway/application/service/QueueCheckService.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway.application.service; +package com.ticketPing.gateway.application.service; public interface QueueCheckService { boolean areTooManyWaitingUsers(String performanceId); diff --git a/gateway/src/main/java/com/ticketping/gateway/application/service/QueueCheckServiceImpl.java b/gateway/src/main/java/com/ticketPing/gateway/application/service/QueueCheckServiceImpl.java similarity index 84% rename from gateway/src/main/java/com/ticketping/gateway/application/service/QueueCheckServiceImpl.java rename to gateway/src/main/java/com/ticketPing/gateway/application/service/QueueCheckServiceImpl.java index 41c633f7..7b41b5e4 100644 --- a/gateway/src/main/java/com/ticketping/gateway/application/service/QueueCheckServiceImpl.java +++ b/gateway/src/main/java/com/ticketPing/gateway/application/service/QueueCheckServiceImpl.java @@ -1,8 +1,8 @@ -package com.ticketping.gateway.application.service; +package com.ticketPing.gateway.application.service; -import static com.ticketping.gateway.domain.utils.QueueTokenValueGenerator.generateTokenValue; +import static com.ticketPing.gateway.domain.utils.QueueTokenValueGenerator.generateTokenValue; -import com.ticketping.gateway.domain.repository.QueueCheckRepository; +import com.ticketPing.gateway.domain.repository.QueueCheckRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/gateway/src/main/java/com/ticketping/gateway/domain/repository/QueueCheckRepository.java b/gateway/src/main/java/com/ticketPing/gateway/domain/repository/QueueCheckRepository.java similarity index 79% rename from gateway/src/main/java/com/ticketping/gateway/domain/repository/QueueCheckRepository.java rename to gateway/src/main/java/com/ticketPing/gateway/domain/repository/QueueCheckRepository.java index 8c6a4fcc..d6fb7acf 100644 --- a/gateway/src/main/java/com/ticketping/gateway/domain/repository/QueueCheckRepository.java +++ b/gateway/src/main/java/com/ticketPing/gateway/domain/repository/QueueCheckRepository.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway.domain.repository; +package com.ticketPing.gateway.domain.repository; public interface QueueCheckRepository { int getAvailableSeats(String performanceId); diff --git a/gateway/src/main/java/com/ticketping/gateway/domain/utils/QueueTokenValueGenerator.java b/gateway/src/main/java/com/ticketPing/gateway/domain/utils/QueueTokenValueGenerator.java similarity index 82% rename from gateway/src/main/java/com/ticketping/gateway/domain/utils/QueueTokenValueGenerator.java rename to gateway/src/main/java/com/ticketPing/gateway/domain/utils/QueueTokenValueGenerator.java index 978c7f31..e446bd57 100644 --- a/gateway/src/main/java/com/ticketping/gateway/domain/utils/QueueTokenValueGenerator.java +++ b/gateway/src/main/java/com/ticketPing/gateway/domain/utils/QueueTokenValueGenerator.java @@ -1,7 +1,7 @@ -package com.ticketping.gateway.domain.utils; +package com.ticketPing.gateway.domain.utils; -import static com.ticketping.gateway.infrastructure.enums.RedisKeyPrefix.TOKEN_VALUE; -import static com.ticketping.gateway.infrastructure.utils.ConfigHolder.tokenValueSecretKey; +import static com.ticketPing.gateway.infrastructure.enums.RedisKeyPrefix.TOKEN_VALUE; +import static com.ticketPing.gateway.infrastructure.utils.ConfigHolder.tokenValueSecretKey; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; diff --git a/gateway/src/main/java/com/ticketping/gateway/exception/ApplicationException.java b/gateway/src/main/java/com/ticketPing/gateway/exception/ApplicationException.java similarity index 72% rename from gateway/src/main/java/com/ticketping/gateway/exception/ApplicationException.java rename to gateway/src/main/java/com/ticketPing/gateway/exception/ApplicationException.java index e1980f24..cb035b9d 100644 --- a/gateway/src/main/java/com/ticketping/gateway/exception/ApplicationException.java +++ b/gateway/src/main/java/com/ticketPing/gateway/exception/ApplicationException.java @@ -1,6 +1,6 @@ -package com.ticketping.gateway.exception; +package com.ticketPing.gateway.exception; -import com.ticketping.gateway.presentation.cases.ErrorCase; +import com.ticketPing.gateway.presentation.cases.ErrorCase; import lombok.Getter; @Getter diff --git a/gateway/src/main/java/com/ticketping/gateway/infrastructure/config/GatewayCorsConfiguration.java b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/config/GatewayCorsConfiguration.java similarity index 94% rename from gateway/src/main/java/com/ticketping/gateway/infrastructure/config/GatewayCorsConfiguration.java rename to gateway/src/main/java/com/ticketPing/gateway/infrastructure/config/GatewayCorsConfiguration.java index 2f71a639..4590a21d 100644 --- a/gateway/src/main/java/com/ticketping/gateway/infrastructure/config/GatewayCorsConfiguration.java +++ b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/config/GatewayCorsConfiguration.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway.infrastructure.config; +package com.ticketPing.gateway.infrastructure.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/gateway/src/main/java/com/ticketPing/gateway/infrastructure/config/RouteConfig.java b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/config/RouteConfig.java new file mode 100644 index 00000000..dea88ff0 --- /dev/null +++ b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/config/RouteConfig.java @@ -0,0 +1,58 @@ +package com.ticketPing.gateway.infrastructure.config; + +import com.ticketPing.gateway.infrastructure.config.filter.QueueCheckFilter; +import lombok.RequiredArgsConstructor; +import org.springframework.cloud.gateway.route.RouteLocator; +import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@RequiredArgsConstructor +public class RouteConfig { + + private final QueueCheckFilter queueCheckFilter; + + @Bean + public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) { + return builder.routes() + + // API Routing + .route("auth-service", r -> r.path("/api/v1/auth/**") + .uri("lb://auth")) + .route("user-service", r -> r.path("/api/v1/users/**") + .uri("lb://user")) + .route("performance-service", r -> r.path( + "/api/v1/performances/**", "/api/v1/schedules/**", "/api/v1/seats/**") + .uri("lb://performance")) + .route("order-service", r -> r.path("/api/v1/orders/**") + .uri("lb://order")) + .route("payment-service", r -> r.path("/api/v1/payments/**") + .uri("lb://payment")) + .route("queue-manage-service", r -> r.path("/api/v1/waiting-queue/**", "/api/v1/working-queue/**") + .uri("lb://queue-manage")) + + // Swagger Routing + .route("auth-docs", r -> r.path("/v3/api-docs/auth-service") + .filters(f -> f.rewritePath("/v3/api-docs/auth-service", "/v3/api-docs")) + .uri("lb://auth")) + .route("user-docs", r -> r.path("/v3/api-docs/user-service") + .filters(f -> f.rewritePath("/v3/api-docs/user-service", "/v3/api-docs")) + .uri("lb://user")) + .route("performance-docs", r -> r.path("/v3/api-docs/performance-service") + .filters(f -> f.rewritePath("/v3/api-docs/performance-service", "/v3/api-docs")) + .uri("lb://performance")) + .route("order-docs", r -> r.path("/v3/api-docs/order-service") + .filters(f -> f.rewritePath("/v3/api-docs/order-service", "/v3/api-docs")) + .uri("lb://order")) + .route("payment-docs", r -> r.path("/v3/api-docs/payment-service") + .filters(f -> f.rewritePath("/v3/api-docs/payment-service", "/v3/api-docs")) + .uri("lb://payment")) + .route("queue-manage-docs", r -> r.path("/v3/api-docs/queue-manage-service") + .filters(f -> f.rewritePath("/v3/api-docs/queue-manage-service", "/v3/api-docs")) + .uri("lb://queue-manage")) + + .build(); + } + +} diff --git a/gateway/src/main/java/com/ticketPing/gateway/infrastructure/config/SwaggerConfig.java b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/config/SwaggerConfig.java new file mode 100644 index 00000000..1a2ad9dc --- /dev/null +++ b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/config/SwaggerConfig.java @@ -0,0 +1,39 @@ +package com.ticketPing.gateway.infrastructure.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import lombok.RequiredArgsConstructor; +import org.springdoc.core.properties.SwaggerUiConfigParameters; +import org.springframework.boot.CommandLineRunner; +import org.springframework.cloud.gateway.route.RouteLocator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Objects; + +@Configuration +@RequiredArgsConstructor +public class SwaggerConfig { + + private final RouteLocator routeLocator; + + @Bean + public CommandLineRunner openApiGroups(SwaggerUiConfigParameters swaggerUiParameters) { + return args -> Objects.requireNonNull(routeLocator.getRoutes().collectList().block()) + .stream() + .filter(route -> route.getId() != null && !route.getId().contains("-docs")) // API 문서 라우트 제외 + .forEach(route -> { + String name = route.getId(); + swaggerUiParameters.addGroup(name); + }); + } + + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("TicketPing API") + .version("1.0")); + } + +} \ No newline at end of file diff --git a/gateway/src/main/java/com/ticketping/gateway/infrastructure/config/filter/QueueCheckFilter.java b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/config/filter/QueueCheckFilter.java similarity index 88% rename from gateway/src/main/java/com/ticketping/gateway/infrastructure/config/filter/QueueCheckFilter.java rename to gateway/src/main/java/com/ticketPing/gateway/infrastructure/config/filter/QueueCheckFilter.java index bb9a55ef..d24cea0c 100644 --- a/gateway/src/main/java/com/ticketping/gateway/infrastructure/config/filter/QueueCheckFilter.java +++ b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/config/filter/QueueCheckFilter.java @@ -1,12 +1,12 @@ -package com.ticketping.gateway.infrastructure.config.filter; +package com.ticketPing.gateway.infrastructure.config.filter; -import static com.ticketping.gateway.presentation.cases.FilterErrorCase.PERFORMANCE_SOLD_OUT; -import static com.ticketping.gateway.presentation.cases.FilterErrorCase.TOO_MANY_WAITING_USERS; -import static com.ticketping.gateway.presentation.cases.FilterErrorCase.WORKING_TOKEN_NOT_FOUND; +import static com.ticketPing.gateway.presentation.cases.FilterErrorCase.PERFORMANCE_SOLD_OUT; +import static com.ticketPing.gateway.presentation.cases.FilterErrorCase.TOO_MANY_WAITING_USERS; +import static com.ticketPing.gateway.presentation.cases.FilterErrorCase.WORKING_TOKEN_NOT_FOUND; -import com.ticketping.gateway.application.service.QueueCheckService; -import com.ticketping.gateway.infrastructure.enums.APIType; -import com.ticketping.gateway.infrastructure.utils.ResponseWriter; +import com.ticketPing.gateway.application.service.QueueCheckService; +import com.ticketPing.gateway.infrastructure.enums.APIType; +import com.ticketPing.gateway.infrastructure.utils.ResponseWriter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilterChain; diff --git a/gateway/src/main/java/com/ticketping/gateway/infrastructure/enums/APIType.java b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/enums/APIType.java similarity index 94% rename from gateway/src/main/java/com/ticketping/gateway/infrastructure/enums/APIType.java rename to gateway/src/main/java/com/ticketPing/gateway/infrastructure/enums/APIType.java index a4521cdc..d00197b6 100644 --- a/gateway/src/main/java/com/ticketping/gateway/infrastructure/enums/APIType.java +++ b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/enums/APIType.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway.infrastructure.enums; +package com.ticketPing.gateway.infrastructure.enums; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/gateway/src/main/java/com/ticketping/gateway/infrastructure/enums/RedisKeyPrefix.java b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/enums/RedisKeyPrefix.java similarity index 83% rename from gateway/src/main/java/com/ticketping/gateway/infrastructure/enums/RedisKeyPrefix.java rename to gateway/src/main/java/com/ticketPing/gateway/infrastructure/enums/RedisKeyPrefix.java index cca761af..bd177dbf 100644 --- a/gateway/src/main/java/com/ticketping/gateway/infrastructure/enums/RedisKeyPrefix.java +++ b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/enums/RedisKeyPrefix.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway.infrastructure.enums; +package com.ticketPing.gateway.infrastructure.enums; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/gateway/src/main/java/com/ticketping/gateway/infrastructure/repository/QueueCheckRepositoryImpl.java b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/repository/QueueCheckRepositoryImpl.java similarity index 73% rename from gateway/src/main/java/com/ticketping/gateway/infrastructure/repository/QueueCheckRepositoryImpl.java rename to gateway/src/main/java/com/ticketPing/gateway/infrastructure/repository/QueueCheckRepositoryImpl.java index 2ad41e5e..398564ed 100644 --- a/gateway/src/main/java/com/ticketping/gateway/infrastructure/repository/QueueCheckRepositoryImpl.java +++ b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/repository/QueueCheckRepositoryImpl.java @@ -1,9 +1,10 @@ -package com.ticketping.gateway.infrastructure.repository; +package com.ticketPing.gateway.infrastructure.repository; -import static com.ticketping.gateway.infrastructure.enums.RedisKeyPrefix.AVAILABLE_SEATS; -import static com.ticketping.gateway.infrastructure.enums.RedisKeyPrefix.WAITING_QUEUE; +import static com.ticketPing.gateway.infrastructure.enums.RedisKeyPrefix.AVAILABLE_SEATS; +import static com.ticketPing.gateway.infrastructure.enums.RedisKeyPrefix.WAITING_QUEUE; -import com.ticketping.gateway.domain.repository.QueueCheckRepository; +import caching.repository.RedisRepository; +import com.ticketPing.gateway.domain.repository.QueueCheckRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; diff --git a/gateway/src/main/java/com/ticketping/gateway/infrastructure/security/JwtFilter.java b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/security/JwtFilter.java similarity index 90% rename from gateway/src/main/java/com/ticketping/gateway/infrastructure/security/JwtFilter.java rename to gateway/src/main/java/com/ticketPing/gateway/infrastructure/security/JwtFilter.java index db561fdf..146d9fab 100644 --- a/gateway/src/main/java/com/ticketping/gateway/infrastructure/security/JwtFilter.java +++ b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/security/JwtFilter.java @@ -1,10 +1,10 @@ -package com.ticketping.gateway.infrastructure.security; +package com.ticketPing.gateway.infrastructure.security; -import com.ticketping.gateway.application.dto.UserCache; -import com.ticketping.gateway.exception.ApplicationException; -import com.ticketping.gateway.infrastructure.repository.RedisRepository; -import com.ticketping.gateway.infrastructure.utils.ResponseWriter; -import com.ticketping.gateway.presentation.cases.SecurityErrorCase; +import caching.repository.RedisRepository; +import com.ticketPing.gateway.application.dto.UserCache; +import com.ticketPing.gateway.exception.ApplicationException; +import com.ticketPing.gateway.infrastructure.utils.ResponseWriter; +import com.ticketPing.gateway.presentation.cases.SecurityErrorCase; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Value; diff --git a/gateway/src/main/java/com/ticketping/gateway/infrastructure/security/SecurityConfig.java b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/security/SecurityConfig.java similarity index 86% rename from gateway/src/main/java/com/ticketping/gateway/infrastructure/security/SecurityConfig.java rename to gateway/src/main/java/com/ticketPing/gateway/infrastructure/security/SecurityConfig.java index 51100518..e03be7b2 100644 --- a/gateway/src/main/java/com/ticketping/gateway/infrastructure/security/SecurityConfig.java +++ b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/security/SecurityConfig.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway.infrastructure.security; +package com.ticketPing.gateway.infrastructure.security; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; @@ -27,10 +27,11 @@ public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { .pathMatchers("/api/v1/users/signup").permitAll() .pathMatchers(HttpMethod.GET, "/api/v1/performances/**").permitAll() .pathMatchers(HttpMethod.GET, "/api/v1/schedules/{scheduleId}").permitAll() - .pathMatchers("/api/v1/payments/**").permitAll() .pathMatchers("/actuator/prometheus").permitAll() - .anyExchange().authenticated() // 그 외 모든 경로는 인증 필요 + .pathMatchers("/swagger-ui/**", "/v3/api-docs/**", "/webjars/**").permitAll() + .anyExchange().permitAll() ) .build(); } + } \ No newline at end of file diff --git a/gateway/src/main/java/com/ticketping/gateway/infrastructure/utils/ConfigHolder.java b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/utils/ConfigHolder.java similarity index 89% rename from gateway/src/main/java/com/ticketping/gateway/infrastructure/utils/ConfigHolder.java rename to gateway/src/main/java/com/ticketPing/gateway/infrastructure/utils/ConfigHolder.java index 8874c7d0..4b96415f 100644 --- a/gateway/src/main/java/com/ticketping/gateway/infrastructure/utils/ConfigHolder.java +++ b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/utils/ConfigHolder.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway.infrastructure.utils; +package com.ticketPing.gateway.infrastructure.utils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; diff --git a/gateway/src/main/java/com/ticketping/gateway/infrastructure/utils/ResponseWriter.java b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/utils/ResponseWriter.java similarity index 87% rename from gateway/src/main/java/com/ticketping/gateway/infrastructure/utils/ResponseWriter.java rename to gateway/src/main/java/com/ticketPing/gateway/infrastructure/utils/ResponseWriter.java index 74b565f9..05a43300 100644 --- a/gateway/src/main/java/com/ticketping/gateway/infrastructure/utils/ResponseWriter.java +++ b/gateway/src/main/java/com/ticketPing/gateway/infrastructure/utils/ResponseWriter.java @@ -1,8 +1,8 @@ -package com.ticketping.gateway.infrastructure.utils; +package com.ticketPing.gateway.infrastructure.utils; import com.fasterxml.jackson.databind.ObjectMapper; -import com.ticketping.gateway.presentation.response.CustomErrorResponse; -import com.ticketping.gateway.presentation.cases.FilterErrorCase; +import com.ticketPing.gateway.presentation.response.CustomErrorResponse; +import com.ticketPing.gateway.presentation.cases.FilterErrorCase; import lombok.RequiredArgsConstructor; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.http.MediaType; diff --git a/gateway/src/main/java/com/ticketping/gateway/presentation/cases/ErrorCase.java b/gateway/src/main/java/com/ticketPing/gateway/presentation/cases/ErrorCase.java similarity index 72% rename from gateway/src/main/java/com/ticketping/gateway/presentation/cases/ErrorCase.java rename to gateway/src/main/java/com/ticketPing/gateway/presentation/cases/ErrorCase.java index 9481f92f..6f85892f 100644 --- a/gateway/src/main/java/com/ticketping/gateway/presentation/cases/ErrorCase.java +++ b/gateway/src/main/java/com/ticketPing/gateway/presentation/cases/ErrorCase.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway.presentation.cases; +package com.ticketPing.gateway.presentation.cases; import org.springframework.http.HttpStatus; diff --git a/gateway/src/main/java/com/ticketping/gateway/presentation/cases/FilterErrorCase.java b/gateway/src/main/java/com/ticketPing/gateway/presentation/cases/FilterErrorCase.java similarity index 91% rename from gateway/src/main/java/com/ticketping/gateway/presentation/cases/FilterErrorCase.java rename to gateway/src/main/java/com/ticketPing/gateway/presentation/cases/FilterErrorCase.java index a4a00ada..923babdb 100644 --- a/gateway/src/main/java/com/ticketping/gateway/presentation/cases/FilterErrorCase.java +++ b/gateway/src/main/java/com/ticketPing/gateway/presentation/cases/FilterErrorCase.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway.presentation.cases; +package com.ticketPing.gateway.presentation.cases; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/gateway/src/main/java/com/ticketping/gateway/presentation/cases/SecurityErrorCase.java b/gateway/src/main/java/com/ticketPing/gateway/presentation/cases/SecurityErrorCase.java similarity index 92% rename from gateway/src/main/java/com/ticketping/gateway/presentation/cases/SecurityErrorCase.java rename to gateway/src/main/java/com/ticketPing/gateway/presentation/cases/SecurityErrorCase.java index de05dccf..9515884d 100644 --- a/gateway/src/main/java/com/ticketping/gateway/presentation/cases/SecurityErrorCase.java +++ b/gateway/src/main/java/com/ticketPing/gateway/presentation/cases/SecurityErrorCase.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway.presentation.cases; +package com.ticketPing.gateway.presentation.cases; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/gateway/src/main/java/com/ticketping/gateway/presentation/response/CustomErrorResponse.java b/gateway/src/main/java/com/ticketPing/gateway/presentation/response/CustomErrorResponse.java similarity index 68% rename from gateway/src/main/java/com/ticketping/gateway/presentation/response/CustomErrorResponse.java rename to gateway/src/main/java/com/ticketPing/gateway/presentation/response/CustomErrorResponse.java index 574baef8..58fdffc9 100644 --- a/gateway/src/main/java/com/ticketping/gateway/presentation/response/CustomErrorResponse.java +++ b/gateway/src/main/java/com/ticketPing/gateway/presentation/response/CustomErrorResponse.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway.presentation.response; +package com.ticketPing.gateway.presentation.response; import org.springframework.http.HttpStatus; diff --git a/gateway/src/main/java/com/ticketping/gateway/infrastructure/config/RedisConfig.java b/gateway/src/main/java/com/ticketping/gateway/infrastructure/config/RedisConfig.java deleted file mode 100644 index 0f32f545..00000000 --- a/gateway/src/main/java/com/ticketping/gateway/infrastructure/config/RedisConfig.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.ticketping.gateway.infrastructure.config; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.data.redis.RedisProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -@Configuration -@RequiredArgsConstructor -public class RedisConfig { - - private final RedisProperties redisProperties; - - @Bean - public RedisConnectionFactory redisConnectionFactory() { - return new LettuceConnectionFactory(redisProperties.getHost(), redisProperties.getPort()); - } - - @Bean - public RedisTemplate redisTemplate() { - RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setConnectionFactory(redisConnectionFactory()); - - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.deactivateDefaultTyping(); - Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(objectMapper, Object.class); - - redisTemplate.setKeySerializer(new StringRedisSerializer()); - redisTemplate.setValueSerializer(serializer); - redisTemplate.setHashKeySerializer(new StringRedisSerializer()); - redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); - return redisTemplate; - } - -} \ No newline at end of file diff --git a/gateway/src/main/java/com/ticketping/gateway/infrastructure/config/RouteConfig.java b/gateway/src/main/java/com/ticketping/gateway/infrastructure/config/RouteConfig.java deleted file mode 100644 index 3e6ab746..00000000 --- a/gateway/src/main/java/com/ticketping/gateway/infrastructure/config/RouteConfig.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.ticketping.gateway.infrastructure.config; - -import com.ticketping.gateway.infrastructure.config.filter.QueueCheckFilter; -import lombok.RequiredArgsConstructor; -import org.springframework.cloud.gateway.route.RouteLocator; -import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@RequiredArgsConstructor -public class RouteConfig { - - private final QueueCheckFilter queueCheckFilter; - - @Bean - public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) { - return builder.routes() - .route("auth-service", r -> r.path("/api/v1/auth/**") - .uri("lb://auth")) - - .route("user-service", r -> r.path("/api/v1/users/**") - .uri("lb://user")) - - .route("performance-service", r -> r.path( - "/api/v1/performances/**", "/api/v1/schedules/**", "/api/v1/seats/**") - .uri("lb://performance")) - - .route("order-service", r -> r.path("/api/v1/orders/**") - .uri("lb://order")) - - .route("payment-service", r -> r.path("/api/v1/payments/**") - .uri("lb://payment")) - - .route("queue-manage-service", r -> r.path( - "/api/v1/waiting-queue/**") - .filters(f -> f.filter(queueCheckFilter::filter)) - .uri("lb://queue-manage")) - - .build(); - } - -} diff --git a/gateway/src/main/java/com/ticketping/gateway/infrastructure/repository/RedisRepository.java b/gateway/src/main/java/com/ticketping/gateway/infrastructure/repository/RedisRepository.java deleted file mode 100644 index 0ede177c..00000000 --- a/gateway/src/main/java/com/ticketping/gateway/infrastructure/repository/RedisRepository.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.ticketping.gateway.infrastructure.repository; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Repository; - -@Repository -@RequiredArgsConstructor -public class RedisRepository { - - private final RedisTemplate redisTemplate; - private final ObjectMapper objectMapper; - - public Object getValue(String key) { - return redisTemplate.opsForValue().get(key); - } - - public T getValueAsClass(String key, Class clazz) { - return objectMapper.convertValue(redisTemplate.opsForValue().get(key), clazz); - } - - public Long getSortedSetSize(String key) { - return redisTemplate.opsForZSet().size(key); - } - - public Boolean hasKey(String key) { - return redisTemplate.hasKey(key); - } - -} diff --git a/gateway/src/main/resources/application.yml b/gateway/src/main/resources/application.yml index c788a4cc..b66b8ffe 100644 --- a/gateway/src/main/resources/application.yml +++ b/gateway/src/main/resources/application.yml @@ -2,10 +2,9 @@ spring: application: name: gateway - data: - redis: - host: redis - port: 6379 + config: + import: + - "classpath:application-redis.yml" server: port: 10001 @@ -14,6 +13,7 @@ eureka: client: service-url: defaultZone: http://eureka-server:10000/eureka/ + management: endpoints: web: diff --git a/gateway/src/test/java/com/ticketping/gateway/GatewayApplicationTests.java b/gateway/src/test/java/com/ticketPing/gateway/GatewayApplicationTests.java similarity index 85% rename from gateway/src/test/java/com/ticketping/gateway/GatewayApplicationTests.java rename to gateway/src/test/java/com/ticketPing/gateway/GatewayApplicationTests.java index 9ee5ec00..2e4d188f 100644 --- a/gateway/src/test/java/com/ticketping/gateway/GatewayApplicationTests.java +++ b/gateway/src/test/java/com/ticketPing/gateway/GatewayApplicationTests.java @@ -1,4 +1,4 @@ -package com.ticketping.gateway; +package com.ticketPing.gateway; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; diff --git a/services/auth/src/main/java/com/ticketPing/auth/application/client/UserClient.java b/services/auth/src/main/java/com/ticketPing/auth/application/client/UserClient.java index 9bb90a67..edca5e59 100644 --- a/services/auth/src/main/java/com/ticketPing/auth/application/client/UserClient.java +++ b/services/auth/src/main/java/com/ticketPing/auth/application/client/UserClient.java @@ -2,8 +2,8 @@ import java.util.UUID; import response.CommonResponse; -import user.LoginRequest; import user.UserResponse; +import user.LoginRequest; public interface UserClient { CommonResponse getUserByEmailAndPassword(LoginRequest loginRequest); diff --git a/services/auth/src/main/java/com/ticketPing/auth/infrastructure/config/SwaggerConfig.java b/services/auth/src/main/java/com/ticketPing/auth/infrastructure/config/SwaggerConfig.java new file mode 100644 index 00000000..52585937 --- /dev/null +++ b/services/auth/src/main/java/com/ticketPing/auth/infrastructure/config/SwaggerConfig.java @@ -0,0 +1,17 @@ +package com.ticketPing.auth.infrastructure.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("Auth Service API") + .version("1.0")); + } +} diff --git a/services/order/src/main/java/com/ticketPing/order/infrastructure/config/SwaggerConfig.java b/services/order/src/main/java/com/ticketPing/order/infrastructure/config/SwaggerConfig.java new file mode 100644 index 00000000..486a32cc --- /dev/null +++ b/services/order/src/main/java/com/ticketPing/order/infrastructure/config/SwaggerConfig.java @@ -0,0 +1,17 @@ +package com.ticketPing.order.infrastructure.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("Order Service API") + .version("1.0")); + } +} diff --git a/services/payment/src/main/java/com/ticketPing/payment/infrastructure/config/SwaggerConfig.java b/services/payment/src/main/java/com/ticketPing/payment/infrastructure/config/SwaggerConfig.java index 0f5ba58c..200d44c8 100644 --- a/services/payment/src/main/java/com/ticketPing/payment/infrastructure/config/SwaggerConfig.java +++ b/services/payment/src/main/java/com/ticketPing/payment/infrastructure/config/SwaggerConfig.java @@ -1,15 +1,17 @@ package com.ticketPing.payment.infrastructure.config; -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -@OpenAPIDefinition( - info = @Info( - title = "Payment Service API", - version = "v1" - ) -) @Configuration public class SwaggerConfig { + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("Payment Service API") + .version("1.0")); + } } diff --git a/services/performance/src/main/java/com/ticketPing/performance/infrastructure/config/SwaggerConfig.java b/services/performance/src/main/java/com/ticketPing/performance/infrastructure/config/SwaggerConfig.java new file mode 100644 index 00000000..89e45a73 --- /dev/null +++ b/services/performance/src/main/java/com/ticketPing/performance/infrastructure/config/SwaggerConfig.java @@ -0,0 +1,17 @@ +package com.ticketPing.performance.infrastructure.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("Performance Service API") + .version("1.0")); + } +} diff --git a/services/queue-manage/build.gradle b/services/queue-manage/build.gradle index 615fceef..fe8bd2a6 100644 --- a/services/queue-manage/build.gradle +++ b/services/queue-manage/build.gradle @@ -49,10 +49,6 @@ dependencies { // Swagger implementation 'org.springdoc:springdoc-openapi-starter-webflux-ui:2.0.2' - // Monitoring - implementation 'org.springframework.boot:spring-boot-starter-actuator' - runtimeOnly 'io.micrometer:micrometer-registry-prometheus' - // Test testImplementation 'io.projectreactor:reactor-test:3.4.10' testImplementation 'org.springframework.kafka:spring-kafka-test:2.8.0' diff --git a/services/queue-manage/src/main/java/com/ticketPing/queue_manage/infrastructure/config/SwaggerConfig.java b/services/queue-manage/src/main/java/com/ticketPing/queue_manage/infrastructure/config/SwaggerConfig.java index 3670284d..8ff2fab2 100644 --- a/services/queue-manage/src/main/java/com/ticketPing/queue_manage/infrastructure/config/SwaggerConfig.java +++ b/services/queue-manage/src/main/java/com/ticketPing/queue_manage/infrastructure/config/SwaggerConfig.java @@ -1,15 +1,17 @@ package com.ticketPing.queue_manage.infrastructure.config; -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -@OpenAPIDefinition( - info = @Info( - title = "Queue-Manage Service API", - version = "v1" - ) -) @Configuration public class SwaggerConfig { + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("Queue Manage Service API") + .version("1.0")); + } } diff --git a/services/user/src/main/java/com/ticketPing/user/infrastructure/config/SwaggerConfig.java b/services/user/src/main/java/com/ticketPing/user/infrastructure/config/SwaggerConfig.java new file mode 100644 index 00000000..b28fa9f0 --- /dev/null +++ b/services/user/src/main/java/com/ticketPing/user/infrastructure/config/SwaggerConfig.java @@ -0,0 +1,17 @@ +package com.ticketPing.user.infrastructure.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("User Service API") + .version("1.0")); + } +} diff --git a/settings.gradle b/settings.gradle index befe46e6..eea9616a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,10 +4,10 @@ include ("eureka-server") include("gateway") include ("common:core") +include ("common:dtos") include ("common:jpa") include ("common:caching") include ("common:messaging") -include ("common:dtos") include ("services:auth") include ("services:user")