[
  {
    "path": ".gitignore",
    "content": "/*/build/\naxon-server-se/*/*\ndb/data/*"
  },
  {
    "path": ".idea/.gitignore",
    "content": "# 디폴트 무시된 파일\n/shelf/\n/workspace.xml\n# 에디터 기반 HTTP 클라이언트 요청\n/httpRequests/\n# Datasource local storage ignored files\n/dataSources/\n/dataSources.local.xml\n# Zeppelin ignored files\n/ZeppelinRemoteNotebooks/\n"
  },
  {
    "path": ".idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <annotationProcessing>\n      <profile name=\"Gradle Imported\" enabled=\"true\">\n        <outputRelativeToContentRoot value=\"true\" />\n        <processorPath useClasspath=\"false\">\n          <entry name=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.projectlombok/lombok/1.18.20/18bcea7d5df4d49227b4a0743a536208ce4825bb/lombok-1.18.20.jar\" />\n          <entry name=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-configuration-processor/2.5.2/69da26fe0e896d89feb388c425947c34416fde2e/spring-boot-configuration-processor-2.5.2.jar\" />\n        </processorPath>\n        <module name=\"fastcampus-pay.settlement-service.main\" />\n        <module name=\"fastcampus-pay.membership-service.main\" />\n        <module name=\"fastcampus-pay.common.main\" />\n        <module name=\"fastcampus-pay.money-local-service.main\" />\n        <module name=\"fastcampus-pay.money-service.main\" />\n        <module name=\"fastcampus-pay.payment-service.main\" />\n        <module name=\"fastcampus-pay.banking-service.main\" />\n        <module name=\"fastcampus-pay.remittance-service.main\" />\n      </profile>\n    </annotationProcessing>\n    <bytecodeTargetLevel target=\"11\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleMigrationSettings\" migrationVersion=\"1\" />\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"gradleJvm\" value=\"#JAVA_HOME\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/banking-service\" />\n            <option value=\"$PROJECT_DIR$/common\" />\n            <option value=\"$PROJECT_DIR$/membership-service\" />\n            <option value=\"$PROJECT_DIR$/money-local-service\" />\n            <option value=\"$PROJECT_DIR$/money-service\" />\n            <option value=\"$PROJECT_DIR$/payment-service\" />\n            <option value=\"$PROJECT_DIR$/remittance-service\" />\n            <option value=\"$PROJECT_DIR$/settlement-service\" />\n          </set>\n        </option>\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/jarRepositories.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RemoteRepositoriesConfiguration\">\n    <remote-repository>\n      <option name=\"id\" value=\"central\" />\n      <option name=\"name\" value=\"Maven Central repository\" />\n      <option name=\"url\" value=\"https://repo1.maven.org/maven2\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"jboss.community\" />\n      <option name=\"name\" value=\"JBoss Community repository\" />\n      <option name=\"url\" value=\"https://repository.jboss.org/nexus/content/repositories/public/\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"MavenRepo\" />\n      <option name=\"name\" value=\"MavenRepo\" />\n      <option name=\"url\" value=\"https://repo.maven.apache.org/maven2/\" />\n    </remote-repository>\n  </component>\n</project>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ExternalStorageConfigurationManager\" enabled=\"true\" />\n  <component name=\"FrameworkDetectionExcludesConfiguration\">\n    <file type=\"web\" url=\"file://$PROJECT_DIR$\" />\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_11\" default=\"true\" project-jdk-name=\"11\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/out\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/modules/common/fastcampus-pay.common.main.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module version=\"4\">\n  <component name=\"NewModuleRootManager\">\n    <content url=\"file://$MODULE_DIR$/../../../common/build/generated/sources/annotationProcessor/java/main\">\n      <sourceFolder url=\"file://$MODULE_DIR$/../../../common/build/generated/sources/annotationProcessor/java/main\" isTestSource=\"false\" generated=\"true\" />\n    </content>\n  </component>\n</module>"
  },
  {
    "path": ".idea/modules/settlement-service/fastcampus-pay.settlement-service.main.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module version=\"4\">\n  <component name=\"NewModuleRootManager\">\n    <content url=\"file://$MODULE_DIR$/../../../settlement-service/build/generated/sources/annotationProcessor/java/main\">\n      <sourceFolder url=\"file://$MODULE_DIR$/../../../settlement-service/build/generated/sources/annotationProcessor/java/main\" isTestSource=\"false\" generated=\"true\" />\n    </content>\n  </component>\n</module>"
  },
  {
    "path": ".idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/banking-service/fastcampus-pay.banking-service.main.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/banking-service/fastcampus-pay.banking-service.main.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/common/fastcampus-pay.common.main.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/common/fastcampus-pay.common.main.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/membership-service/fastcampus-pay.membership-service.main.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/membership-service/fastcampus-pay.membership-service.main.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/money-local-service/fastcampus-pay.money-local-service.main.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/money-local-service/fastcampus-pay.money-local-service.main.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/money-service/fastcampus-pay.money-service.main.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/money-service/fastcampus-pay.money-service.main.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/payment-service/fastcampus-pay.payment-service.main.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/payment-service/fastcampus-pay.payment-service.main.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/remittance-service/fastcampus-pay.remittance-service.main.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/remittance-service/fastcampus-pay.remittance-service.main.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/settlement-service/fastcampus-pay.settlement-service.main.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/settlement-service/fastcampus-pay.settlement-service.main.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": ".idea/uiDesigner.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Palette2\">\n    <group name=\"Swing\">\n      <item class=\"com.intellij.uiDesigner.HSpacer\" tooltip-text=\"Horizontal Spacer\" icon=\"/com/intellij/uiDesigner/icons/hspacer.svg\" removable=\"false\" auto-create-binding=\"false\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"1\" hsize-policy=\"6\" anchor=\"0\" fill=\"1\" />\n      </item>\n      <item class=\"com.intellij.uiDesigner.VSpacer\" tooltip-text=\"Vertical Spacer\" icon=\"/com/intellij/uiDesigner/icons/vspacer.svg\" removable=\"false\" auto-create-binding=\"false\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"6\" hsize-policy=\"1\" anchor=\"0\" fill=\"2\" />\n      </item>\n      <item class=\"javax.swing.JPanel\" icon=\"/com/intellij/uiDesigner/icons/panel.svg\" removable=\"false\" auto-create-binding=\"false\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"3\" hsize-policy=\"3\" anchor=\"0\" fill=\"3\" />\n      </item>\n      <item class=\"javax.swing.JScrollPane\" icon=\"/com/intellij/uiDesigner/icons/scrollPane.svg\" removable=\"false\" auto-create-binding=\"false\" can-attach-label=\"true\">\n        <default-constraints vsize-policy=\"7\" hsize-policy=\"7\" anchor=\"0\" fill=\"3\" />\n      </item>\n      <item class=\"javax.swing.JButton\" icon=\"/com/intellij/uiDesigner/icons/button.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"3\" anchor=\"0\" fill=\"1\" />\n        <initial-values>\n          <property name=\"text\" value=\"Button\" />\n        </initial-values>\n      </item>\n      <item class=\"javax.swing.JRadioButton\" icon=\"/com/intellij/uiDesigner/icons/radioButton.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"3\" anchor=\"8\" fill=\"0\" />\n        <initial-values>\n          <property name=\"text\" value=\"RadioButton\" />\n        </initial-values>\n      </item>\n      <item class=\"javax.swing.JCheckBox\" icon=\"/com/intellij/uiDesigner/icons/checkBox.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"3\" anchor=\"8\" fill=\"0\" />\n        <initial-values>\n          <property name=\"text\" value=\"CheckBox\" />\n        </initial-values>\n      </item>\n      <item class=\"javax.swing.JLabel\" icon=\"/com/intellij/uiDesigner/icons/label.svg\" removable=\"false\" auto-create-binding=\"false\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"0\" anchor=\"8\" fill=\"0\" />\n        <initial-values>\n          <property name=\"text\" value=\"Label\" />\n        </initial-values>\n      </item>\n      <item class=\"javax.swing.JTextField\" icon=\"/com/intellij/uiDesigner/icons/textField.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"true\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"6\" anchor=\"8\" fill=\"1\">\n          <preferred-size width=\"150\" height=\"-1\" />\n        </default-constraints>\n      </item>\n      <item class=\"javax.swing.JPasswordField\" icon=\"/com/intellij/uiDesigner/icons/passwordField.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"true\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"6\" anchor=\"8\" fill=\"1\">\n          <preferred-size width=\"150\" height=\"-1\" />\n        </default-constraints>\n      </item>\n      <item class=\"javax.swing.JFormattedTextField\" icon=\"/com/intellij/uiDesigner/icons/formattedTextField.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"true\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"6\" anchor=\"8\" fill=\"1\">\n          <preferred-size width=\"150\" height=\"-1\" />\n        </default-constraints>\n      </item>\n      <item class=\"javax.swing.JTextArea\" icon=\"/com/intellij/uiDesigner/icons/textArea.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"true\">\n        <default-constraints vsize-policy=\"6\" hsize-policy=\"6\" anchor=\"0\" fill=\"3\">\n          <preferred-size width=\"150\" height=\"50\" />\n        </default-constraints>\n      </item>\n      <item class=\"javax.swing.JTextPane\" icon=\"/com/intellij/uiDesigner/icons/textPane.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"true\">\n        <default-constraints vsize-policy=\"6\" hsize-policy=\"6\" anchor=\"0\" fill=\"3\">\n          <preferred-size width=\"150\" height=\"50\" />\n        </default-constraints>\n      </item>\n      <item class=\"javax.swing.JEditorPane\" icon=\"/com/intellij/uiDesigner/icons/editorPane.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"true\">\n        <default-constraints vsize-policy=\"6\" hsize-policy=\"6\" anchor=\"0\" fill=\"3\">\n          <preferred-size width=\"150\" height=\"50\" />\n        </default-constraints>\n      </item>\n      <item class=\"javax.swing.JComboBox\" icon=\"/com/intellij/uiDesigner/icons/comboBox.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"true\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"2\" anchor=\"8\" fill=\"1\" />\n      </item>\n      <item class=\"javax.swing.JTable\" icon=\"/com/intellij/uiDesigner/icons/table.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"6\" hsize-policy=\"6\" anchor=\"0\" fill=\"3\">\n          <preferred-size width=\"150\" height=\"50\" />\n        </default-constraints>\n      </item>\n      <item class=\"javax.swing.JList\" icon=\"/com/intellij/uiDesigner/icons/list.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"6\" hsize-policy=\"2\" anchor=\"0\" fill=\"3\">\n          <preferred-size width=\"150\" height=\"50\" />\n        </default-constraints>\n      </item>\n      <item class=\"javax.swing.JTree\" icon=\"/com/intellij/uiDesigner/icons/tree.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"6\" hsize-policy=\"6\" anchor=\"0\" fill=\"3\">\n          <preferred-size width=\"150\" height=\"50\" />\n        </default-constraints>\n      </item>\n      <item class=\"javax.swing.JTabbedPane\" icon=\"/com/intellij/uiDesigner/icons/tabbedPane.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"3\" hsize-policy=\"3\" anchor=\"0\" fill=\"3\">\n          <preferred-size width=\"200\" height=\"200\" />\n        </default-constraints>\n      </item>\n      <item class=\"javax.swing.JSplitPane\" icon=\"/com/intellij/uiDesigner/icons/splitPane.svg\" removable=\"false\" auto-create-binding=\"false\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"3\" hsize-policy=\"3\" anchor=\"0\" fill=\"3\">\n          <preferred-size width=\"200\" height=\"200\" />\n        </default-constraints>\n      </item>\n      <item class=\"javax.swing.JSpinner\" icon=\"/com/intellij/uiDesigner/icons/spinner.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"true\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"6\" anchor=\"8\" fill=\"1\" />\n      </item>\n      <item class=\"javax.swing.JSlider\" icon=\"/com/intellij/uiDesigner/icons/slider.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"6\" anchor=\"8\" fill=\"1\" />\n      </item>\n      <item class=\"javax.swing.JSeparator\" icon=\"/com/intellij/uiDesigner/icons/separator.svg\" removable=\"false\" auto-create-binding=\"false\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"6\" hsize-policy=\"6\" anchor=\"0\" fill=\"3\" />\n      </item>\n      <item class=\"javax.swing.JProgressBar\" icon=\"/com/intellij/uiDesigner/icons/progressbar.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"6\" anchor=\"0\" fill=\"1\" />\n      </item>\n      <item class=\"javax.swing.JToolBar\" icon=\"/com/intellij/uiDesigner/icons/toolbar.svg\" removable=\"false\" auto-create-binding=\"false\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"6\" anchor=\"0\" fill=\"1\">\n          <preferred-size width=\"-1\" height=\"20\" />\n        </default-constraints>\n      </item>\n      <item class=\"javax.swing.JToolBar$Separator\" icon=\"/com/intellij/uiDesigner/icons/toolbarSeparator.svg\" removable=\"false\" auto-create-binding=\"false\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"0\" hsize-policy=\"0\" anchor=\"0\" fill=\"1\" />\n      </item>\n      <item class=\"javax.swing.JScrollBar\" icon=\"/com/intellij/uiDesigner/icons/scrollbar.svg\" removable=\"false\" auto-create-binding=\"true\" can-attach-label=\"false\">\n        <default-constraints vsize-policy=\"6\" hsize-policy=\"0\" anchor=\"0\" fill=\"2\" />\n      </item>\n    </group>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": "Dockerfile",
    "content": "FROM openjdk:11-slim-stretch\nEXPOSE 8080\nARG JAR_FILE\nCOPY ${JAR_FILE} app.jar\n#\"-Djava.security.egd=file:/dev/./urandom\",\n#\"-Dspring.profiles.active=prod\",\nENTRYPOINT [\"java\", \"-jar\", \"/app.jar\"]"
  },
  {
    "path": "README.md",
    "content": "\n\n# FastCampus-Pay Project Overview\n![Overall Architecture](md_resource/Overall_Architecture_Image.png)\n\n일반적인 간편결제 도메인을 주제로, MSA 를 중점적으로 학습하기 위한 교육용 프로젝트입니다.\n\n회원(Membership), 뱅킹(Banking), 머니(Money), 송금(Remittance), 결제(Payment), 정산(Settlement) 6개의 서비스로 구성되어 있으며, 각각의 독립적인 프로젝트로 구성되어 있어요.   \n각 서비스에서는 기본적인 기능을 먼저 Hexagonal Architecture 로 구현하고, 일부 기능들에 EDA, CQRS, Event Sourcing, Saga Pattern 등을 적용하며 진행해 보아요.\n\n기본적으로 Springboot 와 Java 11 을 기준으로 프로젝트를 구성하고, EDA 구현을 위해서 Axon Framework v4.6.0 을 사용해요.\n로깅 파이프라인은 따로 구성하진 않았지만, kafka 의 실습을 목적으로 하는 간단한 로깅 파이프라인을 구성할 예정이에요.\n\n실제 간편 결제 도메인 시스템과는 복잡성 측면에서 차이가 있지만, 간단한 버전을 기준으로 MSA 를 구성하고, 각 서비스의 기능을 구현하며, EDA 를 적용해 보는 것을 목표로 진행해요.\n아래 내용들은 수업 진행 방향 및 실습 진행 속도에 따라 유동적일 수 있어요.\n\n## Overall Architecture for Monolithic System\n![Monolithic System](md_resource/Overview2.png)\n\n## Overall Architecture for MSA\n![MSA System](md_resource/Overview1.png)\n\n## Membership Service (Part. 2, 3, 6, 7)\n고객의 회원 가입, 회원 정보 변경, 회원 정보 조회 등의 기능을 제공하는 서비스입니다.\n- Part 2.\n  - Hexagonal Architecture 를 활용하여 기본적인 Membership Service 를 구현 (회원 가입)\n- Part 3.\n  - gradle build tool 을 이용하여 Docker build 연동. 추가적인 Membership Service 를 구현 (회원 정보 변경)\n- Part 6.\n  - Axon Framework 를 이용하여 Event Driven Architecture 로 리팩토링. \n  - 고객 정보가 변경될 경우, 이벤트를 발행하고, 이를 구독하는 Money 서비스 에서 고객의 머니 정보를 변경하는 CQRS 패턴 구현 (with/ AWS DynamoDB)\n- Part 7.\n  -  보안을 위해 JWT 를 이용한 간단한 API 인증 구현\n\n### API Lists\n- registerMembership\n- updateMembershipByMemberId (CQRS Trigger)\n- findMembershipByMemberId\n- loginByMembershipIdPw\n- authByToken\n\n#### Using Stack\n  - Spring Boot, Java 11, Spring Data JPA, H2, Mysql, Lombok, Gradle, JWT, Axon Framework, Docker, Docker Compose, AWS DynamoDB\n\n### Sequence Diagram Example (회원 가입, JWT 토큰 인증 프로세스) \n![Membership Sequence Example](md_resource/Membership_Sequence_Example.png)\n\n## Banking Service (Part. 3)\n고객의 계좌 정보 등록, 등록된 계좌 정보 조회, 입/출금, 거래내역 조회 등의 기능을 제공하는 서비스입니다.\n- Part 3.\n  - Hexagonal Architecture 를 활용하여 기본적인 Banking Service 를 구현 (가상의 법인 계좌 및 고객 계좌 정보 등록, 은행으로 입/출금 요청하기)\n  \n### API Lists\n- registerBankingAccount\n- requestTransferMoneyToBank\n- findRegisteredBankingAccountByMemberId\n- findTransferMoneyInfoByMemberId\n- findTransferMoneyInfoByBankingId\n\n#### Using Stack\n  - Spring Boot, Java 11, Spring Data JPA, H2, Mysql, Lombok, Gradle, JWT, Axon Framework, Docker, Docker Compose\n\n### Sequence Diagram Example (입/출금 요청 프로세스)\n![Banking Sequence Example](md_resource/Banking_Sequence_Example.png)\n\n## Money Service (Part. 3, 4, 5, 6)\n고객의 충전 잔액(머니) CRUD, 충전 내역 조회 등의 기능을 제공하는 서비스입니다.\n- Part 3.\n  - Hexagonal Architecture 를 활용하여 Membership 서비스 및 Banking 서비스를 이용하는 충전 잔액(머니)을 충전하는 기능 구현\n  - 충전 내역 조회 기능 구현\n- Part 4.\n  - kafka 을 이용한 간단 로깅 파이프라인 적용 (kafka 를 이용한 로깅 파이프라인은 실습을 위한 간단한 구현이며, 실제로는 ELK/EFK 등을 이용한 로깅 파이프라인을 구성하는 것을 추천합니다.)\n  - 충전 잔액(머니) 충전 프로세스를 Async 방식으로 구현하고, Polling 을 통한 결과 조회 방식 구현 \n- Part 5.\n  - 충전 잔액(머니)을 충전하는 기능은 Axon Framework 를 이용하여 Saga Pattern 적용 및 리팩토링\n- Part 6.\n  - Axon Framework 를 이용하여 Event Driven Architecture 로 리팩토링.\n  - Membership 서비스로부터 고객 정보 변경 이벤트를 수신하고, 이를 기반으로 CQRS 패턴을 구현 (with/ AWS DynamoDB)\n    - \"지역별 고객들의 잔액 총합 View\" 을 얻어오려면?\n    \n### API Lists\n- rechargeMoneyByMemberId\n- findMoneyInfoByRechargeMoneyId\n- findMoneyHistoryByMemberId\n- transferMoneyBetweenMembers\n\n### MoneyLocal Service (for CQRS)\n- calculateMoneySumByLocal \n- MembershipUpdate (EventHandler)\n\n#### Using Stack\n- Spring Boot, Java 11, Spring Data JPA, H2, Mysql, Lombok, Gradle, JWT, Axon Framework, Docker, Docker Compose, Kafka, Kafka-ui, Zookeeper, AWS DynamoDB\n\n### Sequence Diagram Example (충전 잔액(머니) 충전 프로세스)\n![Money_Sequence_Example](md_resource/Money_Sequence_Example.png)\n\n## Remittance Service (Part. 4, 5, 6)\n고객 간 송금 기능 및 송금 내역 정보 조회 등의 기능을 제공하는 서비스입니다.\n- Part 4.\n  - Hexagonal Architecture 를 활용하여 Membership 서비스, Banking 서비스, Money 서비스를 이용하는 고객 간 혹은 계좌 송금 기능 구현\n- Part 5.\n  - 고객 간 송금하는 기능은 기능은 Axon Framework 를 이용하여 Saga Pattern 적용 및 리팩토링\n- Part 6.\n  - 특정 송금 건을 기준으로, 머니의 충전 내역을 조회해보는 기능 구현을 위해 API Aggregation Pattern 적용\n\n### API Lists\n- requestRemittance\n- findRemittanceInfoByRemittanceId\n- findRemittanceHistoryByMemberId\n- findMoneyTransferringByRemittanceId (API Aggregation, Banking + Money)\n\n#### Using Stack\n- Spring Boot, Java 11, Spring Data JPA, H2, Mysql, Lombok, Gradle, JWT, Axon Framework, Docker, Docker Compose, AWS DynamoDB\n\n### Sequence Diagram Example (송금 프로세스)\n![Remittance_Sequence_Example](md_resource/Remittance_Sequence_Example.png)\n\n## Payment Service (Part. 5)\n가맹점에서 Fastcampus Pay 를 이용한 간편 결제 및 결제 내역 조회 등의 기능을 제공하는 서비스입니다. \n- Part 5.\n  - Hexagonal Architecture 를 활용하여 Membership 서비스, Money 서비스를 이용하는 가맹점에서의 결제 기능 구현\n  - Membership Service 의 가맹점주 기능 확장 \n\n### API Lists\n- requestPaymentAtMerchant\n- findPaymentByPaymentId\n- listPaymentsByPeriod\n\n#### Using Stack\n- Spring Boot, Java 11, Spring Data JPA,  Mysql, Lombok, Gradle, Axon Framework, Docker, Docker Compose\n\n### Sequence Diagram Example (결제 프로세스)\n![Payment_Sequence_Example](md_resource/Payment_Sequence_Example.png)\n\n## Settlement Service (Part. 6)\n완료된 결제 내역을 기준으로 가맹점에 정산된 금액을 입금하고, 수수료 수취를 위한 기능을 제공하는 서비스입니다.\n- Part 6.\n  - Hexagonal Architecture 를 활용하여 Payment 서비스를 이용하는 기간별 정산 기능 구현.\n  - 수수료 수취 기능 구현, 가맹점주 계좌로 입금 기능 구현.\n\n### API Lists\n- startSettlementByPeriod \n\n#### Using Stack\n- Spring Boot, Java 11, Spring Data JPA, Mysql, Lombok, Gradle, JWT, Axon Framework, Docker, Docker Compose\n \n### Sequence Diagram Example (정산 프로세스)\n![Settlement_Sequence_Example](md_resource/Settlement_Sequence_Example.png)\n\n## Execution\n```\n./gradlew docker\ndocker-compose up -d\n```\n\n## Service Endpoint & Swagger UI\n- Membership Service\n  - http://localhost:8081/membership/\n  - http://localhost:8081/swagger-ui.html\n- Banking Service\n  - http://localhost:8082/banking/\n  - http://localhost:8082/swagger-ui.html\n- Money Service\n  - http://localhost:8083/money/\n  - http://localhost:8083/swagger-ui.html\n- Money Local Service (CQRS View Service)\n  - http://localhost:8084/money-local/\n  - http://localhost:8084/swagger-ui.html\n- Remittance Service\n  - http://localhost:8085/remittance/\n  - http://localhost:8085/swagger-ui.html\n- Payment Service\n  - http://localhost:8086/payment/\n  - http://localhost:8086/swagger-ui.html\n- Settlement Service\n  - http://localhost:8087/settlement/\n  - http://localhost:8087/swagger-ui.html\n  \n- Mysql\n  - http://localhost:3306\n  - root password: rootpassword\n  - database: fastcampus_pay\n  - User/PW : mysqluser / mysqlpw\n- Kafka UI\n  - http://localhost:8989\n- Axon Server Dashboard\n  - http://localhost:8024\n\n\n\n\n## Trouble Shooting\n### 1. gradle build(docker build) 시, dockerPrepare 단계에서 error 가 발생하는 경우 \n```\n./gradlew --stop\n./gradlew docker\n```\n\n## Sample Screenshots\n![Sample1](md_resource/sample_docker.png)\n\n![Sample2](md_resource/sample_swagger.png)\n\n![Sample3](md_resource/sample_kafkaui.png)\n\n![Sample4](md_resource/sample_AxonServer.png)\n\n![Sample5](md_resource/sample_mysql.png)\n\n\n\n"
  },
  {
    "path": "banking-service/build.gradle",
    "content": "plugins {\n    id 'com.palantir.docker' version '0.25.0'\n}\n\next{\n    axonVersion = \"4.6.0\"\n}\n\ngroup = 'com.fastcampuspay.banking'\nversion = '0.0.1-SNAPSHOT'\n\ndependencies {\n    implementation 'org.springframework.boot:spring-boot-starter-validation'\n    implementation 'org.springframework.boot:spring-boot-starter-actuator'\n    implementation 'org.springframework.boot:spring-boot-starter-web'\n    implementation group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'\n    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'\n    implementation group: 'org.axonframework', name: 'axon-configuration', version: \"$axonVersion\"\n    implementation group: 'org.axonframework', name: 'axon-spring-boot-starter', version: \"$axonVersion\"\n    implementation 'org.jetbrains:annotations:23.0.0'\n\n    implementation project(path: ':common')\n    // runtimeOnly 'com.h2database:h2'\n    runtimeOnly 'mysql:mysql-connector-java'\n}\n\ndocker {\n    println(tasks.bootJar.outputs.files)\n    name rootProject.name+'-'+project.name + \":\" + version\n    dockerfile file('../Dockerfile')\n    files tasks.bootJar.outputs.files\n    buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singleFile.name])\n}"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/BankingApplication.java",
    "content": "package com.fastcampuspay.banking;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class BankingApplication {\n\n  public static void main(String[] args) {\n    SpringApplication.run(BankingApplication.class, args);\n  }\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/BankingConfiguration.java",
    "content": "package com.fastcampuspay.banking;\n\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@EnableConfigurationProperties(BankingConfigurationProperties.class)\npublic class BankingConfiguration {\n\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/BankingConfigurationProperties.java",
    "content": "package com.fastcampuspay.banking;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n@Data\n@ConfigurationProperties(prefix = \"banking\")\npublic class BankingConfigurationProperties {\n\n  private long transferThreshold = Long.MAX_VALUE;\n\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/SwaggerConfig.java",
    "content": "package com.fastcampuspay.banking;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport springfox.documentation.builders.ApiInfoBuilder;\nimport springfox.documentation.builders.PathSelectors;\nimport springfox.documentation.builders.RequestHandlerSelectors;\nimport springfox.documentation.service.ApiInfo;\nimport springfox.documentation.spi.DocumentationType;\nimport springfox.documentation.spring.web.plugins.Docket;\nimport springfox.documentation.swagger2.annotations.EnableSwagger2;\n\n@Configuration\n@EnableSwagger2\npublic class SwaggerConfig {\n\n    @Bean\n    public Docket restAPI() {\n        return new Docket(DocumentationType.SWAGGER_2)\n                .apiInfo(apiInfo())\n                .select()\n                .apis(RequestHandlerSelectors.basePackage(\"com.fastcampuspay.banking\"))\n                .paths(PathSelectors.any())\n                .build();\n    }\n\n    private ApiInfo apiInfo() {\n        return new ApiInfoBuilder()\n                .build();\n    }\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/adapter/in/web/FindBankingAccountInfoController.java",
    "content": "package com.fastcampuspay.banking.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass FindBankingAccountInfoController {\n\n\t// private final RegisterBankingAccountUseCase registerBankingAccountUseCase;\n\n\t@GetMapping(path = \"/banking/registered-banking-account/\")\n\tResponseEntity<Object>  findRegisteredBankingAccountByMemberId(){\n\t\t// RegisterMembershipRequest\n\t\t// name, address, email\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n\t@GetMapping(path = \"/banking/transfer-money/\")\n\tResponseEntity<Object>  findTransferMoneyInfoByMemberId(){\n\t\t// RegisterMembershipRequest\n\t\t// name, address, email\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n\t@GetMapping(path = \"/banking/transfer-money-info/\")\n\tResponseEntity<Object>  findTransferMoneyInfoByBankingId(){\n\t\t// RegisterMembershipRequest\n\t\t// name, address, email\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/adapter/in/web/RegisterBankingAccountInfoController.java",
    "content": "package com.fastcampuspay.banking.adapter.in.web;\n\nimport com.fastcampuspay.banking.application.port.in.RegisterBankingAccountCommand;\nimport com.fastcampuspay.banking.application.port.in.RegisterBankingAccountUseCase;\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass RegisterBankingAccountInfoController {\n\n\tprivate final RegisterBankingAccountUseCase registerBankingAccountUseCase;\n\n\t@PostMapping(path = \"/banking/account/\")\n\tvoid registerBankingAccount(@RequestBody RegisterBankingAccountInfoRequest request){\n\t\t// RegisterMembershipRequest\n\t\t// name, address, email\n\t\tRegisterBankingAccountCommand command = RegisterBankingAccountCommand.builder()\n\t\t\t\t.name(request.getName())\n\t\t\t\t.address(request.getAddress())\n\t\t\t\t.email(request.getEmail())\n\t\t\t\t.build();\n\t\tregisterBankingAccountUseCase.registerBankingAccount(command);\n\t}\n\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/adapter/in/web/RegisterBankingAccountInfoRequest.java",
    "content": "package com.fastcampuspay.banking.adapter.in.web;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok.Setter;\n\n@Getter\n@Setter\n@AllArgsConstructor\n@NoArgsConstructor\npublic class RegisterBankingAccountInfoRequest {\n\n    private String name;\n\n    private String address;\n\n    private String email;\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/adapter/in/web/RequestTransferMoneyController.java",
    "content": "package com.fastcampuspay.banking.adapter.in.web;\n\nimport com.fastcampuspay.banking.domain.BankingAccountRegisterInfo;\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass RequestTransferMoneyController {\n\n\t// private final RegisterBankingAccountUseCase registerBankingAccountUseCase;\n\n\t@PostMapping(path = \"/banking/transfer-money\")\n\tResponseEntity<BankingAccountRegisterInfo> requestTransferMoneyToBank(){\n\t\t// RegisterMembershipRequest\n\t\t// name, address, email\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/adapter/out/persistence/BankingAccountPersistenceAdapter.java",
    "content": "package com.fastcampuspay.banking.adapter.out.persistence;\n\nimport com.fastcampuspay.banking.application.port.out.RegisterBankingAccountPort;\nimport com.fastcampuspay.banking.domain.BankingAccountRegisterInfo;\nimport com.fastcampuspay.common.PersistenceAdapter;\nimport lombok.RequiredArgsConstructor;\n\n@RequiredArgsConstructor\n@PersistenceAdapter\nclass BankingAccountPersistenceAdapter implements RegisterBankingAccountPort {\n\n\tprivate final SpringDataBankingAccountRegisterInfoRepository bankingAccountRepository;\n\t private final BankingAccountRegisterInfoMapper bankingAccountRegisterInfoMapper;\n\n\tprivate Long orZero(Long value){\n\t\treturn value == null ? 0L : value;\n\t}\n\n\n\t@Override\n\tpublic void registerBankingAccount(BankingAccountRegisterInfo.BankingAccountRegisterInfoId bankingAccountRegisterInfoId) {\n\t\tbankingAccountRepository.save(\n\t\t\t\tnew BankingAccountRegisterInfoJpaEntity(\n\t\t\t\t\t\tLong.parseLong(bankingAccountRegisterInfoId.getBankingAccountRegisterInfoId())\n\t\t\t\t)\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/adapter/out/persistence/BankingAccountRegisterInfoJpaEntity.java",
    "content": "package com.fastcampuspay.banking.adapter.out.persistence;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\n\n@Entity\n@Table(name = \"banking_account_register_info\")\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\nclass BankingAccountRegisterInfoJpaEntity {\n\n\t@Id\n\t@GeneratedValue\n\tprivate Long registerInfoId;\n\n//\tprivate String name;\n//\n//\tprivate String address;\n//\n//\tprivate String email;\n//\n//\tprivate boolean isValid;\n\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/adapter/out/persistence/BankingAccountRegisterInfoMapper.java",
    "content": "package com.fastcampuspay.banking.adapter.out.persistence;\n\nimport com.fastcampuspay.banking.domain.BankingAccountRegisterInfo;\nimport org.springframework.stereotype.Component;\n\n@Component\nclass BankingAccountRegisterInfoMapper {\n\tBankingAccountRegisterInfo mapToDomainEntity(\n\t\t\tBankingAccountRegisterInfoJpaEntity bankingAccountRegisterInfoJpaEntity) {\n\t\tSystem.out.println(bankingAccountRegisterInfoJpaEntity.toString());\n\t\treturn BankingAccountRegisterInfo.generateBankingAccountRegisterInfo(\n\t\t\t\tnew BankingAccountRegisterInfo.BankingAccountRegisterInfoId(bankingAccountRegisterInfoJpaEntity.getRegisterInfoId()+\"\")\n\t\t\t\t);\n\t}\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/adapter/out/persistence/SpringDataBankingAccountRegisterInfoRepository.java",
    "content": "package com.fastcampuspay.banking.adapter.out.persistence;\n\nimport org.springframework.data.jpa.repository.JpaRepository;\n\ninterface SpringDataBankingAccountRegisterInfoRepository extends JpaRepository<BankingAccountRegisterInfoJpaEntity, Long> {\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/application/port/in/RegisterBankingAccountCommand.java",
    "content": "package com.fastcampuspay.banking.application.port.in;\n\n\nimport com.fastcampuspay.common.SelfValidating;\nimport lombok.Builder;\nimport lombok.EqualsAndHashCode;\nimport lombok.Value;\n\nimport javax.validation.constraints.NotNull;\n\n@Value\n@Builder\n@EqualsAndHashCode(callSuper = false)\npublic\nclass RegisterBankingAccountCommand extends SelfValidating<RegisterBankingAccountCommand> {\n\n    @NotNull\n    private final String name;\n\n    @NotNull\n    private final String email;\n\n    @NotNull\n    private final String address;\n\n    @NotNull\n    private final boolean isValid;\n\n    public RegisterBankingAccountCommand(String name, String email, String address, boolean isValid) {\n        this.name = name;\n        this.email = email;\n        this.address = address;\n        this.isValid = isValid;\n    }\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/application/port/in/RegisterBankingAccountUseCase.java",
    "content": "package com.fastcampuspay.banking.application.port.in;\n\npublic interface RegisterBankingAccountUseCase {\n\n\tvoid registerBankingAccount(RegisterBankingAccountCommand command);\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/application/port/out/RegisterBankingAccountPort.java",
    "content": "package com.fastcampuspay.banking.application.port.out;\n\n\nimport com.fastcampuspay.banking.domain.BankingAccountRegisterInfo;\n\npublic interface RegisterBankingAccountPort {\n\n\tvoid registerBankingAccount(\n\t\t\tBankingAccountRegisterInfo.BankingAccountRegisterInfoId bankingAccountRegisterInfoId\n\t);\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/application/service/RegisterBankingAccount.java",
    "content": "package com.fastcampuspay.banking.application.service;\n\nimport com.fastcampuspay.banking.application.port.in.RegisterBankingAccountCommand;\nimport com.fastcampuspay.banking.application.port.in.RegisterBankingAccountUseCase;\nimport com.fastcampuspay.banking.application.port.out.RegisterBankingAccountPort;\nimport com.fastcampuspay.banking.domain.BankingAccountRegisterInfo;\nimport com.fastcampuspay.common.UseCase;\nimport lombok.RequiredArgsConstructor;\n\nimport javax.transaction.Transactional;\n\n@RequiredArgsConstructor\n@UseCase\n@Transactional\npublic class RegisterBankingAccount implements RegisterBankingAccountUseCase {\n\n\tprivate final RegisterBankingAccountPort rport;\n\n\t@Override\n\tpublic void registerBankingAccount(RegisterBankingAccountCommand command) {\n\t\trport.registerBankingAccount(new BankingAccountRegisterInfo.BankingAccountRegisterInfoId(command.getEmail()));\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/domain/BankingAccountRegisterInfo.java",
    "content": "package com.fastcampuspay.banking.domain;\n\nimport lombok.AccessLevel;\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.Value;\n\n@AllArgsConstructor(access = AccessLevel.PRIVATE)\npublic class BankingAccountRegisterInfo {\n\t/**\n\t * The baseline balance of the account. This was the balance of the account before the first\n\t * activity in the activityWindow.\n\t */\n\t@Getter private final String bankingAccountRegisterInfoId;\n//\t@Getter private final String name;\n//\t@Getter private final String email;\n//\t@Getter private final String address;\n//\t@Getter private final boolean isValid;\n\n\tpublic static BankingAccountRegisterInfo generateBankingAccountRegisterInfo(\n\t\t\tBankingAccountRegisterInfoId bankingAccountRegisterInfoId) {\n\t\treturn new BankingAccountRegisterInfo(\n\t\t\t\tbankingAccountRegisterInfoId.bankingAccountRegisterInfoId\n\t\t);\n\t}\n\n\t@Value\n\tpublic static class BankingAccountRegisterInfoId {\n\t\tpublic BankingAccountRegisterInfoId(String value) {\n\t\t\tthis.bankingAccountRegisterInfoId = value;\n\t\t}\n\t\tString bankingAccountRegisterInfoId ;\n\t}\n}\n"
  },
  {
    "path": "banking-service/src/main/java/com/fastcampuspay/banking/domain/TransferMoney.java",
    "content": "package com.fastcampuspay.banking.domain;\n\nimport lombok.AccessLevel;\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.Value;\n\n@AllArgsConstructor(access = AccessLevel.PRIVATE)\npublic class TransferMoney {\n\t/**\n\t * The baseline balance of the account. This was the balance of the account before the first\n\t * activity in the activityWindow.\n\t */\n\t@Getter private final String transferMoneyId;\n\n\tpublic static TransferMoney generateTransferMoney(\n\t\t\tTransferMoneyId transferMoneyId) {\n\t\treturn new TransferMoney(\n\t\t\t\ttransferMoneyId.transferMoneyId\n\t\t);\n\t}\n\n\t@Value\n\tpublic static class TransferMoneyId {\n\t\tpublic TransferMoneyId(String value) {\n\t\t\tthis.transferMoneyId = value;\n\t\t}\n\t\tString transferMoneyId ;\n\t}\n}\n"
  },
  {
    "path": "build.gradle",
    "content": "buildscript {\n    dependencies {\n        classpath \"io.spring.gradle:dependency-management-plugin:0.5.1.RELEASE\"\n    }\n}\n\nplugins {\n    id 'org.springframework.boot' version '2.5.2'\n    id 'java'\n}\n\nsubprojects {\n    compileJava {\n        sourceCompatibility = 11\n        targetCompatibility = 11\n    }\n    apply plugin: 'java'\n    apply plugin: 'java-library'\n    apply plugin: 'org.springframework.boot'\n    apply plugin: 'io.spring.dependency-management'\n\n    repositories {\n        mavenCentral()\n    }\n\n    dependencies {\n        compileOnly 'org.projectlombok:lombok'\n        annotationProcessor 'org.projectlombok:lombok'\n        annotationProcessor \"org.springframework.boot:spring-boot-configuration-processor\"\n        implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'\n        implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'\n        testImplementation 'com.tngtech.archunit:archunit:1.0.1'\n        testImplementation 'org.springframework.boot:spring-boot-starter-test'\n    }\n    test {\n        useJUnitPlatform()\n        maxHeapSize = \"1024m\" //원하는 만큼 변경\n    }\n}\n\nbootRun {\n    enabled = false\n}\n\nbootJar {\n    enabled = false\n}\n\nbootBuildImage{\n    enabled = false\n}"
  },
  {
    "path": "common/build.gradle",
    "content": "\n\ngroup 'org.mypay.common'\n\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'\n    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'\n    implementation 'org.springframework.boot:spring-boot-starter-validation'\n\n}\n\ntest {\n    useJUnitPlatform()\n}"
  },
  {
    "path": "common/src/main/java/com/fastcampuspay/common/PersistenceAdapter.java",
    "content": "package com.fastcampuspay.common;\n\nimport org.springframework.core.annotation.AliasFor;\nimport org.springframework.stereotype.Component;\n\nimport java.lang.annotation.*;\n\n@Target({ElementType.TYPE})\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\n@Component\npublic @interface PersistenceAdapter {\n\n  /**\n   * The value may indicate a suggestion for a logical component name,\n   * to be turned into a Spring bean in case of an autodetected component.\n   * @return the suggested component name, if any (or empty String otherwise)\n   */\n  @AliasFor(annotation = Component.class)\n  String value() default \"\";\n\n}\n"
  },
  {
    "path": "common/src/main/java/com/fastcampuspay/common/SelfValidating.java",
    "content": "package com.fastcampuspay.common;\n\nimport javax.validation.*;\nimport java.util.Set;\n\npublic abstract class SelfValidating<T> {\n\n  private Validator validator;\n\n  public SelfValidating() {\n    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();\n    validator = factory.getValidator();\n  }\n\n  /**\n   * Evaluates all Bean Validations on the attributes of this\n   * instance.\n   */\n  protected void validateSelf() {\n    Set<ConstraintViolation<T>> violations = validator.validate((T) this);\n    if (!violations.isEmpty()) {\n      throw new ConstraintViolationException(violations);\n    }\n  }\n}\n"
  },
  {
    "path": "common/src/main/java/com/fastcampuspay/common/UseCase.java",
    "content": "package com.fastcampuspay.common;\n\nimport org.springframework.core.annotation.AliasFor;\nimport org.springframework.stereotype.Component;\n\nimport java.lang.annotation.*;\n\n@Target({ElementType.TYPE})\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\n@Component\npublic @interface UseCase {\n\n  /**\n   * The value may indicate a suggestion for a logical component name,\n   * to be turned into a Spring bean in case of an autodetected component.\n   * @return the suggested component name, if any (or empty String otherwise)\n   */\n  @AliasFor(annotation = Component.class)\n  String value() default \"\";\n\n}\n"
  },
  {
    "path": "common/src/main/java/com/fastcampuspay/common/WebAdapter.java",
    "content": "package com.fastcampuspay.common;\n\nimport org.springframework.core.annotation.AliasFor;\nimport org.springframework.stereotype.Component;\n\nimport java.lang.annotation.*;\n\n@Target({ElementType.TYPE})\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\n@Component\npublic @interface WebAdapter {\n\n  /**\n   * The value may indicate a suggestion for a logical component name,\n   * to be turned into a Spring bean in case of an autodetected component.\n   * @return the suggested component name, if any (or empty String otherwise)\n   */\n  @AliasFor(annotation = Component.class)\n  String value() default \"\";\n\n}\n"
  },
  {
    "path": "common/src/main/java/com/fastcampuspay/common/events/RegisterAccountEvent.java",
    "content": "package com.fastcampuspay.common.events;\n\nimport java.util.Objects;\n\npublic class RegisterAccountEvent {\n    private final String accountId;\n\n    public RegisterAccountEvent(){\n        this.accountId = \"0000\";\n    }\n    public RegisterAccountEvent(String accountId) {\n        this.accountId = accountId;\n    }\n\n    public String getAccountId() {\n        return accountId;\n    }\n\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) {\n            return true;\n        }\n        if (o == null || getClass() != o.getClass()) {\n            return false;\n        }\n        RegisterAccountEvent that = (RegisterAccountEvent) o;\n        return Objects.equals(accountId, that.accountId);\n    }\n\n    @Override\n    public int hashCode() {\n        return Objects.hash(accountId);\n    }\n\n    @Override\n    public String toString() {\n        return \"OrderCreatedEvent{\" + \"orderId='\" + accountId + '\\'' + '}';\n    }\n\n\n}\n"
  },
  {
    "path": "db/conf.d/my.cnf",
    "content": ""
  },
  {
    "path": "db/initdb.d/create_table.sql",
    "content": "CREATE DATABASE IF NOT EXISTS fastcampus_pay;\nUSE fastcampus_pay;\n\n-- for Axon Framework (for Mismatching of Axon and Mysql)\ncreate table IF NOT EXISTS dead_letter_entry (\n   dead_letter_id varchar(255) not null,\n   cause_message varchar(255),\n   cause_type varchar(255),\n   diagnostics longblob,\n   enqueued_at datetime not null,\n   `index` bigint not null,\n   last_touched datetime,\n   aggregate_identifier varchar(255),\n   event_identifier varchar(255) not null,\n   message_type varchar(255) not null,\n   meta_data longblob, payload longblob not null,\n   payload_revision varchar(255),\n   payload_type varchar(255) not null,\n   sequence_number bigint,\n   time_stamp varchar(255) not null,\n   token longblob, token_type varchar(255),\n   type varchar(255),\n   processing_group varchar(255) not null,\n   processing_started datetime,\n   sequence_identifier varchar(255) not null,\n   primary key (dead_letter_id)\n) engine=InnoDB\n"
  },
  {
    "path": "db/initdb.d/load_data.sql",
    "content": ""
  },
  {
    "path": "docker-compose.yaml",
    "content": "version: '3'\nservices:\n  zookeeper:\n    image: 'arm64v8/zookeeper:3.8'\n    networks:\n      - fastcampuspay_network\n    ports:\n      - '2181:2181'\n    environment:\n      - ALLOW_ANONYMOUS_LOGIN=yes\n      - ZOO_TLS_CLIENT_AUTH=none\n      - ZOO_TLS_QUORUM_CLIENT_AUTH=none\n\n  kafka:\n    image: 'bitnami/kafka:3.4.0'\n    networks:\n      - fastcampuspay_network\n    ports:\n      - '9092:9092'\n    environment:\n      - KAFKA_BROKER_ID=1\n      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181\n      - ALLOW_PLAINTEXT_LISTENER=yes\n      - KAFKA_CFG_LISTENERS=LC://kafka:29092,LX://kafka:9092\n      - KAFKA_CFG_ADVERTISED_LISTENERS=LC://kafka:29092,LX://${DOCKER_HOST_IP:-localhost}:9092\n      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=LC:PLAINTEXT,LX:PLAINTEXT\n      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=LC\n    depends_on:\n      - zookeeper\n\n  kafka-ui:\n    image: provectuslabs/kafka-ui\n    container_name: kafka-ui\n    networks:\n      - fastcampuspay_network\n    ports:\n      - \"8989:8080\"\n    restart: always\n    depends_on:\n      - kafka\n      - zookeeper\n    environment:\n      - KAFKA_CLUSTERS_0_NAME=local\n      - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:29092\n      - KAFKA_CLUSTERS_0_ZOOKEEPER=zookeeper:2181\n\n  mysql:\n    image: mysql:8.0\n    networks:\n      - fastcampuspay_network\n    volumes:\n      - ./db/conf.d:/etc/mysql/conf.d\n      - ./db/data:/var/lib/mysql\n      - ./db/initdb.d:/docker-entrypoint-initdb.d\n    env_file: .env\n    ports:\n      - \"3306:3306\"\n    environment:\n      - TZ=Asia/Seoul\n      - MYSQL_ROOT_PASSWORD=rootpassword\n      - MYSQL_USER=mysqluser\n      - MYSQL_PASSWORD=mysqlpw\n\n  axon-server:\n    container_name: axon-server\n    image: axoniq/axonserver:4.6.3-jdk-11-dev\n    networks:\n      - fastcampuspay_network\n    ports:\n      - \"8024:8024\"\n      - \"8124:8124\"\n    volumes:\n      - axonserver-data:/axonserver/data\n      - axonserver-events:/axonserver/events\n      - axonserver-config:/axonserver/config:ro\n\n  membership-service:\n    image: fastcampus-pay-membership-service:0.0.1-SNAPSHOT\n    networks:\n      - fastcampuspay_network\n    ports:\n      - \"8081:8080\"\n    depends_on:\n      - axon-server\n      - mysql\n    environment:\n      - AXON_AXONSERVER_SERVERS=axon-server:8124\n      - AXON_SERIALIZER_EVENTS=jackson\n      - AXON_SERIALIZER_MESSAGES=jackson\n      - AXON_SERIALIZER_GENERAL=xstream\n      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/fastcampus_pay?useSSL=false&allowPublicKeyRetrieval=true\n      - SPRING_DATASOURCE_USERNAME=mysqluser\n      - SPRING_DATASOURCE_PASSWORD=mysqlpw\n      - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.MySQL5InnoDBDialect\n      - SPRING_JPA_HIBERNATE_DDL_AUTO=update\n\n  banking-service:\n    image: fastcampus-pay-banking-service:0.0.1-SNAPSHOT\n    networks:\n      - fastcampuspay_network\n    ports:\n      - \"8082:8080\"\n    depends_on:\n      - axon-server\n      - mysql\n    environment:\n      - AXON_AXONSERVER_SERVERS=axon-server:8124\n      - AXON_SERIALIZER_EVENTS=jackson\n      - AXON_SERIALIZER_MESSAGES=jackson\n      - AXON_SERIALIZER_GENERAL=xstream\n      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/fastcampus_pay?useSSL=false&allowPublicKeyRetrieval=true\n      - SPRING_DATASOURCE_USERNAME=mysqluser\n      - SPRING_DATASOURCE_PASSWORD=mysqlpw\n      - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.MySQL5InnoDBDialect\n      - SPRING_JPA_HIBERNATE_DDL_AUTO=update\n\n  money-service:\n    image: fastcampus-pay-money-service:0.0.1-SNAPSHOT\n    networks:\n      - fastcampuspay_network\n    ports:\n      - \"8083:8080\"\n    depends_on:\n      - axon-server\n      - mysql\n    environment:\n      - AXON_AXONSERVER_SERVERS=axon-server:8124\n      - AXON_SERIALIZER_EVENTS=jackson\n      - AXON_SERIALIZER_MESSAGES=jackson\n      - AXON_SERIALIZER_GENERAL=xstream\n      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/fastcampus_pay?useSSL=false&allowPublicKeyRetrieval=true\n      - SPRING_DATASOURCE_USERNAME=mysqluser\n      - SPRING_DATASOURCE_PASSWORD=mysqlpw\n      - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.MySQL5InnoDBDialect\n      - SPRING_JPA_HIBERNATE_DDL_AUTO=update\n\n  money-local-service:\n    image: fastcampus-pay-money-local-service:0.0.1-SNAPSHOT\n    networks:\n      - fastcampuspay_network\n    ports:\n      - \"8084:8080\"\n    depends_on:\n      - axon-server\n      - mysql\n    environment:\n      - AXON_AXONSERVER_SERVERS=axon-server:8124\n      - AXON_SERIALIZER_EVENTS=jackson\n      - AXON_SERIALIZER_MESSAGES=jackson\n      - AXON_SERIALIZER_GENERAL=xstream\n      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/fastcampus_pay?useSSL=false&allowPublicKeyRetrieval=true\n      - SPRING_DATASOURCE_USERNAME=mysqluser\n      - SPRING_DATASOURCE_PASSWORD=mysqlpw\n      - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.MySQL5InnoDBDialect\n      - SPRING_JPA_HIBERNATE_DDL_AUTO=update\n\n  remittance-service:\n    image: fastcampus-pay-remittance-service:0.0.1-SNAPSHOT\n    networks:\n      - fastcampuspay_network\n    ports:\n      - \"8085:8080\"\n    depends_on:\n      - axon-server\n      - mysql\n    environment:\n      - AXON_AXONSERVER_SERVERS=axon-server:8124\n      - AXON_SERIALIZER_EVENTS=jackson\n      - AXON_SERIALIZER_MESSAGES=jackson\n      - AXON_SERIALIZER_GENERAL=xstream\n      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/fastcampus_pay?useSSL=false&allowPublicKeyRetrieval=true\n      - SPRING_DATASOURCE_USERNAME=mysqluser\n      - SPRING_DATASOURCE_PASSWORD=mysqlpw\n      - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.MySQL5InnoDBDialect\n      - SPRING_JPA_HIBERNATE_DDL_AUTO=update\n\n  payment-service:\n    image: fastcampus-pay-payment-service:0.0.1-SNAPSHOT\n    networks:\n      - fastcampuspay_network\n    ports:\n      - \"8086:8080\"\n    depends_on:\n      - axon-server\n      - mysql\n    environment:\n      - AXON_AXONSERVER_SERVERS=axon-server:8124\n      - AXON_SERIALIZER_EVENTS=jackson\n      - AXON_SERIALIZER_MESSAGES=jackson\n      - AXON_SERIALIZER_GENERAL=xstream\n      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/fastcampus_pay?useSSL=false&allowPublicKeyRetrieval=true\n      - SPRING_DATASOURCE_USERNAME=mysqluser\n      - SPRING_DATASOURCE_PASSWORD=mysqlpw\n      - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.MySQL5InnoDBDialect\n      - SPRING_JPA_HIBERNATE_DDL_AUTO=update\n\n  settlement-service:\n    image: fastcampus-pay-settlement-service:0.0.1-SNAPSHOT\n    networks:\n      - fastcampuspay_network\n    ports:\n      - \"8087:8080\"\n    depends_on:\n      - axon-server\n      - mysql\n    environment:\n      - AXON_AXONSERVER_SERVERS=axon-server:8124\n      - AXON_SERIALIZER_EVENTS=jackson\n      - AXON_SERIALIZER_MESSAGES=jackson\n      - AXON_SERIALIZER_GENERAL=xstream\n      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/fastcampus_pay?useSSL=false&allowPublicKeyRetrieval=true\n      - SPRING_DATASOURCE_USERNAME=mysqluser\n      - SPRING_DATASOURCE_PASSWORD=mysqlpw\n      - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.MySQL5InnoDBDialect\n      - SPRING_JPA_HIBERNATE_DDL_AUTO=update\n\nvolumes:\n  axonserver-data:\n    driver: local\n    driver_opts:\n      o: bind\n      type: none\n      device: ${PWD}/axon-server-se/data\n  axonserver-events:\n    driver: local\n    driver_opts:\n      o: bind\n      type: none\n      device: ${PWD}/axon-server-se/events\n  axonserver-config:\n    driver: local\n    driver_opts:\n      o: bind\n      type: none\n      device: ${PWD}/axon-server-se/config\n\nnetworks:\n  fastcampuspay_network:\n    driver: bridge"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-6.8.2-bin.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx2g\norg.gradle.caching=true\norg.gradle.configureondemand=true\norg.gradle.parallel=false\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif [ \"$cygwin\" = \"true\" -o \"$msys\" = \"true\" ] ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=`expr $i + 1`\n    done\n    case $i in\n        0) set -- ;;\n        1) set -- \"$args0\" ;;\n        2) set -- \"$args0\" \"$args1\" ;;\n        3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=`save \"$@\"`\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\n@rem you may not use this file except in compliance with the License.\n@rem You may obtain a copy of the License at\n@rem\n@rem      https://www.apache.org/licenses/LICENSE-2.0\n@rem\n@rem Unless required by applicable law or agreed to in writing, software\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n@rem See the License for the specific language governing permissions and\n@rem limitations under the License.\n@rem\n\n@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto execute\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto execute\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "membership-service/build.gradle",
    "content": "plugins {\n    id 'com.palantir.docker' version '0.25.0'\n}\next{\n    axonVersion = \"4.6.0\"\n}\n\ngroup = 'com.fastcampuspay.membership'\nversion = '0.0.1-SNAPSHOT'\n\ndependencies {\n    implementation 'org.springframework.boot:spring-boot-starter-validation'\n    implementation 'org.springframework.boot:spring-boot-starter-actuator'\n    implementation 'org.springframework.boot:spring-boot-starter-web'\n    implementation group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'\n    implementation group: 'org.axonframework', name: 'axon-configuration', version: \"$axonVersion\"\n    implementation group: 'org.axonframework', name: 'axon-spring-boot-starter', version: \"$axonVersion\"\n    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'\n    implementation project(path: ':common')\n    implementation 'org.jetbrains:annotations:23.0.0'\n    // runtimeOnly 'com.h2database:h2'\n    runtimeOnly 'mysql:mysql-connector-java'\n}\n\ndocker {\n    println(tasks.bootJar.outputs.files)\n    name rootProject.name+'-'+project.name + \":\" + version\n    dockerfile file('../Dockerfile')\n    files tasks.bootJar.outputs.files\n    buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singleFile.name])\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/MembershipApplication.java",
    "content": "package com.fastcampuspay.membership;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MembershipApplication {\n\n  public static void main(String[] args) {\n    SpringApplication.run(MembershipApplication.class, args);\n  }\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/MembershipConfiguration.java",
    "content": "package com.fastcampuspay.membership;\n\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@EnableConfigurationProperties(MembershipConfigurationProperties.class)\npublic class MembershipConfiguration {\n\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/MembershipConfigurationProperties.java",
    "content": "package com.fastcampuspay.membership;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n@Data\n@ConfigurationProperties(prefix = \"membership\")\npublic class MembershipConfigurationProperties {\n\n  private long transferThreshold = Long.MAX_VALUE;\n\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/SwaggerConfig.java",
    "content": "package com.fastcampuspay.membership;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport springfox.documentation.builders.ApiInfoBuilder;\nimport springfox.documentation.builders.PathSelectors;\nimport springfox.documentation.builders.RequestHandlerSelectors;\nimport springfox.documentation.service.ApiInfo;\nimport springfox.documentation.spi.DocumentationType;\nimport springfox.documentation.spring.web.plugins.Docket;\nimport springfox.documentation.swagger2.annotations.EnableSwagger2;\n\n@Configuration\n@EnableSwagger2\npublic class SwaggerConfig {\n\n    @Bean\n    public Docket restAPI() {\n        return new Docket(DocumentationType.SWAGGER_2)\n                .apiInfo(apiInfo())\n                .select()\n                .apis(RequestHandlerSelectors.basePackage(\"com.fastcampuspay.membership\"))\n                .paths(PathSelectors.any())\n                .build();\n    }\n\n    private ApiInfo apiInfo() {\n        return new ApiInfoBuilder()\n                .build();\n    }\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/adapter/in/web/FindMembershipController.java",
    "content": "package com.fastcampuspay.membership.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport com.fastcampuspay.membership.application.port.in.FindMembershipCommand;\nimport com.fastcampuspay.membership.application.port.in.FindMembershipUseCase;\nimport com.fastcampuspay.membership.domain.Membership;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass FindMembershipController {\n\n\tprivate final FindMembershipUseCase findMembershipUseCase;\n\n\t@GetMapping(path = \"/membership/{membershipId}\")\n\tResponseEntity<Membership> findMembershipByMemberId(@PathVariable String membershipId){\n\n\t\tFindMembershipCommand command = FindMembershipCommand.builder()\n\t\t\t\t.membershipId(membershipId)\n\t\t\t\t.build();\n\t\treturn ResponseEntity.ok(findMembershipUseCase.findMembership(command));\n\t}\n\n\t@GetMapping(path = \"/membership/axon/{membershipId}\")\n\tResponseEntity<Membership> findAxonMembershipByMemberId(@PathVariable String membershipId){\n\n\t\tFindMembershipCommand command = FindMembershipCommand.builder()\n\t\t\t\t.membershipId(membershipId)\n\t\t\t\t.build();\n\n\t\treturn ResponseEntity.ok(findMembershipUseCase.findAxonMembership(command));\n\t}\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/adapter/in/web/FindMembershipRequest.java",
    "content": "package com.fastcampuspay.membership.adapter.in.web;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok.Setter;\n\n@Getter\n@Setter\n@AllArgsConstructor\n@NoArgsConstructor\npublic class FindMembershipRequest {\n    private String membershipId;\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/adapter/in/web/LoginAuthMembershipController.java",
    "content": "package com.fastcampuspay.membership.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass LoginAuthMembershipController {\n\n\t@PostMapping(path = \"/membership/login/\")\n\tResponseEntity<Object> loginByMembershipIdPw(){\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n\t@PostMapping(path = \"/membership/auth/\")\n\tResponseEntity<Object> authByToken(){\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/adapter/in/web/RegisterMembershipController.java",
    "content": "package com.fastcampuspay.membership.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport com.fastcampuspay.membership.application.port.in.RegisterMembershipCommand;\nimport com.fastcampuspay.membership.application.port.in.RegisterMembershipUseCase;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass RegisterMembershipController {\n\n\tprivate final RegisterMembershipUseCase registerMembershipUseCase;\n\t@PostMapping(path = \"/membership/register/\")\n\tvoid registerMembership(@RequestBody RegisterMembershipRequest request){\n\t\t// RegisterMembershipRequest\n\t\t// name, address, email\n\t\tRegisterMembershipCommand command = RegisterMembershipCommand.builder()\n\t\t\t\t.name(request.getName())\n\t\t\t\t.address(request.getAddress())\n\t\t\t\t.email(request.getEmail())\n\t\t\t\t.build();\n\t\tregisterMembershipUseCase.registerMembership(command);\n\t}\n\n\n\t@PostMapping(path = \"/membership/axon-register/\")\n\tvoid registerAxonMembership(@RequestBody RegisterMembershipRequest request){\n\t\tRegisterMembershipCommand command = RegisterMembershipCommand.builder()\n\t\t\t\t.name(request.getName())\n\t\t\t\t.address(request.getAddress())\n\t\t\t\t.email(request.getEmail())\n\t\t\t\t.build();\n\n\t\tregisterMembershipUseCase.registerAxonMembership(command);\n\t}\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/adapter/in/web/RegisterMembershipRequest.java",
    "content": "package com.fastcampuspay.membership.adapter.in.web;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok.Setter;\n\n@Getter\n@Setter\n@AllArgsConstructor\n@NoArgsConstructor\npublic class RegisterMembershipRequest {\n    private String name;\n\n    private String address;\n\n    private String email;\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/adapter/in/web/UpdateMembershipController.java",
    "content": "package com.fastcampuspay.membership.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport com.fastcampuspay.membership.application.port.in.UpdateMembershipCommand;\nimport com.fastcampuspay.membership.application.port.in.UpdateMembershipUseCase;\nimport com.fastcampuspay.membership.domain.Membership;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass UpdateMembershipController {\n\n\tprivate final UpdateMembershipUseCase updateMembershipUseCase;\n\t@PutMapping(path = \"/membership/update\")\n\tResponseEntity<Membership> updateMembershipByMemberId(@RequestBody UpdateMembershipRequest membershipToBeUpdated){\n\t\t// updateMembership\n\t\tUpdateMembershipCommand command = UpdateMembershipCommand.builder()\n\t\t\t\t.membershipId(membershipToBeUpdated.getMembershipId())\n\t\t\t\t.name(membershipToBeUpdated.getName())\n\t\t\t\t.address(membershipToBeUpdated.getAddress())\n\t\t\t\t.email(membershipToBeUpdated.getEmail())\n\t\t\t\t.isValid(membershipToBeUpdated.isValid())\n\t\t\t\t.build();\n\t\treturn ResponseEntity.ok(updateMembershipUseCase.updateMembership(command));\n\t}\n\n\t@PutMapping(path = \"/membership/axon-update\")\n\tResponseEntity<Membership> updateAxonMembershipByMemberId(@RequestBody UpdateMembershipRequest membershipToBeUpdated){\n\t\tSystem.out.println(\"axon update controller\");\n\t\t// updateMembership\n\t\tUpdateMembershipCommand command = UpdateMembershipCommand.builder()\n\t\t\t\t.membershipId(membershipToBeUpdated.getMembershipId())\n\t\t\t\t.name(membershipToBeUpdated.getName())\n\t\t\t\t.address(membershipToBeUpdated.getAddress())\n\t\t\t\t.email(membershipToBeUpdated.getEmail())\n\t\t\t\t.isValid(membershipToBeUpdated.isValid())\n\t\t\t\t.build();\n\t\treturn ResponseEntity.ok(updateMembershipUseCase.updateAxonMembership(command));\n\t}\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/adapter/in/web/UpdateMembershipRequest.java",
    "content": "package com.fastcampuspay.membership.adapter.in.web;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok.Setter;\n\n@Getter\n@Setter\n@AllArgsConstructor\n@NoArgsConstructor\npublic class UpdateMembershipRequest {\n    private String membershipId;\n    private String name;\n\n    private String address;\n\n    private String email;\n\n    private boolean isValid;\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/adapter/out/persistence/MembershipJpaEntity.java",
    "content": "package com.fastcampuspay.membership.adapter.out.persistence;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\n\n@Entity\n@Table(name = \"membership\")\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\nclass MembershipJpaEntity {\n\n\t@Id\n\t@GeneratedValue\n\tprivate Long membershipId;\n\n\tprivate String name;\n\n\tprivate String address;\n\n\tprivate String email;\n\n\tprivate boolean isValid;\n\n\tprivate String aggregateIdentifier;\n\n\tpublic MembershipJpaEntity(String name, String address, String email, boolean isValid, String aggregateIdentifier) {\n\t\tthis.name = name;\n\t\tthis.address = address;\n\t\tthis.email = email;\n\t\tthis.isValid = isValid;\n\t\tthis.aggregateIdentifier = aggregateIdentifier;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"MembershipJpaEntity{\" +\n\t\t\t\t\"membershipId=\" + membershipId +\n\t\t\t\t\", name='\" + name + '\\'' +\n\t\t\t\t\", address='\" + address + '\\'' +\n\t\t\t\t\", email='\" + email + '\\'' +\n\t\t\t\t\", isValid=\" + isValid +\n\t\t\t\t\", aggregateIdentifier='\" + aggregateIdentifier + '\\'' +\n\t\t\t\t'}';\n\t}\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/adapter/out/persistence/MembershipMapper.java",
    "content": "package com.fastcampuspay.membership.adapter.out.persistence;\n\nimport com.fastcampuspay.membership.domain.Membership;\nimport org.springframework.stereotype.Component;\n\n@Component\nclass MembershipMapper {\n\tMembership mapToDomainEntity(\n\t\t\tMembershipJpaEntity membership) {\n\t\tSystem.out.println(membership.toString());\n\t\treturn Membership.generateMember(\n\t\t\t\tnew Membership.MembershipId(membership.getMembershipId()+\"\"),\n\t\t\t\tnew Membership.MembershipName(membership.getName()),\n\t\t\t\tnew Membership.MembershipEmail(membership.getEmail()),\n\t\t\t\tnew Membership.MembershipAddress(membership.getAddress()),\n\t\t\t\tnew Membership.MembershipIsValid(membership.isValid()),\n\t\t\t\tnew Membership.MembershipAggregateIdentifier(membership.getAggregateIdentifier())\n\t\t\t\t);\n\t}\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/adapter/out/persistence/MembershipPersistenceAdapter.java",
    "content": "package com.fastcampuspay.membership.adapter.out.persistence;\n\nimport com.fastcampuspay.common.PersistenceAdapter;\nimport com.fastcampuspay.membership.application.port.out.FindMembershipPort;\nimport com.fastcampuspay.membership.application.port.out.RegisterMembershipPort;\nimport com.fastcampuspay.membership.application.port.out.UpdateMembershipPort;\nimport com.fastcampuspay.membership.domain.Membership;\nimport lombok.RequiredArgsConstructor;\n\n@RequiredArgsConstructor\n@PersistenceAdapter\nclass MembershipPersistenceAdapter implements RegisterMembershipPort, FindMembershipPort, UpdateMembershipPort {\n\n\tprivate final SpringDataMembershipRepository membershipRepository;\n\t private final MembershipMapper membershipMapper;\n\n\t@Override\n\tpublic void createMembership(Membership.MembershipName membershipName\n\t\t\t, Membership.MembershipEmail membershipEmail\n\t\t\t, Membership.MembershipAddress membershipAddress\n\t\t\t, Membership.MembershipIsValid membershipIsValid\n\t\t\t, Membership.MembershipAggregateIdentifier membershipAggregateIdentifier\n\t) {\n\t\tmembershipRepository.save(\n\t\t\t\tnew MembershipJpaEntity(\n\t\t\t\t\t\tmembershipName.getNameValue(),\n\t\t\t\t\t\tmembershipEmail.getEmailValue(),\n\t\t\t\t\t\tmembershipAddress.getAddressValue(),\n\t\t\t\t\t\tmembershipIsValid.isValidValue(),\n\t\t\t\t\t\tmembershipAggregateIdentifier.getAggregateIdentifier()\n\t\t\t\t)\n\t\t);\n\t}\n\n\t@Override\n\tpublic Membership findMembership(Membership.MembershipId membershipId) {\n\t\treturn membershipMapper.mapToDomainEntity(\n\t\t\t\tmembershipRepository.getById(Long.parseLong(membershipId.getMembershipId()))\n\t\t);\n\t}\n\n\t@Override\n\tpublic Membership updateMembership(Membership.MembershipId membershipId, Membership.MembershipName membershipName, Membership.MembershipEmail membershipEmail, Membership.MembershipAddress membershipAddress, Membership.MembershipIsValid membershipIsValid) {\n\t\t// update membership Info\n\t\tMembershipJpaEntity membershipJpaEntity = membershipRepository.getById(Long.parseLong(membershipId.getMembershipId()));\n\t\tmembershipJpaEntity.setName(membershipName.getNameValue());\n\t\tmembershipJpaEntity.setEmail(membershipEmail.getEmailValue());\n\t\tmembershipJpaEntity.setAddress(membershipAddress.getAddressValue());\n\t\tmembershipJpaEntity.setValid(membershipIsValid.isValidValue());\n\n\t\t// save\n\t\tMembershipJpaEntity updatedMembership = membershipRepository.save(membershipJpaEntity);\n\n\t\t// return\n\t\treturn membershipMapper.mapToDomainEntity(updatedMembership);\n\t}\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/adapter/out/persistence/SpringDataMembershipRepository.java",
    "content": "package com.fastcampuspay.membership.adapter.out.persistence;\n\nimport org.springframework.data.jpa.repository.JpaRepository;\n\ninterface SpringDataMembershipRepository extends JpaRepository<MembershipJpaEntity, Long> {\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/in/FindMembershipCommand.java",
    "content": "package com.fastcampuspay.membership.application.port.in;\n\n\nimport com.fastcampuspay.common.SelfValidating;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n@Data\n@Builder\n@EqualsAndHashCode(callSuper = false)\npublic\nclass FindMembershipCommand extends SelfValidating<FindMembershipCommand> {\n    private final String membershipId;\n\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/in/FindMembershipUseCase.java",
    "content": "package com.fastcampuspay.membership.application.port.in;\n\nimport com.fastcampuspay.membership.domain.Membership;\n\npublic interface FindMembershipUseCase {\n\n\tMembership findMembership(FindMembershipCommand command);\n\tMembership findAxonMembership(FindMembershipCommand command);\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/in/RegisterMembershipCommand.java",
    "content": "package com.fastcampuspay.membership.application.port.in;\n\n\nimport com.fastcampuspay.common.SelfValidating;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport javax.validation.constraints.NotNull;\n\n@Builder\n@Data\n@EqualsAndHashCode(callSuper = false)\npublic\nclass RegisterMembershipCommand extends SelfValidating<RegisterMembershipCommand> {\n\n    @NotNull\n    private final String name;\n\n    @NotNull\n    private final String email;\n\n    @NotNull\n    private final String address;\n\n    @NotNull\n    private final boolean isValid;\n\n    public RegisterMembershipCommand(String name, String email, String address, boolean isValid) {\n        this.name = name;\n        this.email = email;\n        this.address = address;\n        this.isValid = isValid;\n    }\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/in/RegisterMembershipUseCase.java",
    "content": "package com.fastcampuspay.membership.application.port.in;\n\npublic interface RegisterMembershipUseCase {\n\n\tvoid registerMembership(RegisterMembershipCommand command);\n\tvoid registerAxonMembership(RegisterMembershipCommand command);\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/in/UpdateMembershipCommand.java",
    "content": "package com.fastcampuspay.membership.application.port.in;\n\n\nimport com.fastcampuspay.common.SelfValidating;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport org.axonframework.modelling.command.TargetAggregateIdentifier;\n\nimport javax.validation.constraints.NotNull;\n\n@Builder\n@Data\n@EqualsAndHashCode(callSuper = false)\npublic class UpdateMembershipCommand extends SelfValidating<UpdateMembershipCommand> {\n    @NotNull\n    @TargetAggregateIdentifier\n    private String membershipId;\n\n    private String name;\n\n    private String address;\n\n    private String email;\n\n    private boolean isValid;\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/in/UpdateMembershipEventCommand.java",
    "content": "package com.fastcampuspay.membership.application.port.in;\n\n\nimport com.fastcampuspay.common.SelfValidating;\nimport lombok.*;\nimport org.axonframework.modelling.command.TargetAggregateIdentifier;\n\nimport javax.validation.constraints.NotNull;\n\n@Builder\n@Data\n@EqualsAndHashCode(callSuper = false)\n@AllArgsConstructor\n@NoArgsConstructor\npublic class UpdateMembershipEventCommand extends SelfValidating<UpdateMembershipEventCommand> {\n\n    @NotNull\n    @TargetAggregateIdentifier\n    private String aggregateIdentifier;\n    private String name;\n\n    private String address;\n\n    private String email;\n\n    private boolean isValid;\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/in/UpdateMembershipUseCase.java",
    "content": "package com.fastcampuspay.membership.application.port.in;\n\nimport com.fastcampuspay.membership.domain.Membership;\n\npublic interface UpdateMembershipUseCase {\n\n\tMembership updateMembership(UpdateMembershipCommand command);\n\tMembership updateAxonMembership(UpdateMembershipCommand command);\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/in/aggregate/MembershipAggregate.java",
    "content": "package com.fastcampuspay.membership.application.port.in.aggregate;\n\nimport com.fastcampuspay.membership.application.port.in.RegisterMembershipCommand;\nimport com.fastcampuspay.membership.application.port.in.UpdateMembershipCommand;\nimport com.fastcampuspay.membership.application.port.in.UpdateMembershipEventCommand;\nimport com.fastcampuspay.membership.application.saga.MembershipCreateEvent;\nimport com.fastcampuspay.membership.application.saga.MembershipUpdateEvent;\nimport lombok.Data;\nimport org.axonframework.commandhandling.CommandHandler;\nimport org.axonframework.eventsourcing.EventSourcingHandler;\nimport org.axonframework.modelling.command.AggregateIdentifier;\nimport org.axonframework.spring.stereotype.Aggregate;\nimport org.jetbrains.annotations.NotNull;\n\nimport java.util.UUID;\n\nimport static org.axonframework.modelling.command.AggregateLifecycle.apply;\n\n\n@Aggregate()\n@Data\npublic class MembershipAggregate {\n    @AggregateIdentifier\n    private String id;\n    private String name;\n\n    private String email;\n\n    private String address;\n\n    @CommandHandler\n    public MembershipAggregate(@NotNull RegisterMembershipCommand command) {\n        System.out.println(\"RegisterMembershipCommand Handler\");\n\n        // store event\n        apply(new MembershipCreateEvent(command.getName(), command.getEmail(), command.getAddress()));\n    }\n\n    @CommandHandler\n    public String handle(@NotNull UpdateMembershipEventCommand command) {\n        System.out.println(\"UpdateMembershipEventCommand Handler\");\n        id = command.getAggregateIdentifier();\n\n        // store event\n        apply(new MembershipUpdateEvent(id, command.getName(), command.getEmail(), command.getAddress()));\n        return id;\n    }\n\n    @CommandHandler\n    public String handle (@NotNull UpdateMembershipCommand command) {\n        System.out.println(\"UpdateMembershipCommand Handler\");\n        String aggregateIdentifier = command.getMembershipId();\n        id = aggregateIdentifier;\n\n        // store event\n        apply(new MembershipUpdateEvent(aggregateIdentifier, command.getName(), command.getEmail(), command.getAddress()));\n        return aggregateIdentifier;\n    }\n\n    @EventSourcingHandler\n    public void on(MembershipCreateEvent event) {\n        System.out.println(\"MembershipCreateEvent Sourcing Handler\");\n        id = UUID.randomUUID().toString();\n        name = event.getName() ;\n        email = event.getEmail();\n        address = event.getAddress();\n    }\n\n    @EventSourcingHandler\n    public void on(MembershipUpdateEvent event) {\n        System.out.println(\"MembershipUpdateEvent Sourcing Handler\");\n        name = event.getName() ;\n        email = event.getEmail();\n        address = event.getAddress();\n    }\n\n\n    public MembershipAggregate() {\n        // Required by Axon to construct an empty instance to initiate Event Sourcing.\n    }\n\n    @Override\n    public String toString() {\n        return \"MembershipAggregate{\" +\n                \"id='\" + id + '\\'' +\n                \", name='\" + name + '\\'' +\n                \", email='\" + email + '\\'' +\n                \", address='\" + address + '\\'' +\n                '}';\n    }\n}\n\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/out/FindMembershipPort.java",
    "content": "package com.fastcampuspay.membership.application.port.out;\n\nimport com.fastcampuspay.membership.domain.Membership;\n\npublic interface FindMembershipPort {\n\n\tMembership findMembership(\n\t\t\tMembership.MembershipId membershipId\n\t);\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/out/RegisterMembershipPort.java",
    "content": "package com.fastcampuspay.membership.application.port.out;\n\nimport com.fastcampuspay.membership.domain.Membership;\n\npublic interface RegisterMembershipPort {\n\n\tvoid createMembership(\n\t\t\tMembership.MembershipName membershipName\n\t\t\t, Membership.MembershipEmail membershipEmail\n\t\t\t, Membership.MembershipAddress membershipAddress\n\t\t\t, Membership.MembershipIsValid membershipIsValid\n\t\t\t, Membership.MembershipAggregateIdentifier membershipAggregateIdentifier\n\t);\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/out/UpdateMembershipPort.java",
    "content": "package com.fastcampuspay.membership.application.port.out;\n\nimport com.fastcampuspay.membership.domain.Membership;\n\npublic interface UpdateMembershipPort {\n\n\tMembership updateMembership(\n\t\t\tMembership.MembershipId membershipId\n\t\t\t, Membership.MembershipName membershipName\n\t\t\t, Membership.MembershipEmail membershipEmail\n\t\t\t, Membership.MembershipAddress membershipAddress\n\t\t\t, Membership.MembershipIsValid membershipIsValid\n\t);\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/out/query/FindMembershipQuery.java",
    "content": "package com.fastcampuspay.membership.application.port.out.query;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n@AllArgsConstructor\n@NoArgsConstructor\n@Data\npublic class FindMembershipQuery {\n    String membershipId;\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/port/out/query/MembershipQueryHandler.java",
    "content": "package com.fastcampuspay.membership.application.port.out.query;\n\nimport com.fastcampuspay.membership.application.port.out.FindMembershipPort;\nimport com.fastcampuspay.membership.domain.Membership;\nimport lombok.RequiredArgsConstructor;\nimport org.axonframework.queryhandling.QueryHandler;\nimport org.springframework.stereotype.Component;\n\n@RequiredArgsConstructor\n@Component\npublic class MembershipQueryHandler{\n\n    private final FindMembershipPort fport;\n\n    @QueryHandler\n    public Membership handle(FindMembershipQuery query) {\n        System.out.println(\"MembershipQueryHandler Handler\");\n\n        // Retrieve the event sourcing repository\n//        EventSourcingRepository<MembershipAggregate> repository =  EventSourcingRepository.builder(MembershipAggregate.class).eventStore(eventStore).build();\n//        MembershipAggregate user = repository.load(query.getMembershipId()).getWrappedAggregate().getAggregateRoot();\n\n//        System.out.println(user.toString());\n        return fport.findMembership(new Membership.MembershipId(query.getMembershipId()));\n\n//        return Membership.generateMember(\n//                new Membership.MembershipId(user.getId()+\"\"),\n//                new Membership.MembershipName(user.getName()),\n//                new Membership.MembershipEmail(user.getEmail()),\n//                new Membership.MembershipAddress(user.getAddress()),\n//                new Membership.MembershipIsValid(true)\n//        );\n    }\n\n}"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/saga/MembershipCreateEvent.java",
    "content": "package com.fastcampuspay.membership.application.saga;\n\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n@AllArgsConstructor\n@NoArgsConstructor\n@Data\npublic class MembershipCreateEvent {\n    private String name;\n    private String email;\n    private String address;\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/saga/MembershipUpdateEvent.java",
    "content": "package com.fastcampuspay.membership.application.saga;\n\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n@AllArgsConstructor\n@NoArgsConstructor\n@Data\npublic class MembershipUpdateEvent {\n    private String membershipId;\n    private String name;\n    private String email;\n    private String address;\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/saga/Order.java",
    "content": "package com.fastcampuspay.membership.application.saga;\n\nimport lombok.Data;\nimport org.axonframework.modelling.command.AggregateIdentifier;\nimport org.axonframework.spring.stereotype.Aggregate;\n\n@Data\n@Aggregate()\npublic class Order {\n    @AggregateIdentifier\n    private String orderId;\n\n}"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/saga/OrderCancelledEvent.java",
    "content": "package com.fastcampuspay.membership.application.saga;\n\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n@AllArgsConstructor\n@NoArgsConstructor\n@Data\npublic class OrderCancelledEvent {\n    private String orderId;\n    private String paymentId;\n    private String name;\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/saga/OrderConfirmedEvent.java",
    "content": "package com.fastcampuspay.membership.application.saga;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\n@Data\n@AllArgsConstructor\npublic class OrderConfirmedEvent  {\n    private String orderId;\n\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/saga/OrderCreatedEvent.java",
    "content": "package com.fastcampuspay.membership.application.saga;\n\npublic class OrderCreatedEvent {\n\n    private String orderId;\n    private String customerName;\n\n    public OrderCreatedEvent(String orderId, String customerName) {\n        this.orderId = orderId;\n        this.customerName = customerName;\n    }\n\n    public String getOrderId() {\n        return orderId;\n    }\n\n    public String getCustomerName() {\n        return customerName;\n    }\n}"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/saga/OrderPlacedEvent.java",
    "content": "package com.fastcampuspay.membership.application.saga;\n\nimport lombok.Data;\n\n@Data\npublic class OrderPlacedEvent  {\n\n    private String orderId;\n\n    private String name;\n\n\n    public OrderPlacedEvent(){\n        orderId = \"default-123\";\n    }\n\n    public OrderPlacedEvent(String orderId){\n        this.orderId = orderId;\n    }\n\n    public OrderPlacedEvent(String orderId, String name){\n        this.orderId = orderId;\n        this.name = name;\n    }\n}"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/saga/OrderSaga.java",
    "content": "package com.fastcampuspay.membership.application.saga;\n\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok.NonNull;\nimport org.axonframework.commandhandling.gateway.CommandGateway;\nimport org.axonframework.eventhandling.EventBus;\nimport org.axonframework.modelling.saga.SagaEventHandler;\nimport org.axonframework.modelling.saga.SagaLifecycle;\nimport org.axonframework.modelling.saga.StartSaga;\nimport org.axonframework.spring.stereotype.Saga;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport java.util.UUID;\n\n@Saga\n@Getter\n@NoArgsConstructor\npublic class OrderSaga {\n    private String orderId;\n    private String paymentId;\n    private double amount;\n\n    @NonNull\n    private transient EventBus eventBus;\n\n    @NonNull\n    private transient CommandGateway commandGateway;\n\n    @Autowired\n    public void setEventBus(EventBus eventBus) {\n        this.eventBus = eventBus;\n    }\n\n    @Autowired\n    public void setCommandGateway(CommandGateway commandGateway) {\n        this.commandGateway = commandGateway;\n    }\n\n    @StartSaga\n    @SagaEventHandler(associationProperty = \"orderId\")\n    public void handle(OrderPlacedEvent event) {\n        SagaLifecycle.associateWith(\"orderId\", event.getOrderId());\n        System.out.println(\"Order placed\");\n        orderId = event.getOrderId();\n        paymentId = UUID.randomUUID().toString();\n        amount = 100.0; // hardcoded for simplicity\n        PaymentRequestedCommand command = new PaymentRequestedCommand(paymentId, orderId, amount);\n        commandGateway.send(command).whenComplete((Object result, Throwable throwable) -> {\n//           if (throwable == null) {\n                System.out.println(\"Payment requested\");\n                this.orderId = \"finished\";\n                 SagaLifecycle.associateWith(\"paymentId\", paymentId);\n                // eventBus.publish(GenericEventMessage.asEventMessage(new PaymentCompletedEvent(\"1345\", event.getOrderId())));\n//            }\n            System.out.println(\"Payment failed\");\n            SagaLifecycle.end();\n        });\n    }\n\n    @SagaEventHandler(associationProperty = \"orderId\")\n    public void handle(OrderConfirmedEvent event) {\n        System.out.println(\"Payment completed\");\n        SagaLifecycle.end();\n//        // OrderConfirmedEvent orderConfirmedEvent = new OrderConfirmedEvent(orderId);\n//        if (this.orderId != null) {\n//            System.out.println(\"Payment completed\");\n//            // SagaLifecycle.associateWith(\"orderId\", orderId);\n//            // eventBus.publish(orderConfirmedEvent);\n//        } else{\n//            System.out.println(\"Order Cancelled\");\n//         //   commandGateway.send(new OrderCancelledEvent(event.getOrderId()));\n//        }\n//        System.out.println(\"Payment completed\");\n\n    }\n\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/saga/Payment.java",
    "content": "package com.fastcampuspay.membership.application.saga;\n\nimport lombok.Data;\nimport org.axonframework.modelling.command.AggregateIdentifier;\nimport org.axonframework.spring.stereotype.Aggregate;\n\n@Data\n@Aggregate()\npublic class Payment {\n    private String orderId;\n\n\n    @AggregateIdentifier\n    private String paymentId;\n\n    // getters and setters\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/saga/PaymentCancelledEvent.java",
    "content": "package com.fastcampuspay.membership.application.saga;\n\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\n@Data\n@AllArgsConstructor\npublic class PaymentCancelledEvent  {\n    private String orderId;\n    private String paymentId;\n\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/saga/PaymentCompletedEvent.java",
    "content": "package com.fastcampuspay.membership.application.saga;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\n@Data\n@AllArgsConstructor\npublic class PaymentCompletedEvent {\n    private String paymentId;\n    private String orderId;\n\n}\n\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/saga/PaymentRequestedCommand.java",
    "content": "package com.fastcampuspay.membership.application.saga;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n@AllArgsConstructor\n@NoArgsConstructor\n@Data\npublic class PaymentRequestedCommand {\n    private String paymentId;\n    private String orderId;\n    private double amount;\n    // getters and setters\n}\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/service/FindMembership.java",
    "content": "package com.fastcampuspay.membership.application.service;\n\nimport com.fastcampuspay.common.UseCase;\nimport com.fastcampuspay.membership.application.port.in.FindMembershipCommand;\nimport com.fastcampuspay.membership.application.port.in.FindMembershipUseCase;\nimport com.fastcampuspay.membership.application.port.out.FindMembershipPort;\nimport com.fastcampuspay.membership.application.port.out.query.FindMembershipQuery;\nimport com.fastcampuspay.membership.domain.Membership;\nimport lombok.RequiredArgsConstructor;\nimport org.axonframework.messaging.responsetypes.ResponseTypes;\nimport org.axonframework.queryhandling.QueryGateway;\n\nimport javax.transaction.Transactional;\n\n@RequiredArgsConstructor\n@UseCase\n@Transactional\npublic class FindMembership implements FindMembershipUseCase {\n\n\tprivate final FindMembershipPort fport;\n\n\tprivate final QueryGateway queryGateway;\n\t@Override\n\tpublic Membership findMembership(FindMembershipCommand command) {\n\t\treturn fport.findMembership(new Membership.MembershipId(command.getMembershipId()));\n\t}\n\n\t@Override\n\tpublic Membership findAxonMembership(FindMembershipCommand command) {\n\t\tFindMembershipQuery getQuery = new FindMembershipQuery(command.getMembershipId());\n\t\tqueryGateway.query(getQuery, ResponseTypes.instanceOf(Membership.class))\n\t\t\t\t.whenComplete((Object result, Throwable throwable) -> {\n\t\t\t\t\tif (throwable == null) {\n\t\t\t\t\t\tSystem.out.println(result.toString());\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tSystem.out.println(\"error : \" + throwable.getMessage());\n\t\t\t\t\t}\n\t\t\t\t});\n\t\treturn null;\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/service/RegisterMembership.java",
    "content": "package com.fastcampuspay.membership.application.service;\n\nimport com.fastcampuspay.common.UseCase;\nimport com.fastcampuspay.membership.application.port.in.RegisterMembershipCommand;\nimport com.fastcampuspay.membership.application.port.in.RegisterMembershipUseCase;\nimport com.fastcampuspay.membership.application.port.out.RegisterMembershipPort;\nimport com.fastcampuspay.membership.domain.Membership;\nimport lombok.RequiredArgsConstructor;\nimport org.axonframework.commandhandling.gateway.CommandGateway;\n\nimport javax.transaction.Transactional;\n\n@RequiredArgsConstructor\n@UseCase\n@Transactional\npublic class RegisterMembership implements RegisterMembershipUseCase {\n\n\tprivate final RegisterMembershipPort rport;\n\tprivate final CommandGateway commandGateway;\n\n\t@Override\n\tpublic void registerMembership(RegisterMembershipCommand command) {\n\t\trport.createMembership(\n\t\t\t\tnew Membership.MembershipName(command.getName()),\n\t\t\t\tnew Membership.MembershipEmail(command.getEmail()),\n\t\t\t\tnew Membership.MembershipAddress(command.getAddress()),\n\t\t\t\tnew Membership.MembershipIsValid(command.isValid()),\n\t\t\t\tnew Membership.MembershipAggregateIdentifier(\"default\")\n\t\t\t\t);\n\t}\n\t@Override\n\tpublic void registerAxonMembership(RegisterMembershipCommand command) {\n\t\tcommandGateway.send(command)\n\t\t\t.whenComplete((Object result, Throwable throwable) -> {\n\t\t\t\tif (throwable == null) {\n\t\t\t\t\tSystem.out.println(\"Aggregate ID:\" + result.toString());\n\t\t\t\t\trport.createMembership(\n\t\t\t\t\t\t\tnew Membership.MembershipName(command.getName()),\n\t\t\t\t\t\t\tnew Membership.MembershipEmail(command.getEmail()),\n\t\t\t\t\t\t\tnew Membership.MembershipAddress(command.getAddress()),\n\t\t\t\t\t\t\tnew Membership.MembershipIsValid(command.isValid()),\n\t\t\t\t\t\t\tnew Membership.MembershipAggregateIdentifier(result.toString())\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tSystem.out.println(\"error : \" + throwable.getMessage());\n\t\t\t\t}\n\t\t\t});\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/application/service/UpdateMembership.java",
    "content": "package com.fastcampuspay.membership.application.service;\n\nimport com.fastcampuspay.common.UseCase;\nimport com.fastcampuspay.membership.application.port.in.UpdateMembershipCommand;\nimport com.fastcampuspay.membership.application.port.in.UpdateMembershipEventCommand;\nimport com.fastcampuspay.membership.application.port.in.UpdateMembershipUseCase;\nimport com.fastcampuspay.membership.application.port.out.FindMembershipPort;\nimport com.fastcampuspay.membership.application.port.out.UpdateMembershipPort;\nimport com.fastcampuspay.membership.domain.Membership;\nimport lombok.RequiredArgsConstructor;\nimport org.axonframework.commandhandling.gateway.CommandGateway;\n\nimport javax.transaction.Transactional;\n\n@RequiredArgsConstructor\n@UseCase\n@Transactional\npublic class UpdateMembership implements UpdateMembershipUseCase {\n\n\tprivate final UpdateMembershipPort uport;\n\tprivate final FindMembershipPort fport;\n\tprivate final CommandGateway commandGateway;\n\t@Override\n\tpublic Membership updateMembership(UpdateMembershipCommand command) {\n\t\treturn uport.updateMembership(\n\t\t\t\tnew Membership.MembershipId(command.getMembershipId()),\n\t\t\t\tnew Membership.MembershipName(command.getName()),\n\t\t\t\tnew Membership.MembershipEmail(command.getEmail()),\n\t\t\t\tnew Membership.MembershipAddress(command.getAddress()),\n\t\t\t\tnew Membership.MembershipIsValid(command.isValid())\n\t\t);\n\t}\n\n\t@Override\n\tpublic Membership updateAxonMembership(UpdateMembershipCommand command) {\n\t\tSystem.out.println(\"update axon membership\");\n\t\tMembership membership = fport.findMembership(new Membership.MembershipId(command.getMembershipId()));\n\t\tUpdateMembershipEventCommand eventCommand = UpdateMembershipEventCommand.builder()\n\t\t\t\t.aggregateIdentifier(membership.getAggregateIdentifier())\n\t\t\t\t.name(command.getName())\n\t\t\t\t.email(command.getEmail())\n\t\t\t\t.address(command.getAddress())\n\t\t\t\t.isValid(command.isValid())\n\t\t\t\t.build();\n\n\t\tcommandGateway.send(eventCommand).whenComplete((Object result, Throwable throwable) -> {\n\t\t\t\tif (throwable == null) {\n\t\t\t\t\tSystem.out.println(\"Aggregate ID:\" + result);\n\t\t\t\t} else {\n\t\t\t\t\tSystem.out.println(\"error : \" + throwable.getMessage());\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis.updateMembership(command);\n\t\treturn null;\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "membership-service/src/main/java/com/fastcampuspay/membership/domain/Membership.java",
    "content": "package com.fastcampuspay.membership.domain;\n\nimport lombok.AccessLevel;\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.Value;\n\n@AllArgsConstructor(access = AccessLevel.PRIVATE)\npublic class Membership {\n\t/**\n\t * The baseline balance of the account. This was the balance of the account before the first\n\t * activity in the activityWindow.\n\t */\n\t@Getter private final String membershipId;\n\t@Getter private final String name;\n\t@Getter private final String email;\n\t@Getter private final String address;\n\t@Getter private final boolean isValid;\n\t@Getter private final String aggregateIdentifier;\n\n\tpublic static Membership generateMember(\n\t\t\tMembershipId membershipId, MembershipName membershipName, MembershipEmail membershipEmail, MembershipAddress membershipAddress, MembershipIsValid membershipIsValid,\n\t\t\tMembershipAggregateIdentifier membershipAggregateIdentifier) {\n\t\treturn new Membership(\n\t\t\t\tmembershipId.membershipId,\n\t\t\t\tmembershipName.nameValue,\n\t\t\t\tmembershipEmail.emailValue,\n\t\t\t\tmembershipAddress.addressValue,\n\t\t\t\tmembershipIsValid.isValidValue,\n\t\t\t\tmembershipAggregateIdentifier.aggregateIdentifier\n\t\t);\n\t}\n\n\t@Value\n\tpublic static class MembershipId {\n\t\tpublic MembershipId(String value) {\n\t\t\tthis.membershipId = value;\n\t\t}\n\t\tString membershipId ;\n\t}\n\n\t@Value\n\tpublic static class MembershipName {\n\t\tpublic MembershipName(String value) {\n\t\t\tthis.nameValue = value;\n\t\t}\n\n\t\tString nameValue;\n\t}\n\t@Value\n\tpublic static class MembershipEmail {\n\t\tpublic MembershipEmail(String value) {\n\t\t\tthis.emailValue = value;\n\t\t}\n\t\tString emailValue;\n\t}\n\n\t@Value\n\tpublic static class MembershipAddress {\n\t\tpublic MembershipAddress(String value) {\n\t\t\tthis.addressValue = value;\n\t\t}\n\t\tString addressValue;\n\t}\n\n\t@Value\n\tpublic static class MembershipIsValid {\n\t\tpublic MembershipIsValid(boolean value) {\n\t\t\tthis.isValidValue = value;\n\t\t}\n\t\tboolean isValidValue;\n\t}\n\n\t@Value\n\tpublic static class MembershipAggregateIdentifier {\n\t\tpublic MembershipAggregateIdentifier(String value) {\n\t\t\tthis.aggregateIdentifier = value;\n\t\t}\n\t\tString aggregateIdentifier;\n\t}\n}\n"
  },
  {
    "path": "money-local-service/build.gradle",
    "content": "plugins {\n    id 'com.palantir.docker' version '0.25.0'\n}\n\next{\n    axonVersion = \"4.6.0\"\n}\n\ngroup = 'com.fastcampuspay.moneylocal'\nversion = '0.0.1-SNAPSHOT'\n\ndependencies {\n    implementation 'org.springframework.boot:spring-boot-starter-validation'\n    implementation 'org.springframework.boot:spring-boot-starter-actuator'\n    implementation 'org.springframework.boot:spring-boot-starter-web'\n    implementation group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'\n    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'\n    implementation group: 'org.axonframework', name: 'axon-configuration', version: \"$axonVersion\"\n    implementation group: 'org.axonframework', name: 'axon-spring-boot-starter', version: \"$axonVersion\"\n    implementation 'org.jetbrains:annotations:23.0.0'\n    implementation project(path: ':common')\n    // runtimeOnly 'com.h2database:h2'\n    runtimeOnly 'mysql:mysql-connector-java'\n}\n\ndocker {\n    println(tasks.bootJar.outputs.files)\n    name rootProject.name+'-'+project.name + \":\" + version\n    dockerfile file('../Dockerfile')\n    files tasks.bootJar.outputs.files\n    buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singleFile.name])\n}"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/MoneyLocalApplication.java",
    "content": "package com.fastcampuspay.moneylocal;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MoneyLocalApplication {\n\n  public static void main(String[] args) {\n    SpringApplication.run(MoneyLocalApplication.class, args);\n  }\n}\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/MoneyLocalConfiguration.java",
    "content": "package com.fastcampuspay.moneylocal;\n\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@EnableConfigurationProperties(MoneyLocalConfigurationProperties.class)\npublic class MoneyLocalConfiguration {\n\n}\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/MoneyLocalConfigurationProperties.java",
    "content": "package com.fastcampuspay.moneylocal;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n@Data\n@ConfigurationProperties(prefix = \"banking\")\npublic class MoneyLocalConfigurationProperties {\n\n  private long transferThreshold = Long.MAX_VALUE;\n\n}\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/SwaggerConfig.java",
    "content": "package com.fastcampuspay.moneylocal;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport springfox.documentation.builders.ApiInfoBuilder;\nimport springfox.documentation.builders.PathSelectors;\nimport springfox.documentation.builders.RequestHandlerSelectors;\nimport springfox.documentation.service.ApiInfo;\nimport springfox.documentation.spi.DocumentationType;\nimport springfox.documentation.spring.web.plugins.Docket;\nimport springfox.documentation.swagger2.annotations.EnableSwagger2;\n\n@Configuration\n@EnableSwagger2\npublic class SwaggerConfig {\n\n    @Bean\n    public Docket restAPI() {\n        return new Docket(DocumentationType.SWAGGER_2)\n                .apiInfo(apiInfo())\n                .select()\n                .apis(RequestHandlerSelectors.basePackage(\"com.fastcampuspay.money\"))\n                .paths(PathSelectors.any())\n                .build();\n    }\n\n    private ApiInfo apiInfo() {\n        return new ApiInfoBuilder()\n                .build();\n    }\n}\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/adapter/in/web/CalculateLocalMoneyController.java",
    "content": "package com.fastcampuspay.moneylocal.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n// CQRS Controller\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass CalculateLocalMoneyController {\n\n\t// private final RegisterBankingAccountUseCase registerBankingAccountUseCase;\n\n\t@GetMapping(path = \"/money-local/calculate-money-sum\")\n\tResponseEntity<Object>  calculateMoneySumByLocal(){\n\t\t// RegisterMembershipRequest\n\t\t// name, address, email\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n\t// TODO\n\t// - MembershipUpdate EventHandler (EventHandler)\n}\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/adapter/out/persistence/LocalMoneyJpaEntity.java",
    "content": "package com.fastcampuspay.moneylocal.adapter.out.persistence;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\n\n@Entity\n@Table(name = \"local_money\")\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\nclass LocalMoneyJpaEntity {\n\n\t@Id\n\t@GeneratedValue\n\tprivate Long localMoneyId;\n\n//\tprivate String name;\n//\n//\tprivate String address;\n//\n//\tprivate String email;\n//\n//\tprivate boolean isValid;\n\n}\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/adapter/out/persistence/LocalMoneyMapper.java",
    "content": "package com.fastcampuspay.moneylocal.adapter.out.persistence;\n\nimport com.fastcampuspay.moneylocal.domain.MemberMoney;\nimport org.springframework.stereotype.Component;\n\n@Component\nclass LocalMoneyMapper {\n\tMemberMoney mapToDomainEntity(\n\t\t\tLocalMoneyJpaEntity rechargeMoneyJpaEntity) {\n\t\tSystem.out.println(rechargeMoneyJpaEntity.toString());\n\t\treturn MemberMoney.generateMemberMoney(\n\t\t\t\tnew MemberMoney.MemberMoneyId(rechargeMoneyJpaEntity.getLocalMoneyId()+\"\")\n\t\t\t\t);\n\t}\n}\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/adapter/out/persistence/LocalMoneyPersistenceAdapter.java",
    "content": "package com.fastcampuspay.moneylocal.adapter.out.persistence;\n\nimport com.fastcampuspay.common.PersistenceAdapter;\nimport com.fastcampuspay.moneylocal.application.port.out.RechargeMoneyPort;\nimport com.fastcampuspay.moneylocal.domain.MemberMoney;\nimport lombok.RequiredArgsConstructor;\n\n@RequiredArgsConstructor\n@PersistenceAdapter\nclass LocalMoneyPersistenceAdapter implements RechargeMoneyPort {\n\n//\tprivate final SpringDataRechargeMoneyRepository rechargeMoneyRepository;\n//\t private final RechargeMoneyMapper rechargeMoneyMapper;\n\n\t@Override\n\tpublic void rechargeMoney(MemberMoney.MemberMoneyId memberMoneyId) {\n\n\t}\n}\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/adapter/out/persistence/SpringDataLocalMoneyRepository.java",
    "content": "package com.fastcampuspay.moneylocal.adapter.out.persistence;\n\nimport org.springframework.data.jpa.repository.JpaRepository;\n\ninterface SpringDataLocalMoneyRepository extends JpaRepository<LocalMoneyJpaEntity, Long> {\n}\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/application/port/in/RechargeMoneyCommand.java",
    "content": "package com.fastcampuspay.moneylocal.application.port.in;\n\n\nimport com.fastcampuspay.common.SelfValidating;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport javax.validation.constraints.NotNull;\n\n@Builder\n@Data\n@EqualsAndHashCode(callSuper = false)\npublic\nclass RechargeMoneyCommand extends SelfValidating<RechargeMoneyCommand> {\n\n    @NotNull\n    private final String name;\n\n    @NotNull\n    private final String email;\n\n    @NotNull\n    private final String address;\n\n    @NotNull\n    private final boolean isValid;\n\n    public RechargeMoneyCommand(String name, String email, String address, boolean isValid) {\n        this.name = name;\n        this.email = email;\n        this.address = address;\n        this.isValid = isValid;\n    }\n}\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/application/port/in/RechargeMoneyUseCase.java",
    "content": "package com.fastcampuspay.moneylocal.application.port.in;\n\npublic interface RechargeMoneyUseCase {\n\n\tvoid rechargeMoney(RechargeMoneyCommand command);\n}\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/application/port/out/RechargeMoneyPort.java",
    "content": "package com.fastcampuspay.moneylocal.application.port.out;\n\n\nimport com.fastcampuspay.moneylocal.domain.MemberMoney;\n\npublic interface RechargeMoneyPort {\n\n\tvoid rechargeMoney(\n\t\t\tMemberMoney.MemberMoneyId memberMoneyId\n\t);\n}\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/application/service/RechargeMoney.java",
    "content": "package com.fastcampuspay.moneylocal.application.service;\n\n\nimport com.fastcampuspay.common.UseCase;\nimport com.fastcampuspay.moneylocal.application.port.in.RechargeMoneyCommand;\nimport com.fastcampuspay.moneylocal.application.port.in.RechargeMoneyUseCase;\nimport lombok.RequiredArgsConstructor;\n\nimport javax.transaction.Transactional;\n\n@RequiredArgsConstructor\n@UseCase\n@Transactional\npublic class RechargeMoney implements RechargeMoneyUseCase {\n\n\n\t@Override\n\tpublic void rechargeMoney(RechargeMoneyCommand command) {\n\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "money-local-service/src/main/java/com/fastcampuspay/moneylocal/domain/MemberMoney.java",
    "content": "package com.fastcampuspay.moneylocal.domain;\n\nimport lombok.AccessLevel;\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.Value;\n\n@AllArgsConstructor(access = AccessLevel.PRIVATE)\npublic class MemberMoney {\n\t/**\n\t * The baseline balance of the account. This was the balance of the account before the first\n\t * activity in the activityWindow.\n\t */\n\t@Getter private final String memberMoneyId;\n//\t@Getter private final String name;\n//\t@Getter private final String email;\n//\t@Getter private final String address;\n//\t@Getter private final boolean isValid;\n\n\tpublic static MemberMoney generateMemberMoney(\n\t\t\tMemberMoneyId memberMoneyId) {\n\t\treturn new MemberMoney(\n\t\t\t\tmemberMoneyId.getMemberMoneyId()\n\t\t);\n\t}\n\n\t@Value\n\tpublic static class MemberMoneyId {\n\t\tpublic MemberMoneyId(String value) {\n\t\t\tthis.memberMoneyId = value;\n\t\t}\n\t\tString memberMoneyId ;\n\t}\n}\n"
  },
  {
    "path": "money-service/build.gradle",
    "content": "plugins {\n    id 'com.palantir.docker' version '0.25.0'\n}\n\next{\n    axonVersion = \"4.6.0\"\n}\n\ngroup = 'com.fastcampuspay.money'\nversion = '0.0.1-SNAPSHOT'\n\ndependencies {\n    implementation 'org.springframework.boot:spring-boot-starter-validation'\n    implementation 'org.springframework.boot:spring-boot-starter-actuator'\n    implementation 'org.springframework.boot:spring-boot-starter-web'\n    implementation group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'\n    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'\n    implementation group: 'org.axonframework', name: 'axon-configuration', version: \"$axonVersion\"\n    implementation group: 'org.axonframework', name: 'axon-spring-boot-starter', version: \"$axonVersion\"\n    implementation 'org.jetbrains:annotations:23.0.0'\n    implementation project(path: ':common')\n    // runtimeOnly 'com.h2database:h2'\n    runtimeOnly 'mysql:mysql-connector-java'\n}\n\ndocker {\n    println(tasks.bootJar.outputs.files)\n    name rootProject.name+'-'+project.name + \":\" + version\n    dockerfile file('../Dockerfile')\n    files tasks.bootJar.outputs.files\n    buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singleFile.name])\n}"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/MoneyApplication.java",
    "content": "package com.fastcampuspay.money;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class MoneyApplication {\n\n  public static void main(String[] args) {\n    SpringApplication.run(MoneyApplication.class, args);\n  }\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/MoneyConfiguration.java",
    "content": "package com.fastcampuspay.money;\n\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@EnableConfigurationProperties(MoneyConfigurationProperties.class)\npublic class MoneyConfiguration {\n\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/MoneyConfigurationProperties.java",
    "content": "package com.fastcampuspay.money;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n@Data\n@ConfigurationProperties(prefix = \"banking\")\npublic class MoneyConfigurationProperties {\n\n  private long transferThreshold = Long.MAX_VALUE;\n\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/SwaggerConfig.java",
    "content": "package com.fastcampuspay.money;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport springfox.documentation.builders.ApiInfoBuilder;\nimport springfox.documentation.builders.PathSelectors;\nimport springfox.documentation.builders.RequestHandlerSelectors;\nimport springfox.documentation.service.ApiInfo;\nimport springfox.documentation.spi.DocumentationType;\nimport springfox.documentation.spring.web.plugins.Docket;\nimport springfox.documentation.swagger2.annotations.EnableSwagger2;\n\n@Configuration\n@EnableSwagger2\npublic class SwaggerConfig {\n\n    @Bean\n    public Docket restAPI() {\n        return new Docket(DocumentationType.SWAGGER_2)\n                .apiInfo(apiInfo())\n                .select()\n                .apis(RequestHandlerSelectors.basePackage(\"com.fastcampuspay.money\"))\n                .paths(PathSelectors.any())\n                .build();\n    }\n\n    private ApiInfo apiInfo() {\n        return new ApiInfoBuilder()\n                .build();\n    }\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/adapter/in/web/FindMoneyController.java",
    "content": "package com.fastcampuspay.money.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass FindMoneyController {\n\n\t// private final RegisterBankingAccountUseCase registerBankingAccountUseCase;\n\n\t@GetMapping(path = \"/money/money-history\")\n\tResponseEntity<Object>  findMoneyHistoryByMemberId(){\n\t\t// RegisterMembershipRequest\n\t\t// name, address, email\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n\t@GetMapping(path = \"/money/money-info\")\n\tResponseEntity<Object>  findMoneyInfoByRechargeMoneyId(){\n\t\t// RegisterMembershipRequest\n\t\t// name, address, email\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/adapter/in/web/RechargeMoneyController.java",
    "content": "package com.fastcampuspay.money.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass RechargeMoneyController {\n\n\t// private final RechargeMoneyUseCase registerBankingAccountUseCase;\n\n\t@PostMapping(path = \"/money/recharge/\")\n\tResponseEntity<Object> rechargeMoney(){\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/adapter/in/web/RequestTransferMoneyController.java",
    "content": "package com.fastcampuspay.money.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass RequestTransferMoneyController {\n\n\t// private final RegisterBankingAccountUseCase registerBankingAccountUseCase;\n\n\t@PostMapping(path = \"/money/transfer\")\n\tResponseEntity<Object> requestTransferMoneyBetweenMembers(){\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/adapter/out/persistence/RechargeMoneyJpaEntity.java",
    "content": "package com.fastcampuspay.money.adapter.out.persistence;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\n\n@Entity\n@Table(name = \"recharge_money\")\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\nclass RechargeMoneyJpaEntity {\n\n\t@Id\n\t@GeneratedValue\n\tprivate Long rechargeMoneyId;\n\n//\tprivate String name;\n//\n//\tprivate String address;\n//\n//\tprivate String email;\n//\n//\tprivate boolean isValid;\n\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/adapter/out/persistence/RechargeMoneyMapper.java",
    "content": "package com.fastcampuspay.money.adapter.out.persistence;\n\nimport com.fastcampuspay.money.domain.MemberMoney;\nimport org.springframework.stereotype.Component;\n\n@Component\nclass RechargeMoneyMapper {\n\tMemberMoney mapToDomainEntity(\n\t\t\tRechargeMoneyJpaEntity rechargeMoneyJpaEntity) {\n\t\tSystem.out.println(rechargeMoneyJpaEntity.toString());\n\t\treturn MemberMoney.generateMemberMoney(\n\t\t\t\tnew MemberMoney.MemberMoneyId(rechargeMoneyJpaEntity.getRechargeMoneyId()+\"\")\n\t\t\t\t);\n\t}\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/adapter/out/persistence/RechargeMoneyPersistenceAdapter.java",
    "content": "package com.fastcampuspay.money.adapter.out.persistence;\n\nimport com.fastcampuspay.common.PersistenceAdapter;\nimport com.fastcampuspay.money.application.port.out.RechargeMoneyPort;\nimport com.fastcampuspay.money.domain.MemberMoney;\nimport lombok.RequiredArgsConstructor;\n\n@RequiredArgsConstructor\n@PersistenceAdapter\nclass RechargeMoneyPersistenceAdapter implements RechargeMoneyPort {\n\n//\tprivate final SpringDataRechargeMoneyRepository rechargeMoneyRepository;\n//\tprivate final RechargeMoneyMapper rechargeMoneyMapper;\n\n\t@Override\n\tpublic void rechargeMoney(MemberMoney.MemberMoneyId memberMoneyId) {\n\n\t}\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/adapter/out/persistence/SpringDataRechargeMoneyRepository.java",
    "content": "package com.fastcampuspay.money.adapter.out.persistence;\n\nimport org.springframework.data.jpa.repository.JpaRepository;\n\ninterface SpringDataRechargeMoneyRepository extends JpaRepository<RechargeMoneyJpaEntity, Long> {\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/application/port/in/RechargeMoneyCommand.java",
    "content": "package com.fastcampuspay.money.application.port.in;\n\n\nimport com.fastcampuspay.common.SelfValidating;\nimport lombok.Builder;\nimport lombok.EqualsAndHashCode;\nimport lombok.Value;\n\nimport javax.validation.constraints.NotNull;\n\n@Value\n@Builder\n@EqualsAndHashCode(callSuper = false)\npublic\nclass RechargeMoneyCommand extends SelfValidating<RechargeMoneyCommand> {\n\n    @NotNull\n    private final String name;\n\n    @NotNull\n    private final String email;\n\n    @NotNull\n    private final String address;\n\n    @NotNull\n    private final boolean isValid;\n\n    public RechargeMoneyCommand(String name, String email, String address, boolean isValid) {\n        this.name = name;\n        this.email = email;\n        this.address = address;\n        this.isValid = isValid;\n    }\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/application/port/in/RechargeMoneyUseCase.java",
    "content": "package com.fastcampuspay.money.application.port.in;\n\npublic interface RechargeMoneyUseCase {\n\n\tvoid rechargeMoney(RechargeMoneyCommand command);\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/application/port/out/RechargeMoneyPort.java",
    "content": "package com.fastcampuspay.money.application.port.out;\n\n\nimport com.fastcampuspay.money.domain.MemberMoney;\n\npublic interface RechargeMoneyPort {\n\n\tvoid rechargeMoney(\n\t\t\tMemberMoney.MemberMoneyId memberMoneyId\n\t);\n}\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/application/service/RechargeMoney.java",
    "content": "package com.fastcampuspay.money.application.service;\n\n\nimport com.fastcampuspay.common.UseCase;\nimport com.fastcampuspay.money.application.port.in.RechargeMoneyCommand;\nimport com.fastcampuspay.money.application.port.in.RechargeMoneyUseCase;\nimport com.fastcampuspay.money.application.port.out.RechargeMoneyPort;\nimport lombok.RequiredArgsConstructor;\n\nimport javax.transaction.Transactional;\n\n@RequiredArgsConstructor\n@UseCase\n@Transactional\npublic class RechargeMoney implements RechargeMoneyUseCase {\n\n\tprivate final RechargeMoneyPort rport;\n\n\t@Override\n\tpublic void rechargeMoney(RechargeMoneyCommand command) {\n\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "money-service/src/main/java/com/fastcampuspay/money/domain/MemberMoney.java",
    "content": "package com.fastcampuspay.money.domain;\n\nimport lombok.AccessLevel;\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.Value;\n\n@AllArgsConstructor(access = AccessLevel.PRIVATE)\npublic class MemberMoney {\n\t/**\n\t * The baseline balance of the account. This was the balance of the account before the first\n\t * activity in the activityWindow.\n\t */\n\t@Getter private final String memberMoneyId;\n//\t@Getter private final String name;\n//\t@Getter private final String email;\n//\t@Getter private final String address;\n//\t@Getter private final boolean isValid;\n\n\tpublic static MemberMoney generateMemberMoney(\n\t\t\tMemberMoneyId memberMoneyId) {\n\t\treturn new MemberMoney(\n\t\t\t\tmemberMoneyId.getMemberMoneyId()\n\t\t);\n\t}\n\n\t@Value\n\tpublic static class MemberMoneyId {\n\t\tpublic MemberMoneyId(String value) {\n\t\t\tthis.memberMoneyId = value;\n\t\t}\n\t\tString memberMoneyId ;\n\t}\n}\n"
  },
  {
    "path": "payment-service/build.gradle",
    "content": "plugins {\n    id 'com.palantir.docker' version '0.25.0'\n}\n\next{\n    axonVersion = \"4.6.0\"\n}\n\ngroup = 'com.fastcampuspay.payment'\nversion = '0.0.1-SNAPSHOT'\n\ndependencies {\n    implementation 'org.springframework.boot:spring-boot-starter-validation'\n    implementation 'org.springframework.boot:spring-boot-starter-actuator'\n    implementation 'org.springframework.boot:spring-boot-starter-web'\n    implementation group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'\n    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'\n    implementation group: 'org.axonframework', name: 'axon-configuration', version: \"$axonVersion\"\n    implementation group: 'org.axonframework', name: 'axon-spring-boot-starter', version: \"$axonVersion\"\n    implementation 'org.jetbrains:annotations:23.0.0'\n    implementation project(path: ':common')\n    // runtimeOnly 'com.h2database:h2'\n    runtimeOnly 'mysql:mysql-connector-java'\n}\n\ndocker {\n    println(tasks.bootJar.outputs.files)\n    name rootProject.name+'-'+project.name + \":\" + version\n    dockerfile file('../Dockerfile')\n    files tasks.bootJar.outputs.files\n    buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singleFile.name])\n}"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/PaymentApplication.java",
    "content": "package com.fastcampuspay.payment;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class PaymentApplication {\n\n  public static void main(String[] args) {\n    SpringApplication.run(PaymentApplication.class, args);\n  }\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/PaymentConfiguration.java",
    "content": "package com.fastcampuspay.payment;\n\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@EnableConfigurationProperties(PaymentConfigurationProperties.class)\npublic class PaymentConfiguration {\n\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/PaymentConfigurationProperties.java",
    "content": "package com.fastcampuspay.payment;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n@Data\n@ConfigurationProperties(prefix = \"banking\")\npublic class PaymentConfigurationProperties {\n\n  private long transferThreshold = Long.MAX_VALUE;\n\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/SwaggerConfig.java",
    "content": "package com.fastcampuspay.payment;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport springfox.documentation.builders.ApiInfoBuilder;\nimport springfox.documentation.builders.PathSelectors;\nimport springfox.documentation.builders.RequestHandlerSelectors;\nimport springfox.documentation.service.ApiInfo;\nimport springfox.documentation.spi.DocumentationType;\nimport springfox.documentation.spring.web.plugins.Docket;\nimport springfox.documentation.swagger2.annotations.EnableSwagger2;\n\n@Configuration\n@EnableSwagger2\npublic class SwaggerConfig {\n\n    @Bean\n    public Docket restAPI() {\n        return new Docket(DocumentationType.SWAGGER_2)\n                .apiInfo(apiInfo())\n                .select()\n                .apis(RequestHandlerSelectors.basePackage(\"com.fastcampuspay.money\"))\n                .paths(PathSelectors.any())\n                .build();\n    }\n\n    private ApiInfo apiInfo() {\n        return new ApiInfoBuilder()\n                .build();\n    }\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/adapter/in/web/FindPaymentController.java",
    "content": "package com.fastcampuspay.payment.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass FindPaymentController {\n\n\t// private final RegisterBankingAccountUseCase registerBankingAccountUseCase;\n\n\t@GetMapping(path = \"/payment/info\")\n\tResponseEntity<Object>  findPaymentByPaymentId(){\n\t\t// RegisterMembershipRequest\n\t\t// name, address, email\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n\t@GetMapping(path = \"/payment/list-by-period\")\n\tResponseEntity<Object>  listPaymentsByPeriod(){\n\t\t// RegisterMembershipRequest\n\t\t// name, address, email\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/adapter/in/web/RequestTransferMoneyController.java",
    "content": "package com.fastcampuspay.payment.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass RequestTransferMoneyController {\n\n\t// private final RegisterBankingAccountUseCase registerBankingAccountUseCase;\n\n\t@PostMapping(path = \"/payment/request\")\n\tResponseEntity<Object> requestPaymentAtMerchant(){\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/adapter/out/persistence/PaymentJpaEntity.java",
    "content": "package com.fastcampuspay.payment.adapter.out.persistence;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\n\n@Entity\n@Table(name = \"payment\")\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\nclass PaymentJpaEntity {\n\n\t@Id\n\t@GeneratedValue\n\tprivate Long rechargeMoneyId;\n\n//\tprivate String name;\n//\n//\tprivate String address;\n//\n//\tprivate String email;\n//\n//\tprivate boolean isValid;\n\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/adapter/out/persistence/PaymentMapper.java",
    "content": "package com.fastcampuspay.payment.adapter.out.persistence;\n\nimport com.fastcampuspay.payment.domain.MemberMoney;\nimport org.springframework.stereotype.Component;\n\n@Component\nclass PaymentMapper {\n\tMemberMoney mapToDomainEntity(\n\t\t\tPaymentJpaEntity rechargeMoneyJpaEntity) {\n\t\tSystem.out.println(rechargeMoneyJpaEntity.toString());\n\t\treturn MemberMoney.generateMemberMoney(\n\t\t\t\tnew MemberMoney.MemberMoneyId(rechargeMoneyJpaEntity.getRechargeMoneyId()+\"\")\n\t\t\t\t);\n\t}\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/adapter/out/persistence/RechargeMoneyPersistenceAdapter.java",
    "content": "package com.fastcampuspay.payment.adapter.out.persistence;\n\nimport com.fastcampuspay.common.PersistenceAdapter;\nimport com.fastcampuspay.payment.application.port.out.RechargeMoneyPort;\nimport com.fastcampuspay.payment.domain.MemberMoney;\nimport lombok.RequiredArgsConstructor;\n\n@RequiredArgsConstructor\n@PersistenceAdapter\nclass PaymentPersistenceAdapter implements RechargeMoneyPort {\n\n//\tprivate final SpringDataRechargeMoneyRepository rechargeMoneyRepository;\n//\tprivate final RechargeMoneyMapper rechargeMoneyMapper;\n\n\n\t@Override\n\tpublic void rechargeMoney(MemberMoney.MemberMoneyId memberMoneyId) {\n\n\t}\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/adapter/out/persistence/SpringDataPaymentRepository.java",
    "content": "package com.fastcampuspay.payment.adapter.out.persistence;\n\nimport org.springframework.data.jpa.repository.JpaRepository;\n\ninterface SpringDataPaymentRepository extends JpaRepository<PaymentJpaEntity, Long> {\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/application/port/in/RechargeMoneyCommand.java",
    "content": "package com.fastcampuspay.payment.application.port.in;\n\n\nimport com.fastcampuspay.common.SelfValidating;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\nimport javax.validation.constraints.NotNull;\n\n@Data\n@Builder\n@EqualsAndHashCode(callSuper = false)\npublic\nclass RechargeMoneyCommand extends SelfValidating<RechargeMoneyCommand> {\n\n    @NotNull\n    private final String name;\n\n    @NotNull\n    private final String email;\n\n    @NotNull\n    private final String address;\n\n    @NotNull\n    private final boolean isValid;\n\n    public RechargeMoneyCommand(String name, String email, String address, boolean isValid) {\n        this.name = name;\n        this.email = email;\n        this.address = address;\n        this.isValid = isValid;\n    }\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/application/port/in/RechargeMoneyUseCase.java",
    "content": "package com.fastcampuspay.payment.application.port.in;\n\npublic interface RechargeMoneyUseCase {\n\n\tvoid rechargeMoney(RechargeMoneyCommand command);\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/application/port/out/RechargeMoneyPort.java",
    "content": "package com.fastcampuspay.payment.application.port.out;\n\n\nimport com.fastcampuspay.payment.domain.MemberMoney;\n\npublic interface RechargeMoneyPort {\n\n\tvoid rechargeMoney(\n\t\t\tMemberMoney.MemberMoneyId memberMoneyId\n\t);\n}\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/application/service/RechargeMoney.java",
    "content": "package com.fastcampuspay.payment.application.service;\n\n\nimport com.fastcampuspay.common.UseCase;\nimport com.fastcampuspay.payment.application.port.in.RechargeMoneyCommand;\nimport com.fastcampuspay.payment.application.port.in.RechargeMoneyUseCase;\nimport lombok.RequiredArgsConstructor;\n\nimport javax.transaction.Transactional;\n\n@RequiredArgsConstructor\n@UseCase\n@Transactional\npublic class RechargeMoney implements RechargeMoneyUseCase {\n\n\t@Override\n\tpublic void rechargeMoney(RechargeMoneyCommand command) {\n\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "payment-service/src/main/java/com/fastcampuspay/payment/domain/MemberMoney.java",
    "content": "package com.fastcampuspay.payment.domain;\n\nimport lombok.AccessLevel;\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.Value;\n\n@AllArgsConstructor(access = AccessLevel.PRIVATE)\npublic class MemberMoney {\n\t/**\n\t * The baseline balance of the account. This was the balance of the account before the first\n\t * activity in the activityWindow.\n\t */\n\t@Getter private final String memberMoneyId;\n//\t@Getter private final String name;\n//\t@Getter private final String email;\n//\t@Getter private final String address;\n//\t@Getter private final boolean isValid;\n\n\tpublic static MemberMoney generateMemberMoney(\n\t\t\tMemberMoneyId memberMoneyId) {\n\t\treturn new MemberMoney(\n\t\t\t\tmemberMoneyId.getMemberMoneyId()\n\t\t);\n\t}\n\n\t@Value\n\tpublic static class MemberMoneyId {\n\t\tpublic MemberMoneyId(String value) {\n\t\t\tthis.memberMoneyId = value;\n\t\t}\n\t\tString memberMoneyId ;\n\t}\n}\n"
  },
  {
    "path": "remittance-service/build.gradle",
    "content": "plugins {\n    id 'com.palantir.docker' version '0.25.0'\n}\n\next{\n    axonVersion = \"4.6.0\"\n}\n\ngroup = 'com.fastcampuspay.remittance'\nversion = '0.0.1-SNAPSHOT'\n\ndependencies {\n    implementation 'org.springframework.boot:spring-boot-starter-validation'\n    implementation 'org.springframework.boot:spring-boot-starter-actuator'\n    implementation 'org.springframework.boot:spring-boot-starter-web'\n    implementation group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'\n    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'\n    implementation group: 'org.axonframework', name: 'axon-configuration', version: \"$axonVersion\"\n    implementation group: 'org.axonframework', name: 'axon-spring-boot-starter', version: \"$axonVersion\"\n    implementation 'org.jetbrains:annotations:23.0.0'\n    implementation project(path: ':common')\n    // runtimeOnly 'com.h2database:h2'\n    runtimeOnly 'mysql:mysql-connector-java'\n}\n\ndocker {\n    println(tasks.bootJar.outputs.files)\n    name rootProject.name+'-'+project.name + \":\" + version\n    dockerfile file('../Dockerfile')\n    files tasks.bootJar.outputs.files\n    buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singleFile.name])\n}"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/RemittanceApplication.java",
    "content": "package com.fastcampuspay.remittance;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class RemittanceApplication {\n\n  public static void main(String[] args) {\n    SpringApplication.run(RemittanceApplication.class, args);\n  }\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/RemittanceConfiguration.java",
    "content": "package com.fastcampuspay.remittance;\n\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@EnableConfigurationProperties(RemittanceConfigurationProperties.class)\npublic class RemittanceConfiguration {\n\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/RemittanceConfigurationProperties.java",
    "content": "package com.fastcampuspay.remittance;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n@Data\n@ConfigurationProperties(prefix = \"banking\")\npublic class RemittanceConfigurationProperties {\n\n  private long transferThreshold = Long.MAX_VALUE;\n\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/SwaggerConfig.java",
    "content": "package com.fastcampuspay.remittance;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport springfox.documentation.builders.ApiInfoBuilder;\nimport springfox.documentation.builders.PathSelectors;\nimport springfox.documentation.builders.RequestHandlerSelectors;\nimport springfox.documentation.service.ApiInfo;\nimport springfox.documentation.spi.DocumentationType;\nimport springfox.documentation.spring.web.plugins.Docket;\nimport springfox.documentation.swagger2.annotations.EnableSwagger2;\n\n@Configuration\n@EnableSwagger2\npublic class SwaggerConfig {\n\n    @Bean\n    public Docket restAPI() {\n        return new Docket(DocumentationType.SWAGGER_2)\n                .apiInfo(apiInfo())\n                .select()\n                .apis(RequestHandlerSelectors.basePackage(\"com.fastcampuspay.remittance\"))\n                .paths(PathSelectors.any())\n                .build();\n    }\n\n    private ApiInfo apiInfo() {\n        return new ApiInfoBuilder()\n                .build();\n    }\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/adapter/in/web/FindRemittanceController.java",
    "content": "package com.fastcampuspay.remittance.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass FindRemittanceController {\n\n\t// private final RegisterBankingAccountUseCase registerBankingAccountUseCase;\n\n\t@GetMapping(path = \"/remittance/info\")\n\tResponseEntity<Object>  findRemittanceInfoByRemittanceId(){\n\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n\n\t@GetMapping(path = \"/remittance/history\")\n\tResponseEntity<Object>  findRemittanceHistoryByMemberId(){\n\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n\t// (API Aggregation, Banking + Money)\n\t@GetMapping(path = \"/remittance/transferred-money\")\n\tResponseEntity<Object>  findMoneyTransferringByRemittanceId(){\n\n\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/adapter/in/web/RequestRemittanceMoneyController.java",
    "content": "package com.fastcampuspay.remittance.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass RequestRemittanceMoneyController {\n\n\t// private final RechargeMoneyUseCase registerBankingAccountUseCase;\n\n\t@PostMapping(path = \"/remittance/request/\")\n\tResponseEntity<Object> requestRemittance(){\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/adapter/out/persistence/RemittanceMoneyJpaEntity.java",
    "content": "package com.fastcampuspay.remittance.adapter.out.persistence;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\n\n@Entity\n@Table(name = \"remittance_money\")\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\nclass RemittanceMoneyJpaEntity {\n\t@Id\n\t@GeneratedValue\n\tprivate Long remittanceMoneyId;\n\n//\tprivate String name;\n//\n//\tprivate String address;\n//\n//\tprivate String email;\n//\n//\tprivate boolean isValid;\n\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/adapter/out/persistence/RemittanceMoneyMapper.java",
    "content": "package com.fastcampuspay.remittance.adapter.out.persistence;\n\nimport com.fastcampuspay.remittance.domain.RemittanceMoney;\nimport org.springframework.stereotype.Component;\n\n@Component\nclass RemittanceMoneyMapper {\n\tRemittanceMoney mapToDomainEntity(\n\t\t\tRemittanceMoneyJpaEntity remittanceMoneyJpaEntity) {\n\t\tSystem.out.println(remittanceMoneyJpaEntity.toString());\n\t\treturn RemittanceMoney.generateRemittanceMoney(\n\t\t\t\tnew RemittanceMoney.RemittanceMoneyId(remittanceMoneyJpaEntity.getRemittanceMoneyId()+\"\")\n\t\t\t\t);\n\t}\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/adapter/out/persistence/RemittanceMoneyPersistenceAdapter.java",
    "content": "package com.fastcampuspay.remittance.adapter.out.persistence;\n\nimport com.fastcampuspay.common.PersistenceAdapter;\nimport com.fastcampuspay.remittance.application.port.out.RemittanceMoneyPort;\nimport com.fastcampuspay.remittance.domain.RemittanceMoney;\nimport lombok.RequiredArgsConstructor;\n\n@RequiredArgsConstructor\n@PersistenceAdapter\nclass RemittanceMoneyPersistenceAdapter implements RemittanceMoneyPort {\n\n\tprivate final SpringDataRemittanceMoneyRepository remittanceMoneyRepository;\n\t private final RemittanceMoneyMapper remittanceMoneyMapper;\n\n\tprivate Long orZero(Long value){\n\t\treturn value == null ? 0L : value;\n\t}\n\n\t@Override\n\tpublic void remittanceMoney(RemittanceMoney.RemittanceMoneyId remittanceMoneyId) {\n\n\t}\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/adapter/out/persistence/SpringDataRemittanceMoneyRepository.java",
    "content": "package com.fastcampuspay.remittance.adapter.out.persistence;\n\nimport org.springframework.data.jpa.repository.JpaRepository;\n\ninterface SpringDataRemittanceMoneyRepository extends JpaRepository<RemittanceMoneyJpaEntity, Long> {\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/application/port/in/RemittanceMoneyCommand.java",
    "content": "package com.fastcampuspay.remittance.application.port.in;\n\n\nimport com.fastcampuspay.common.SelfValidating;\nimport lombok.Builder;\nimport lombok.EqualsAndHashCode;\nimport lombok.Value;\n\nimport javax.validation.constraints.NotNull;\n\n@Value\n@Builder\n@EqualsAndHashCode(callSuper = false)\npublic\nclass RemittanceMoneyCommand extends SelfValidating<RemittanceMoneyCommand> {\n\n    @NotNull\n    private final String name;\n\n    @NotNull\n    private final String email;\n\n    @NotNull\n    private final String address;\n\n    @NotNull\n    private final boolean isValid;\n\n    public RemittanceMoneyCommand(String name, String email, String address, boolean isValid) {\n        this.name = name;\n        this.email = email;\n        this.address = address;\n        this.isValid = isValid;\n    }\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/application/port/in/RemittanceMoneyUseCase.java",
    "content": "package com.fastcampuspay.remittance.application.port.in;\n\npublic interface RemittanceMoneyUseCase {\n\n\tvoid remittanceMoney(RemittanceMoneyCommand command);\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/application/port/out/RemittanceMoneyPort.java",
    "content": "package com.fastcampuspay.remittance.application.port.out;\n\n\nimport com.fastcampuspay.remittance.domain.RemittanceMoney;\n\npublic interface RemittanceMoneyPort {\n\n\tvoid remittanceMoney(\n\t\t\tRemittanceMoney.RemittanceMoneyId remittanceMoneyId\n\t);\n}\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/application/service/RemittanceMoney.java",
    "content": "package com.fastcampuspay.remittance.application.service;\n\n\nimport com.fastcampuspay.common.UseCase;\nimport com.fastcampuspay.remittance.application.port.in.RemittanceMoneyCommand;\nimport com.fastcampuspay.remittance.application.port.in.RemittanceMoneyUseCase;\nimport com.fastcampuspay.remittance.application.port.out.RemittanceMoneyPort;\nimport lombok.RequiredArgsConstructor;\n\nimport javax.transaction.Transactional;\n\n@RequiredArgsConstructor\n@UseCase\n@Transactional\npublic class RemittanceMoney implements RemittanceMoneyUseCase {\n\n\tprivate final RemittanceMoneyPort rport;\n\n\t@Override\n\tpublic void remittanceMoney(RemittanceMoneyCommand command) {\n\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "remittance-service/src/main/java/com/fastcampuspay/remittance/domain/RemittanceMoney.java",
    "content": "package com.fastcampuspay.remittance.domain;\n\nimport lombok.AccessLevel;\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.Value;\n\n@AllArgsConstructor(access = AccessLevel.PRIVATE)\npublic class RemittanceMoney {\n\t/**\n\t * The baseline balance of the account. This was the balance of the account before the first\n\t * activity in the activityWindow.\n\t */\n\t@Getter private final String memberMoneyId;\n//\t@Getter private final String name;\n//\t@Getter private final String email;\n//\t@Getter private final String address;\n//\t@Getter private final boolean isValid;\n\n\tpublic static RemittanceMoney generateRemittanceMoney(\n\t\t\tRemittanceMoneyId memberMoneyId) {\n\t\treturn new RemittanceMoney(\n\t\t\t\tmemberMoneyId.getRemittanceMoney()\n\t\t);\n\t}\n\n\t@Value\n\tpublic static class RemittanceMoneyId {\n\t\tpublic RemittanceMoneyId(String value) {\n\t\t\tthis.remittanceMoney = value;\n\t\t}\n\t\tString remittanceMoney ;\n\t}\n}\n"
  },
  {
    "path": "settings.gradle",
    "content": "rootProject.name = 'fastcampus-pay'\n\ninclude 'common'\ninclude 'membership-service'\ninclude 'banking-service'\ninclude 'money-service'\ninclude 'money-local-service'\ninclude 'remittance-service'\ninclude 'payment-service'\ninclude 'settlement-service'"
  },
  {
    "path": "settlement-service/build.gradle",
    "content": "plugins {\n    id 'com.palantir.docker' version '0.25.0'\n}\n\next{\n    axonVersion = \"4.6.0\"\n}\n\ngroup = 'com.fastcampuspay.settlement'\nversion = '0.0.1-SNAPSHOT'\n\ndependencies {\n    implementation 'org.springframework.boot:spring-boot-starter-validation'\n    implementation 'org.springframework.boot:spring-boot-starter-actuator'\n    implementation 'org.springframework.boot:spring-boot-starter-web'\n    implementation group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'\n    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'\n    implementation group: 'org.axonframework', name: 'axon-configuration', version: \"$axonVersion\"\n    implementation group: 'org.axonframework', name: 'axon-spring-boot-starter', version: \"$axonVersion\"\n    implementation 'org.jetbrains:annotations:23.0.0'\n    implementation project(path: ':common')\n    // runtimeOnly 'com.h2database:h2'\n    runtimeOnly 'mysql:mysql-connector-java'\n}\n\ndocker {\n    println(tasks.bootJar.outputs.files)\n    name rootProject.name+'-'+project.name + \":\" + version\n    dockerfile file('../Dockerfile')\n    files tasks.bootJar.outputs.files\n    buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singleFile.name])\n}"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/SettlementApplication.java",
    "content": "package com.fastcampuspay.settlement;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class SettlementApplication {\n\n  public static void main(String[] args) {\n    SpringApplication.run(SettlementApplication.class, args);\n  }\n}\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/SettlementConfiguration.java",
    "content": "package com.fastcampuspay.settlement;\n\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\n@EnableConfigurationProperties(SettlementConfigurationProperties.class)\npublic class SettlementConfiguration {\n\n}\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/SettlementConfigurationProperties.java",
    "content": "package com.fastcampuspay.settlement;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\n\n@Data\n@ConfigurationProperties(prefix = \"banking\")\npublic class SettlementConfigurationProperties {\n\n  private long transferThreshold = Long.MAX_VALUE;\n\n}\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/SwaggerConfig.java",
    "content": "package com.fastcampuspay.settlement;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport springfox.documentation.builders.ApiInfoBuilder;\nimport springfox.documentation.builders.PathSelectors;\nimport springfox.documentation.builders.RequestHandlerSelectors;\nimport springfox.documentation.service.ApiInfo;\nimport springfox.documentation.spi.DocumentationType;\nimport springfox.documentation.spring.web.plugins.Docket;\nimport springfox.documentation.swagger2.annotations.EnableSwagger2;\n\n@Configuration\n@EnableSwagger2\npublic class SwaggerConfig {\n\n    @Bean\n    public Docket restAPI() {\n        return new Docket(DocumentationType.SWAGGER_2)\n                .apiInfo(apiInfo())\n                .select()\n                .apis(RequestHandlerSelectors.basePackage(\"com.fastcampuspay.money\"))\n                .paths(PathSelectors.any())\n                .build();\n    }\n\n    private ApiInfo apiInfo() {\n        return new ApiInfoBuilder()\n                .build();\n    }\n}\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/adapter/in/web/SettlementStartController.java",
    "content": "package com.fastcampuspay.settlement.adapter.in.web;\n\nimport com.fastcampuspay.common.WebAdapter;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@WebAdapter\n@RestController\n@RequiredArgsConstructor\nclass SettlementStartController {\n\n\t// private final RegisterBankingAccountUseCase registerBankingAccountUseCase;\n\n\t@PostMapping(path = \"/settlement/start\")\n\tResponseEntity<Object> startSettlementByPeriod(){\n\t\treturn ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).build();\n\t}\n\n}\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/adapter/out/persistence/RechargeMoneyMapper.java",
    "content": "package com.fastcampuspay.settlement.adapter.out.persistence;\n\nimport com.fastcampuspay.settlement.domain.MemberMoney;\nimport org.springframework.stereotype.Component;\n\n@Component\nclass SettlementMapper {\n\tMemberMoney mapToDomainEntity(\n\t\t\tSettlementJpaEntity rechargeMoneyJpaEntity) {\n\t\tSystem.out.println(rechargeMoneyJpaEntity.toString());\n\t\treturn MemberMoney.generateMemberMoney(\n\t\t\t\tnew MemberMoney.MemberMoneyId(rechargeMoneyJpaEntity.getRechargeMoneyId()+\"\")\n\t\t\t\t);\n\t}\n}\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/adapter/out/persistence/RechargeMoneyPersistenceAdapter.java",
    "content": "package com.fastcampuspay.settlement.adapter.out.persistence;\n\nimport com.fastcampuspay.common.PersistenceAdapter;\nimport com.fastcampuspay.settlement.application.port.out.RechargeMoneyPort;\nimport com.fastcampuspay.settlement.domain.MemberMoney;\nimport lombok.RequiredArgsConstructor;\n\n@RequiredArgsConstructor\n@PersistenceAdapter\nclass RechargeMoneyPersistenceAdapter implements RechargeMoneyPort {\n\n//\tprivate final SpringDataRechargeMoneyRepository rechargeMoneyRepository;\n//\t private final RechargeMoneyMapper rechargeMoneyMapper;\n\t@Override\n\tpublic void rechargeMoney(MemberMoney.MemberMoneyId memberMoneyId) {\n\n\t}\n}\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/adapter/out/persistence/SettlementJpaEntity.java",
    "content": "package com.fastcampuspay.settlement.adapter.out.persistence;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\n\n@Entity\n@Table(name = \"settlement\")\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\nclass SettlementJpaEntity {\n\n\t@Id\n\t@GeneratedValue\n\tprivate Long rechargeMoneyId;\n\n//\tprivate String name;\n//\n//\tprivate String address;\n//\n//\tprivate String email;\n//\n//\tprivate boolean isValid;\n\n}\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/adapter/out/persistence/SpringDataSettlementRepository.java",
    "content": "package com.fastcampuspay.settlement.adapter.out.persistence;\n\nimport org.springframework.data.jpa.repository.JpaRepository;\n\ninterface SpringDataSettlementRepository extends JpaRepository<SettlementJpaEntity, Long> {\n}\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/application/port/in/RechargeMoneyCommand.java",
    "content": "package com.fastcampuspay.settlement.application.port.in;\n\n\nimport com.fastcampuspay.common.SelfValidating;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.Value;\n\nimport javax.validation.constraints.NotNull;\n\n@Data\n@Builder\n@EqualsAndHashCode(callSuper = false)\npublic\nclass RechargeMoneyCommand extends SelfValidating<RechargeMoneyCommand> {\n\n    @NotNull\n    private final String name;\n\n    @NotNull\n    private final String email;\n\n    @NotNull\n    private final String address;\n\n    @NotNull\n    private final boolean isValid;\n\n    public RechargeMoneyCommand(String name, String email, String address, boolean isValid) {\n        this.name = name;\n        this.email = email;\n        this.address = address;\n        this.isValid = isValid;\n    }\n}\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/application/port/in/RechargeMoneyUseCase.java",
    "content": "package com.fastcampuspay.settlement.application.port.in;\n\npublic interface RechargeMoneyUseCase {\n\n\tvoid rechargeMoney(RechargeMoneyCommand command);\n}\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/application/port/out/RechargeMoneyPort.java",
    "content": "package com.fastcampuspay.settlement.application.port.out;\n\n\nimport com.fastcampuspay.settlement.domain.MemberMoney;\n\npublic interface RechargeMoneyPort {\n\n\tvoid rechargeMoney(\n\t\t\tMemberMoney.MemberMoneyId memberMoneyId\n\t);\n}\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/application/service/RechargeMoney.java",
    "content": "package com.fastcampuspay.settlement.application.service;\n\n\nimport com.fastcampuspay.common.UseCase;\nimport com.fastcampuspay.settlement.application.port.in.RechargeMoneyCommand;\nimport com.fastcampuspay.settlement.application.port.in.RechargeMoneyUseCase;\nimport lombok.RequiredArgsConstructor;\n\nimport javax.transaction.Transactional;\n\n@RequiredArgsConstructor\n@UseCase\n@Transactional\npublic class RechargeMoney implements RechargeMoneyUseCase {\n\n\t@Override\n\tpublic void rechargeMoney(RechargeMoneyCommand command) {\n\n\t}\n}\n\n\n\n\n"
  },
  {
    "path": "settlement-service/src/main/java/com/fastcampuspay/settlement/domain/MemberMoney.java",
    "content": "package com.fastcampuspay.settlement.domain;\n\nimport lombok.AccessLevel;\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.Value;\n\n@AllArgsConstructor(access = AccessLevel.PRIVATE)\npublic class MemberMoney {\n\t/**\n\t * The baseline balance of the account. This was the balance of the account before the first\n\t * activity in the activityWindow.\n\t */\n\t@Getter private final String memberMoneyId;\n//\t@Getter private final String name;\n//\t@Getter private final String email;\n//\t@Getter private final String address;\n//\t@Getter private final boolean isValid;\n\n\tpublic static MemberMoney generateMemberMoney(\n\t\t\tMemberMoneyId memberMoneyId) {\n\t\treturn new MemberMoney(\n\t\t\t\tmemberMoneyId.getMemberMoneyId()\n\t\t);\n\t}\n\n\t@Value\n\tpublic static class MemberMoneyId {\n\t\tpublic MemberMoneyId(String value) {\n\t\t\tthis.memberMoneyId = value;\n\t\t}\n\t\tString memberMoneyId ;\n\t}\n}\n"
  }
]