diff --git a/src/main/java/com/gcp/domain/gcp/aop/RequiredValidToken.java b/src/main/java/com/gcp/domain/gcp/aop/RequiredValidToken.java new file mode 100644 index 0000000..4528e17 --- /dev/null +++ b/src/main/java/com/gcp/domain/gcp/aop/RequiredValidToken.java @@ -0,0 +1,10 @@ +package com.gcp.domain.gcp.aop; + + +import java.lang.annotation.*; + +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RequiredValidToken { +} diff --git a/src/main/java/com/gcp/domain/gcp/aop/TokenAspect.java b/src/main/java/com/gcp/domain/gcp/aop/TokenAspect.java new file mode 100644 index 0000000..c7ddece --- /dev/null +++ b/src/main/java/com/gcp/domain/gcp/aop/TokenAspect.java @@ -0,0 +1,46 @@ +package com.gcp.domain.gcp.aop; + + +import com.gcp.domain.discord.entity.DiscordUser; +import com.gcp.domain.discord.repository.DiscordUserRepository; +import com.gcp.domain.discord.service.DiscordUserService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.Map; + +@Slf4j +@Aspect +@Component +@RequiredArgsConstructor +public class TokenAspect { + + private final DiscordUserRepository discordUserRepository; + private final DiscordUserService discordUserService; + + @Around("@within(com.gcp.domain.gcp.aop.RequiredValidToken) && args(userId, guildId, ..)") + public Object validateAndRefreshToken(ProceedingJoinPoint joinPoint, String userId, String guildId) throws Throwable { + + LocalDateTime tokenExp = discordUserRepository.findAccessTokenExpByUserIdAndGuildId(userId, guildId) + .orElseThrow(); + + if (tokenExp.isBefore(LocalDateTime.now())) { + DiscordUser discordUser = discordUserRepository.findByUserIdAndGuildId(userId, guildId) + .orElseThrow(); + + Map reissued = discordUserService.refreshAccessToken(discordUser.getGoogleRefreshToken()); + + discordUser.updateAccessToken((String) reissued.get("access_token")); + discordUser.updateAccessTokenExpiration( + LocalDateTime.now().plusSeconds((Integer) reissued.get("expires_in")) + ); + } + + return joinPoint.proceed(); + } +} \ No newline at end of file diff --git a/src/main/java/com/gcp/domain/gcp/service/GcpService.java b/src/main/java/com/gcp/domain/gcp/service/GcpService.java index bee2ce0..ba160ba 100644 --- a/src/main/java/com/gcp/domain/gcp/service/GcpService.java +++ b/src/main/java/com/gcp/domain/gcp/service/GcpService.java @@ -5,11 +5,11 @@ import com.gcp.domain.discord.entity.DiscordUser; import com.gcp.domain.discord.repository.DiscordUserRepository; import com.gcp.domain.discord.service.DiscordUserService; +import com.gcp.domain.gcp.aop.RequiredValidToken; import com.gcp.domain.gcp.dto.ProjectZoneDto; import com.gcp.domain.gcp.repository.GcpProjectRepository; import com.gcp.domain.gcp.util.GcpImageUtil; -import com.gcp.domain.oauth2.util.TokenEncryptConverter; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -24,13 +24,13 @@ import java.io.IOException; -import java.time.LocalDateTime; import java.util.*; @Service @RequiredArgsConstructor @Slf4j @Transactional +@RequiredValidToken public class GcpService { private final RestTemplate restTemplate = new RestTemplate(); @@ -216,16 +216,8 @@ public List> getVmList(String userId, String guildId) { public List getProjectIds(String userId, String guildId) { try { String url = "https://cloudresourcemanager.googleapis.com/v1/projects"; - LocalDateTime tokenExp = discordUserRepository.findAccessTokenExpByUserIdAndGuildId(userId, guildId).orElseThrow(); - if(tokenExp.isBefore(LocalDateTime.now())){ - DiscordUser discordUser = discordUserRepository.findByUserIdAndGuildId(userId, guildId).orElseThrow(); - Map reissued = discordUserService.refreshAccessToken(discordUser.getGoogleRefreshToken()); - discordUser.updateAccessToken((String) reissued.get("access_token")); - discordUser.updateAccessTokenExpiration(LocalDateTime.now().plusSeconds((Integer) reissued.get("expires_in"))); - } String accessToken = discordUserRepository.findAccessTokenByUserIdAndGuildId(userId, guildId).orElseThrow(); - HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(accessToken); headers.setContentType(MediaType.APPLICATION_JSON); @@ -386,6 +378,7 @@ public String createVM(String userId, String guildId, String vmName, String mach throw new RuntimeException("Compute API (인스턴스 생성) 호출 도중 에러 발생: ", e); } } + public List> getFirewallRules(String userId, String guildId) { try { String url = String.format("https://compute.googleapis.com/compute/v1/projects/%s/global/firewalls", PROJECT_ID);