diff --git a/pom.xml b/pom.xml
index 0bd87c9..0201199 100644
--- a/pom.xml
+++ b/pom.xml
@@ -36,10 +36,6 @@
org.springframework.boot
spring-boot-starter-data-jpa
-
- org.springframework.boot
- spring-boot-starter-amqp
-
org.springframework.boot
spring-boot-starter-data-redis
@@ -89,11 +85,6 @@
0.7.3
test
-
- org.springframework.amqp
- spring-rabbit-test
- test
-
diff --git a/src/main/java/com/mosquito/project/persistence/entity/ActivityEntity.java b/src/main/java/com/mosquito/project/persistence/entity/ActivityEntity.java
new file mode 100644
index 0000000..3195909
--- /dev/null
+++ b/src/main/java/com/mosquito/project/persistence/entity/ActivityEntity.java
@@ -0,0 +1,62 @@
+package com.mosquito.project.persistence.entity;
+
+import jakarta.persistence.*;
+import java.time.OffsetDateTime;
+
+@Entity
+@Table(name = "activities")
+public class ActivityEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(nullable = false, length = 255)
+ private String name;
+
+ @Column(name = "start_time_utc", nullable = false)
+ private OffsetDateTime startTimeUtc;
+
+ @Column(name = "end_time_utc", nullable = false)
+ private OffsetDateTime endTimeUtc;
+
+ @Column(name = "target_users_config", columnDefinition = "jsonb")
+ private String targetUsersConfig;
+
+ @Column(name = "page_content_config", columnDefinition = "jsonb")
+ private String pageContentConfig;
+
+ @Column(name = "reward_calculation_mode", length = 50)
+ private String rewardCalculationMode;
+
+ @Column(length = 50)
+ private String status;
+
+ @Column(name = "created_at")
+ private OffsetDateTime createdAt;
+
+ @Column(name = "updated_at")
+ private OffsetDateTime updatedAt;
+
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+ public OffsetDateTime getStartTimeUtc() { return startTimeUtc; }
+ public void setStartTimeUtc(OffsetDateTime startTimeUtc) { this.startTimeUtc = startTimeUtc; }
+ public OffsetDateTime getEndTimeUtc() { return endTimeUtc; }
+ public void setEndTimeUtc(OffsetDateTime endTimeUtc) { this.endTimeUtc = endTimeUtc; }
+ public String getTargetUsersConfig() { return targetUsersConfig; }
+ public void setTargetUsersConfig(String targetUsersConfig) { this.targetUsersConfig = targetUsersConfig; }
+ public String getPageContentConfig() { return pageContentConfig; }
+ public void setPageContentConfig(String pageContentConfig) { this.pageContentConfig = pageContentConfig; }
+ public String getRewardCalculationMode() { return rewardCalculationMode; }
+ public void setRewardCalculationMode(String rewardCalculationMode) { this.rewardCalculationMode = rewardCalculationMode; }
+ public String getStatus() { return status; }
+ public void setStatus(String status) { this.status = status; }
+ public OffsetDateTime getCreatedAt() { return createdAt; }
+ public void setCreatedAt(OffsetDateTime createdAt) { this.createdAt = createdAt; }
+ public OffsetDateTime getUpdatedAt() { return updatedAt; }
+ public void setUpdatedAt(OffsetDateTime updatedAt) { this.updatedAt = updatedAt; }
+}
+
diff --git a/src/main/java/com/mosquito/project/persistence/entity/ActivityRewardEntity.java b/src/main/java/com/mosquito/project/persistence/entity/ActivityRewardEntity.java
new file mode 100644
index 0000000..246185f
--- /dev/null
+++ b/src/main/java/com/mosquito/project/persistence/entity/ActivityRewardEntity.java
@@ -0,0 +1,41 @@
+package com.mosquito.project.persistence.entity;
+
+import jakarta.persistence.*;
+
+@Entity
+@Table(name = "activity_rewards")
+public class ActivityRewardEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(name = "activity_id", nullable = false)
+ private Long activityId;
+
+ @Column(name = "invite_threshold", nullable = false)
+ private Integer inviteThreshold;
+
+ @Column(name = "reward_type", nullable = false, length = 50)
+ private String rewardType;
+
+ @Column(name = "reward_value", nullable = false, length = 255)
+ private String rewardValue;
+
+ @Column(name = "skip_validation", nullable = false)
+ private Boolean skipValidation = Boolean.FALSE;
+
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+ public Long getActivityId() { return activityId; }
+ public void setActivityId(Long activityId) { this.activityId = activityId; }
+ public Integer getInviteThreshold() { return inviteThreshold; }
+ public void setInviteThreshold(Integer inviteThreshold) { this.inviteThreshold = inviteThreshold; }
+ public String getRewardType() { return rewardType; }
+ public void setRewardType(String rewardType) { this.rewardType = rewardType; }
+ public String getRewardValue() { return rewardValue; }
+ public void setRewardValue(String rewardValue) { this.rewardValue = rewardValue; }
+ public Boolean getSkipValidation() { return skipValidation; }
+ public void setSkipValidation(Boolean skipValidation) { this.skipValidation = skipValidation; }
+}
+
diff --git a/src/main/java/com/mosquito/project/persistence/entity/ApiKeyEntity.java b/src/main/java/com/mosquito/project/persistence/entity/ApiKeyEntity.java
new file mode 100644
index 0000000..8700ae3
--- /dev/null
+++ b/src/main/java/com/mosquito/project/persistence/entity/ApiKeyEntity.java
@@ -0,0 +1,47 @@
+package com.mosquito.project.persistence.entity;
+
+import jakarta.persistence.*;
+import java.time.OffsetDateTime;
+
+@Entity
+@Table(name = "api_keys")
+public class ApiKeyEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(nullable = false, length = 255)
+ private String name;
+
+ @Column(name = "key_hash", nullable = false, length = 255, unique = true)
+ private String keyHash;
+
+ @Column(nullable = false, length = 255)
+ private String salt;
+
+ @Column(name = "created_at")
+ private OffsetDateTime createdAt;
+
+ @Column(name = "revoked_at")
+ private OffsetDateTime revokedAt;
+
+ @Column(name = "last_used_at")
+ private OffsetDateTime lastUsedAt;
+
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+ public String getKeyHash() { return keyHash; }
+ public void setKeyHash(String keyHash) { this.keyHash = keyHash; }
+ public String getSalt() { return salt; }
+ public void setSalt(String salt) { this.salt = salt; }
+ public OffsetDateTime getCreatedAt() { return createdAt; }
+ public void setCreatedAt(OffsetDateTime createdAt) { this.createdAt = createdAt; }
+ public OffsetDateTime getRevokedAt() { return revokedAt; }
+ public void setRevokedAt(OffsetDateTime revokedAt) { this.revokedAt = revokedAt; }
+ public OffsetDateTime getLastUsedAt() { return lastUsedAt; }
+ public void setLastUsedAt(OffsetDateTime lastUsedAt) { this.lastUsedAt = lastUsedAt; }
+}
+
diff --git a/src/main/java/com/mosquito/project/persistence/entity/DailyActivityStatsEntity.java b/src/main/java/com/mosquito/project/persistence/entity/DailyActivityStatsEntity.java
new file mode 100644
index 0000000..3b5f51c
--- /dev/null
+++ b/src/main/java/com/mosquito/project/persistence/entity/DailyActivityStatsEntity.java
@@ -0,0 +1,47 @@
+package com.mosquito.project.persistence.entity;
+
+import jakarta.persistence.*;
+import java.time.LocalDate;
+
+@Entity
+@Table(name = "daily_activity_stats")
+public class DailyActivityStatsEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(name = "activity_id", nullable = false)
+ private Long activityId;
+
+ @Column(name = "stat_date", nullable = false)
+ private LocalDate statDate;
+
+ @Column(name = "views", nullable = false)
+ private Integer views;
+
+ @Column(name = "shares", nullable = false)
+ private Integer shares;
+
+ @Column(name = "new_registrations", nullable = false)
+ private Integer newRegistrations;
+
+ @Column(name = "conversions", nullable = false)
+ private Integer conversions;
+
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+ public Long getActivityId() { return activityId; }
+ public void setActivityId(Long activityId) { this.activityId = activityId; }
+ public LocalDate getStatDate() { return statDate; }
+ public void setStatDate(LocalDate statDate) { this.statDate = statDate; }
+ public Integer getViews() { return views; }
+ public void setViews(Integer views) { this.views = views; }
+ public Integer getShares() { return shares; }
+ public void setShares(Integer shares) { this.shares = shares; }
+ public Integer getNewRegistrations() { return newRegistrations; }
+ public void setNewRegistrations(Integer newRegistrations) { this.newRegistrations = newRegistrations; }
+ public Integer getConversions() { return conversions; }
+ public void setConversions(Integer conversions) { this.conversions = conversions; }
+}
+
diff --git a/src/main/java/com/mosquito/project/persistence/entity/MultiLevelRewardRuleEntity.java b/src/main/java/com/mosquito/project/persistence/entity/MultiLevelRewardRuleEntity.java
new file mode 100644
index 0000000..c36311c
--- /dev/null
+++ b/src/main/java/com/mosquito/project/persistence/entity/MultiLevelRewardRuleEntity.java
@@ -0,0 +1,37 @@
+package com.mosquito.project.persistence.entity;
+
+import jakarta.persistence.*;
+import java.math.BigDecimal;
+
+@Entity
+@Table(name = "multi_level_reward_rules")
+public class MultiLevelRewardRuleEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(name = "activity_id", nullable = false)
+ private Long activityId;
+
+ @Column(nullable = false)
+ private Integer level;
+
+ @Column(name = "reward_value", nullable = false, precision = 10, scale = 2)
+ private BigDecimal rewardValue;
+
+ @Column(name = "is_percentage")
+ private Boolean percentage;
+
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+ public Long getActivityId() { return activityId; }
+ public void setActivityId(Long activityId) { this.activityId = activityId; }
+ public Integer getLevel() { return level; }
+ public void setLevel(Integer level) { this.level = level; }
+ public BigDecimal getRewardValue() { return rewardValue; }
+ public void setRewardValue(BigDecimal rewardValue) { this.rewardValue = rewardValue; }
+ public Boolean getPercentage() { return percentage; }
+ public void setPercentage(Boolean percentage) { this.percentage = percentage; }
+}
+
diff --git a/src/main/java/com/mosquito/project/persistence/repository/ActivityRepository.java b/src/main/java/com/mosquito/project/persistence/repository/ActivityRepository.java
new file mode 100644
index 0000000..01eddb5
--- /dev/null
+++ b/src/main/java/com/mosquito/project/persistence/repository/ActivityRepository.java
@@ -0,0 +1,8 @@
+package com.mosquito.project.persistence.repository;
+
+import com.mosquito.project.persistence.entity.ActivityEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface ActivityRepository extends JpaRepository {
+}
+
diff --git a/src/main/java/com/mosquito/project/persistence/repository/ActivityRewardRepository.java b/src/main/java/com/mosquito/project/persistence/repository/ActivityRewardRepository.java
new file mode 100644
index 0000000..40dcf77
--- /dev/null
+++ b/src/main/java/com/mosquito/project/persistence/repository/ActivityRewardRepository.java
@@ -0,0 +1,11 @@
+package com.mosquito.project.persistence.repository;
+
+import com.mosquito.project.persistence.entity.ActivityRewardEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface ActivityRewardRepository extends JpaRepository {
+ List findByActivityIdOrderByInviteThresholdAsc(Long activityId);
+}
+
diff --git a/src/main/java/com/mosquito/project/persistence/repository/ApiKeyRepository.java b/src/main/java/com/mosquito/project/persistence/repository/ApiKeyRepository.java
new file mode 100644
index 0000000..ae80be5
--- /dev/null
+++ b/src/main/java/com/mosquito/project/persistence/repository/ApiKeyRepository.java
@@ -0,0 +1,11 @@
+package com.mosquito.project.persistence.repository;
+
+import com.mosquito.project.persistence.entity.ApiKeyEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+
+public interface ApiKeyRepository extends JpaRepository {
+ Optional findByKeyHash(String keyHash);
+}
+
diff --git a/src/main/java/com/mosquito/project/persistence/repository/DailyActivityStatsRepository.java b/src/main/java/com/mosquito/project/persistence/repository/DailyActivityStatsRepository.java
new file mode 100644
index 0000000..c7ec05f
--- /dev/null
+++ b/src/main/java/com/mosquito/project/persistence/repository/DailyActivityStatsRepository.java
@@ -0,0 +1,12 @@
+package com.mosquito.project.persistence.repository;
+
+import com.mosquito.project.persistence.entity.DailyActivityStatsEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.time.LocalDate;
+import java.util.Optional;
+
+public interface DailyActivityStatsRepository extends JpaRepository {
+ Optional findByActivityIdAndStatDate(Long activityId, LocalDate statDate);
+}
+
diff --git a/src/main/java/com/mosquito/project/persistence/repository/MultiLevelRewardRuleRepository.java b/src/main/java/com/mosquito/project/persistence/repository/MultiLevelRewardRuleRepository.java
new file mode 100644
index 0000000..c7b665a
--- /dev/null
+++ b/src/main/java/com/mosquito/project/persistence/repository/MultiLevelRewardRuleRepository.java
@@ -0,0 +1,11 @@
+package com.mosquito.project.persistence.repository;
+
+import com.mosquito.project.persistence.entity.MultiLevelRewardRuleEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface MultiLevelRewardRuleRepository extends JpaRepository {
+ List findByActivityIdOrderByLevelAsc(Long activityId);
+}
+