Skip to content

Commit

Permalink
Deploy | CAKK-56 | v2.0.4 ๋ฐฐํฌ
Browse files Browse the repository at this point in the history
* Refactor | CAKK-58 | User ๋น„์ฆˆ๋‹ˆ์Šค์— Facade ํŒจํ„ด ์ ์šฉ

* Feature | CAKK-58 | User Command ๊ด€๋ จ Facade ๊ตฌํ˜„

* Refactor | CAKK-58 | ๋ฏธ์‚ฌ์šฉ Writer ์‚ญ์ œ

* Refactor | CAKK-58 | Service ๋ ˆ์ด์–ด์— Facade ํŒจํ„ด ์ ์šฉ

* Test | CAKK-58 | Facade ํ…Œ์ŠคํŠธ ์ถ”์ƒ ํด๋ž˜์Šค ๊ตฌ์ถ• ๋ฐ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

* Refactor | CAKK-59 | External ๋ชจ๋“ˆ ๋ฆฌํŒฉํ† ๋ง ๋ฐ Send ๊ด€๋ จ ์ถ”์ƒํ™”

* Chore | CAKK-58 | kt dsl ์ ์šฉ ๋ฐ kotlin ์˜์กด์„ฑ ์ฃผ์ž…

* Rename .java to .kt

* Refactor | CAKK-58 | send ๊ด€๋ จ ์ฝ”ํ‹€๋ฆฐ ์ ์šฉ ๋ฐ ์ถ”์ƒํ™”

* Refactor | CAKK-58 | ์‚ฌ์—…์ž ์ธ์ฆ ๊ด€๋ จ ๋ฆฌํŒฉํ† ๋ง

* Refactor | CAKK-58 | ์ด๋ฉ”์ผ ์ธ์ฆ ๊ด€๋ จ ๋ฆฌํŒฉํ† ๋ง

* Refactor | CAKK-58 | ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ˆ˜์ •

* Refactor | CAKK-58 | ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜์ •

* Refactor | CAKK-58 | ํ…œํ”Œ๋ฆฟ ์ฝœ๋ฐฑ ํŒจํ„ด ์ 

* Refactor | CAKK-58 | ํ…œํ”Œ๋ฆฟ ์ฝœ๋ฐฑ ํŒจํ„ด ์ ์šฉ

* Refactor | CAKK-59 | Message Extractor, Sender ๊ด€๋ จ ๋ฆฌํŒฉํ† ๋ง

* Refactor | CAKK-59 | MessageExtractor ์ธํ„ฐํŽ˜์ด์Šค ์ถ”์ƒํ™”

* Refactor | CAKK-59 | as-is ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ฑฐ

* Refactor | CAKK-59 | as-is ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ฑฐ

* Refactor | CAKK-59 | ๋ฉ”์‹œ์ง€ extractor, template ์ถ”์ƒํ™”

* Refactor | CAKK-59 | ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋ฆฌ์Šค๋„ˆ ๊ตฌํ˜„

* Refactor | CAKK-59 | api ๋ชจ๋“ˆ slack ์˜์กด์„ฑ ์ œ๊ฑฐ

* Refactor | CAKK-59 | ๋ฉ”์‹œ์ง€ ๊ด€๋ จ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฆฌํŒฉํ† ๋ง

* Test | CAKK-59 | ๋ฉ”์‹œ์ง€ ์ „์†ก ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ˆ˜์ •

* Chore | CAKK-59 | jacoco exclude์— ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก

* Refactor | CAKK-59 | email ๊ด€๋ จ sender ๋„ค์ด๋ฐ ์ˆ˜์ •

* Refactor | CAKK-59 | ์ œ๋„ค๋ฆญ ๋ฒ”์œ„ ์ˆ˜์ •

* Test | CAKK-59 | Error ๊ด€๋ จ ๋ฆฌ์Šค๋„ˆ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
  • Loading branch information
lcomment authored Aug 30, 2024
1 parent 3aef33c commit aa21b60
Show file tree
Hide file tree
Showing 62 changed files with 1,051 additions and 701 deletions.
3 changes: 2 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ subprojects {
}
}

if (project.name == "cakk-admin") {
if (project.name == "cakk-admin" || project.name == "cakk-external") {
apply(plugin = "org.jetbrains.kotlin.jvm")
apply(plugin = "org.jetbrains.kotlin.plugin.spring")
apply(plugin = "org.jetbrains.kotlin.plugin.jpa")
Expand Down Expand Up @@ -114,6 +114,7 @@ subprojects {
"com.cakk.api.provider.oauth.PublicKeyProvider",
"com.cakk.api.dto.**",
"com.cakk.api.mapper.**",
"com.cakk.api.listener.**",
"com.cakk.api.vo.**",
"com.cakk.domain.**"
)
Expand Down
51 changes: 0 additions & 51 deletions cakk-api/build.gradle

This file was deleted.

48 changes: 48 additions & 0 deletions cakk-api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
description = "api module"

dependencies {
implementation(project(":cakk-common"))
implementation(project(":cakk-domain:mysql"))
implementation(project(":cakk-domain:redis"))
implementation(project(":cakk-client"))
implementation(project(":cakk-external"))

// basic
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-aop:3.3.0")
implementation("org.springframework:spring-tx")
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")

// Security & OAuth
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-oauth2-client")
implementation("com.google.api-client:google-api-client-jackson2:2.2.0")
implementation("com.google.api-client:google-api-client:2.2.0")

// Jwt
implementation("io.jsonwebtoken:jjwt-api:0.11.5")
implementation("io.jsonwebtoken:jjwt-impl:0.11.5")
implementation("io.jsonwebtoken:jjwt-jackson:0.11.5")

// test
testImplementation("com.tngtech.archunit:archunit-junit5:1.1.0")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.security:spring-security-test")
testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter:1.0.23")

// test container
testImplementation("org.testcontainers:junit-jupiter:1.19.7")
testImplementation("org.testcontainers:mysql:1.19.7")

// Point
implementation("org.locationtech.jts:jts-core:1.18.2")
}

tasks.bootJar {
enabled = true
}

tasks.jar {
enabled = false
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.cakk.api.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.cakk.external.extractor.CertificationSlackMessageExtractor;
import com.cakk.external.extractor.ErrorAlertSlackMessageExtractor;
import com.cakk.external.extractor.MessageExtractor;
import com.cakk.external.template.MessageTemplate;

@Configuration
public class MessageTemplateConfig {

@Bean
public MessageTemplate certificationTemplate() {
return new MessageTemplate();
}

@Bean
public MessageExtractor certificationMessageExtractor() {
return new CertificationSlackMessageExtractor();
}

@Bean
public MessageExtractor errorAlertMessageExtractor() {
return new ErrorAlertSlackMessageExtractor();
}
}
22 changes: 0 additions & 22 deletions cakk-api/src/main/java/com/cakk/api/config/SlackWebhookConfig.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

import jakarta.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
Expand All @@ -20,27 +22,37 @@
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import com.cakk.api.service.slack.SlackService;
import com.cakk.api.mapper.EventMapper;
import com.cakk.common.enums.ReturnCode;
import com.cakk.common.exception.CakkException;
import com.cakk.common.response.ApiResponse;

@Slf4j
@RestControllerAdvice
@RequiredArgsConstructor
public class GlobalControllerAdvice {

private final SlackService slackService;
private final ApplicationEventPublisher applicationEventPublisher;

private final String profile;

public GlobalControllerAdvice(
ApplicationEventPublisher applicationEventPublisher,
@Value("${spring.profiles.active}") String profile
) {
this.applicationEventPublisher = applicationEventPublisher;
this.profile = profile;
}

@ExceptionHandler(CakkException.class)
public ResponseEntity<ApiResponse<Void>> handleCakkException(CakkException exception, HttpServletRequest request) {
final ReturnCode returnCode = exception.getReturnCode();

if (returnCode.equals(ReturnCode.INTERNAL_SERVER_ERROR) || returnCode.equals(ReturnCode.EXTERNAL_SERVER_ERROR)) {
slackService.sendSlackForError(exception, request);
applicationEventPublisher.publishEvent(EventMapper.supplyErrorAlertEventBy(exception, request, profile));
}

log.error(exception.getMessage());
return getResponseEntity(BAD_REQUEST, ApiResponse.fail(exception.getReturnCode()));
}
Expand Down Expand Up @@ -79,8 +91,9 @@ public ResponseEntity<ApiResponse<Map<String, String>>> handleMethodArgNotValidE
RuntimeException.class
})
public ResponseEntity<ApiResponse<String>> handleServerException(Exception exception, HttpServletRequest request) {
slackService.sendSlackForError(exception, request);
applicationEventPublisher.publishEvent(EventMapper.supplyErrorAlertEventBy(exception, request, profile));
log.error(exception.getMessage());

return getResponseEntity(INTERNAL_SERVER_ERROR, ApiResponse.error(ReturnCode.INTERNAL_SERVER_ERROR, exception.getMessage()));
}

Expand Down
10 changes: 10 additions & 0 deletions cakk-api/src/main/java/com/cakk/api/dto/event/ErrorAlertEvent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.cakk.api.dto.event;

import jakarta.servlet.http.HttpServletRequest;

public record ErrorAlertEvent(
Exception exception,
HttpServletRequest request,
String profile
) {
}
Original file line number Diff line number Diff line change
@@ -1,27 +1,39 @@
package com.cakk.api.listener;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Async;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;

import lombok.RequiredArgsConstructor;

import com.cakk.api.annotation.ApplicationEventListener;
import com.cakk.api.mapper.EventMapper;
import com.cakk.api.template.CertificationTemplate;
import com.cakk.domain.mysql.event.shop.CertificationEvent;
import com.cakk.external.extractor.MessageExtractor;
import com.cakk.external.sender.MessageSender;
import com.cakk.external.template.MessageTemplate;
import com.cakk.external.vo.CertificationMessage;

@RequiredArgsConstructor
@ApplicationEventListener
public class CertificationEventListener {

private final CertificationTemplate certificationTemplate;
private final MessageTemplate messageTemplate;
private final MessageExtractor messageExtractor;
private final MessageSender messageSender;

public CertificationEventListener(
MessageTemplate messageTemplate,
@Qualifier("certificationMessageExtractor") MessageExtractor messageExtractor,
@Qualifier("slackMessageSender") MessageSender messageSender
) {
this.messageTemplate = messageTemplate;
this.messageExtractor = messageExtractor;
this.messageSender = messageSender;
}

@Async
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void sendMessageToSlack(CertificationEvent certificationEvent) {
CertificationMessage certificationMessage = EventMapper.supplyCertificationMessageBy(certificationEvent);
certificationTemplate.sendMessageForCertification(certificationMessage);
messageTemplate.sendMessage(certificationMessage, messageExtractor, messageSender);
}
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,39 @@
package com.cakk.api.listener;

import java.util.Objects;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;

import lombok.RequiredArgsConstructor;

import com.cakk.api.annotation.ApplicationEventListener;
import com.cakk.api.dto.event.EmailWithVerificationCodeSendEvent;
import com.cakk.external.service.MailService;
import com.cakk.api.mapper.EventMapper;
import com.cakk.external.extractor.MessageExtractor;
import com.cakk.external.sender.MessageSender;
import com.cakk.external.template.MessageTemplate;
import com.cakk.external.vo.VerificationMessage;

@RequiredArgsConstructor
@ApplicationEventListener
public class EmailSendEventListener {

private final MailService mailService;

private final MessageTemplate messageTemplate;
private final MessageExtractor messageExtractor;
private final MessageSender messageSender;

public EmailSendEventListener(
MessageTemplate messageTemplate,
@Qualifier("verificationCodeMimeMessageExtractor") MessageExtractor messageExtractor,
@Qualifier("emailMessageSender") MessageSender messageSender
) {
this.messageTemplate = messageTemplate;
this.messageExtractor = messageExtractor;
this.messageSender = messageSender;
}

@Async
@EventListener
public void sendEmailIncludeVerificationCode(EmailWithVerificationCodeSendEvent event) {
mailService.sendEmail(Objects.requireNonNull(event.email()), Objects.requireNonNull(event.code()));
final VerificationMessage verificationMessage = EventMapper.supplyVerificationMessageBy(event);
messageTemplate.sendMessage(verificationMessage, messageExtractor, messageSender);
}
}
Loading

0 comments on commit aa21b60

Please sign in to comment.