Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Publish Account Service API Package

on:
push:
tags:
- 'v*'

permissions:
contents: read
packages: write

jobs:
publish-to-github-packages:
runs-on: ubuntu-latest

steps:
- name: 저장소 코드 가져오기 (Checkout)
uses: actions/checkout@v4

- name: JDK 21 설치
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
- name: Gradle 캐시 설정
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('account-service/**/*.gradle*', 'account-service/**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: gradlew 실행 권한 부여
working-directory: account-service
run: chmod +x ./gradlew

- name: 태그 이름에서 버전 정보 추출 (e.g. v1.0.0 -> 1.0.0)
run: echo "VERSION_TAG=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV

- name: Gradle로 GitHub Packages에 배포
working-directory: account-service
run: ./gradlew publish -Pversion=${{ env.VERSION_TAG }}
env:
GITHUB_ACTOR: ${{ github.actor }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
44 changes: 43 additions & 1 deletion account-service/account-service-api/build.gradle
Original file line number Diff line number Diff line change
@@ -1,9 +1,51 @@
plugins {
id 'java-library'
id 'maven-publish'
}

group = 'com.github.DongHyeonKa'
version = '1.0.0'

repositories {
mavenCentral()
}

ext {
set('springCloudVersion', "2022.0.4")
set('eventuateTramVersion', "0.35.0.RELEASE")
set('eventuateTramSagasVersion', "0.24.0.RELEASE")
set('eventuateCommonVersion', "0.19.0.RELEASE")
}

dependencies {

// Eventuate Tram Aggregate Domain Events
implementation "io.eventuate.tram.core:eventuate-tram-aggregate-domain-events:${eventuateTramVersion}"
// Validation
implementation 'org.springframework.boot:spring-boot-starter-validation'
// Spring Web
implementation 'org.springframework.boot:spring-boot-starter-web'
// Lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}

publishing {
publications {
mavenJava(MavenPublication) {
artifactId = 'account-service-api'
from components.java
}
}
repositories {
maven {
name = "GithubPackages"
url = "https://maven.pkg.github.com/DongHyeonKa/Account-server"
credentials {
username = System.getenv("GITHUB_ACTOR")
password = System.getenv("GITHUB_TOKEN")
}
}
}
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.synapse.account_service_api.event;

import java.util.UUID;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PUBLIC)
public class SubscriptionCreatedEvent implements SubscriptionDomainEvent {
private UUID subscriptionId;
private UUID userId;
private String subscriptionTier;
private int maxSubscriptionCount;
private String nextRenewalDate;

@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}

@Override
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, o);
}

@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.synapse.account_service_api.event;

import io.eventuate.tram.events.common.DomainEvent;

public interface SubscriptionDomainEvent extends DomainEvent {

}
30 changes: 29 additions & 1 deletion account-service/account-service/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,41 @@ repositories {

dependencies {
implementation project(':account-service-api')

// Simple DSL
implementation "io.eventuate.tram.sagas:eventuate-tram-sagas-spring-orchestration-simple-dsl-starter:${eventuateTramSagasVersion}"
// Saga Participant
implementation "io.eventuate.tram.sagas:eventuate-tram-sagas-spring-participant-starter:${eventuateTramSagasVersion}"
// Eventuate Tram JDBC
implementation "io.eventuate.tram.core:eventuate-tram-spring-jdbc-kafka:${eventuateTramVersion}"
// Security
implementation 'org.springframework.boot:spring-boot-starter-security'
// Auth0
implementation 'com.auth0:java-jwt:4.4.0'
// JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// PostgreSQL
runtimeOnly 'org.postgresql:postgresql'
// OAuth2 Client
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
// OAuth2 Resource Server
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
//Spring Actuator
implementation 'org.springframework.boot:spring-boot-starter-actuator'
//Spring Prometheus
implementation 'io.micrometer:micrometer-registry-prometheus'
//Redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
//QueryDSL
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
// test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
testImplementation 'org.springframework.security:spring-security-test'
//H2 Database
implementation 'com.h2database:h2'
}

def generated = 'src/main/generated'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
@Index(name = "idx_member_username", columnList = "username")
})
public class Member extends BaseEntity {

@Id
@Column(name = "member_id", columnDefinition = "uuid")
private UUID id;
Expand Down Expand Up @@ -76,9 +75,9 @@ public static ResultWithDomainEvents<Member, MemberDomainEvent> register(
.role(MemberRole.USER)
.build();

MemberRegisteredEvent event = new MemberRegisteredEvent(userId, email, username);
MemberRegisteredEvent memberEvent = new MemberRegisteredEvent(userId, email, username);

return new ResultWithDomainEvents<>(member, event);
return new ResultWithDomainEvents<>(member, memberEvent);
}

public static ResultWithDomainEvents<Member, MemberDomainEvent> linkSocialAccount(
Expand All @@ -91,9 +90,9 @@ public static ResultWithDomainEvents<Member, MemberDomainEvent> linkSocialAccoun
.role(MemberRole.USER)
.build();

SocialAccountLinkedEvent event = new SocialAccountLinkedEvent(userId, provider, registrationId);
SocialAccountLinkedEvent socialEvent = new SocialAccountLinkedEvent(userId, provider, registrationId);

return new ResultWithDomainEvents<>(member, event);
return new ResultWithDomainEvents<>(member, socialEvent);
}

public void setSubscription(Subscription subscription) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package com.synapse.account_service.domain.entity;

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

import com.synapse.account_service.domain.common.BaseTimeEntity;
import com.synapse.account_service.domain.enums.SubscriptionTier;
import com.synapse.account_service_api.event.SubscriptionCreatedEvent;
import com.synapse.account_service_api.event.SubscriptionDomainEvent;

import io.eventuate.tram.events.aggregates.ResultWithDomainEvents;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
Expand All @@ -17,8 +21,10 @@
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "subscription")
public class Subscription extends BaseTimeEntity {

private static final DateTimeFormatter FORMATTING_PATTERN = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

@Id
@GeneratedValue(strategy = GenerationType.UUID)
@Column(name = "subscription_id")
private UUID id;

Expand All @@ -34,12 +40,34 @@ public class Subscription extends BaseTimeEntity {
private ZonedDateTime nextRenewalDate;

@Builder
public Subscription(Member member, SubscriptionTier tier, ZonedDateTime nextRenewalDate) {
public Subscription(UUID id, Member member, SubscriptionTier tier, ZonedDateTime nextRenewalDate) {
this.id = id;
this.member = member;
this.tier = tier;
this.nextRenewalDate = nextRenewalDate;
}

public static ResultWithDomainEvents<Subscription, SubscriptionDomainEvent> register(
UUID userId, Member member, SubscriptionTier tier, ZonedDateTime nextRenewalDate
) {
Subscription subscription = Subscription.builder()
.id(UUID.randomUUID())
.member(member)
.tier(tier)
.nextRenewalDate(nextRenewalDate)
.build();

SubscriptionCreatedEvent subscriptionEvent = new SubscriptionCreatedEvent(
subscription.getId(),
userId,
tier.name(),
tier.getMaxSubscriptionCount(),
nextRenewalDate.format(FORMATTING_PATTERN)
);

return new ResultWithDomainEvents<>(subscription, subscriptionEvent);
}

protected void setMemberInternal(Member member) {
this.member = member;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,48 @@
package com.synapse.account_service.domain.enums;

import java.util.Collections;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public enum SubscriptionTier {
FREE,
PRO
FREE("FREE", 0, 3),
PRO("PRO", 0, 100)
;

private final String SubscriptionTierName;
private final int currentSubscriptionCount;
private final int maxSubscriptionCount;

private SubscriptionTier(String SubscriptionTierName, int currentSubscriptionCount, int maxSubscriptionCount) {
this.SubscriptionTierName = SubscriptionTierName;
this.currentSubscriptionCount = currentSubscriptionCount;
this.maxSubscriptionCount = maxSubscriptionCount;
}

public String getSubscriptionTierName() {
return SubscriptionTierName;
}

public int getCurrentSubscriptionCount() {
return currentSubscriptionCount;
}

public int getMaxSubscriptionCount() {
return maxSubscriptionCount;
}

public static final Map<String, SubscriptionTier> TIER_MAP = Collections.unmodifiableMap(
Stream.of(values())
.collect(Collectors.toMap(SubscriptionTier::getSubscriptionTierName, Function.identity()))
);

public static SubscriptionTier fromTier(String tierName) {
SubscriptionTier result = TIER_MAP.get(tierName);
if(result == null) {
throw new IllegalArgumentException("일치하는 티어 타입이 없습니다." + tierName);
}
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,25 @@

import io.eventuate.tram.events.publisher.DomainEventPublisher;
import io.eventuate.tram.spring.events.publisher.TramEventsPublisherConfiguration;
import io.eventuate.tram.spring.jdbckafka.TramJdbcKafkaConfiguration;

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

// import com.synapse.account_service.eventuate.publisher.MemberDomainEventPublisher;
import com.synapse.account_service.eventuate.publisher.MemberDomainEventPublisher;
import com.synapse.account_service.eventuate.publisher.SubscriptionDomainEventPublisher;

// @Configuration
// @Import(TramEventsPublisherConfiguration.class)
// public class EventuateConfig {
// @Bean
// public MemberDomainEventPublisher memberDomainEventPublisher(DomainEventPublisher eventPublisher) {
// return new MemberDomainEventPublisher(eventPublisher);
// }
// }
@Configuration
@Import({TramEventsPublisherConfiguration.class, TramJdbcKafkaConfiguration.class})
public class EventuateConfig {
@Bean
public MemberDomainEventPublisher memberDomainEventPublisher(DomainEventPublisher eventPublisher) {
return new MemberDomainEventPublisher(eventPublisher);
}

@Bean
public SubscriptionDomainEventPublisher subscriptionDomainEventPublisher(DomainEventPublisher eventPublisher) {
return new SubscriptionDomainEventPublisher(eventPublisher);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
import io.eventuate.tram.events.aggregates.AbstractAggregateDomainEventPublisher;
import io.eventuate.tram.events.publisher.DomainEventPublisher;

// public class MemberDomainEventPublisher extends AbstractAggregateDomainEventPublisher<Member, MemberDomainEvent> {
public class MemberDomainEventPublisher extends AbstractAggregateDomainEventPublisher<Member, MemberDomainEvent> {

// public MemberDomainEventPublisher(DomainEventPublisher eventPublisher) {
// super(eventPublisher, Member.class, Member::getId);
// }
// }
public MemberDomainEventPublisher(DomainEventPublisher eventPublisher) {
super(eventPublisher, Member.class, Member::getId);
}
}
Loading
Loading