From 9bde4fcecdae6ef25e2940c0f5e19e2839001116 Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Wed, 29 Oct 2025 21:12:16 +0700 Subject: [PATCH] Refactor models and add repository layer Refactored Admin, AppleApp, GoogleApp, and Group models to extend AbstractModel and use Lombok's @Getter/@Setter. Introduced repository classes for Admin, AppleApp, GoogleApp, and Group, each mapping to a specific collection. Added Env enum and updated Config and AbstractRepository to support environment-based scoping. --- .../miti99/storescraperbot/config/Config.java | 4 +++ .../miti99/storescraperbot/model/Admin.java | 7 +++-- .../storescraperbot/model/AppleApp.java | 6 ++++- .../storescraperbot/model/GoogleApp.java | 6 ++++- .../miti99/storescraperbot/model/Group.java | 7 +++-- .../repository/AbstractRepository.java | 11 ++++---- .../repository/AdminRepository.java | 26 +++++++++++++++++++ .../repository/AppleAppRepository.java | 12 +++++++++ .../repository/GoogleAppRepository.java | 12 +++++++++ .../repository/GroupRepository.java | 11 ++++++++ .../com/miti99/storescraperbot/type/Env.java | 6 +++++ 11 files changed, 96 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/miti99/storescraperbot/repository/AdminRepository.java create mode 100644 src/main/java/com/miti99/storescraperbot/repository/AppleAppRepository.java create mode 100644 src/main/java/com/miti99/storescraperbot/repository/GoogleAppRepository.java create mode 100644 src/main/java/com/miti99/storescraperbot/repository/GroupRepository.java create mode 100644 src/main/java/com/miti99/storescraperbot/type/Env.java diff --git a/src/main/java/com/miti99/storescraperbot/config/Config.java b/src/main/java/com/miti99/storescraperbot/config/Config.java index ac0406b..f4ba15b 100644 --- a/src/main/java/com/miti99/storescraperbot/config/Config.java +++ b/src/main/java/com/miti99/storescraperbot/config/Config.java @@ -1,6 +1,10 @@ package com.miti99.storescraperbot.config; +import com.miti99.storescraperbot.type.Env; + public class Config { + public static final Env ENV = Env.valueOf(System.getenv("ENV")); + public static final String COUCHBASE_CONNECTION_STRING = System.getenv("COUCHBASE_CONNECTION_STRING"); public static final String COUCHBASE_USERNAME = System.getenv("COUCHBASE_USERNAME"); diff --git a/src/main/java/com/miti99/storescraperbot/model/Admin.java b/src/main/java/com/miti99/storescraperbot/model/Admin.java index 560a8fa..c1ea3b4 100644 --- a/src/main/java/com/miti99/storescraperbot/model/Admin.java +++ b/src/main/java/com/miti99/storescraperbot/model/Admin.java @@ -2,8 +2,11 @@ package com.miti99.storescraperbot.model; import java.util.List; import lombok.Data; +import lombok.Getter; +import lombok.Setter; -@Data -public class Admin { +@Getter +@Setter +public class Admin extends AbstractModel { List groups; } diff --git a/src/main/java/com/miti99/storescraperbot/model/AppleApp.java b/src/main/java/com/miti99/storescraperbot/model/AppleApp.java index ee28074..cedeb03 100644 --- a/src/main/java/com/miti99/storescraperbot/model/AppleApp.java +++ b/src/main/java/com/miti99/storescraperbot/model/AppleApp.java @@ -1,8 +1,12 @@ package com.miti99.storescraperbot.model; import com.miti99.storescraperbot.api.apple.response.AppleAppResponse; +import lombok.Getter; +import lombok.Setter; -public class AppleApp { +@Getter +@Setter +public class AppleApp extends AbstractModel { long cacheTime; AppleAppResponse rawResponse; } diff --git a/src/main/java/com/miti99/storescraperbot/model/GoogleApp.java b/src/main/java/com/miti99/storescraperbot/model/GoogleApp.java index f9734fe..e18f7dd 100644 --- a/src/main/java/com/miti99/storescraperbot/model/GoogleApp.java +++ b/src/main/java/com/miti99/storescraperbot/model/GoogleApp.java @@ -1,8 +1,12 @@ package com.miti99.storescraperbot.model; import com.miti99.storescraperbot.api.google.response.GoogleAppResponse; +import lombok.Getter; +import lombok.Setter; -public class GoogleApp { +@Getter +@Setter +public class GoogleApp extends AbstractModel { long cacheTime; GoogleAppResponse rawResponse; } diff --git a/src/main/java/com/miti99/storescraperbot/model/Group.java b/src/main/java/com/miti99/storescraperbot/model/Group.java index 29ef767..70edef3 100644 --- a/src/main/java/com/miti99/storescraperbot/model/Group.java +++ b/src/main/java/com/miti99/storescraperbot/model/Group.java @@ -3,9 +3,12 @@ package com.miti99.storescraperbot.model; import com.miti99.storescraperbot.type.AppType; import java.util.List; import lombok.Data; +import lombok.Getter; +import lombok.Setter; -@Data -public class Group { +@Getter +@Setter +public class Group extends AbstractModel { List apps; public static class App { diff --git a/src/main/java/com/miti99/storescraperbot/repository/AbstractRepository.java b/src/main/java/com/miti99/storescraperbot/repository/AbstractRepository.java index 1048213..17f7fcc 100644 --- a/src/main/java/com/miti99/storescraperbot/repository/AbstractRepository.java +++ b/src/main/java/com/miti99/storescraperbot/repository/AbstractRepository.java @@ -1,25 +1,24 @@ package com.miti99.storescraperbot.repository; import com.couchbase.client.java.Collection; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.miti99.storescraperbot.config.Config; import com.miti99.storescraperbot.model.AbstractModel; import com.miti99.storescraperbot.util.CouchbaseUtil; import java.lang.reflect.ParameterizedType; import lombok.extern.log4j.Log4j2; +/** 1 repository = 1 collection */ @Log4j2 public abstract class AbstractRepository> { public static final String SEPARATOR = "_"; // protected static ObjectMapper objectMapper = new ObjectMapper(); protected final Class classV = getDataClass(); // protected final JavaType type = objectMapper.getTypeFactory().constructType(classV); - protected final String scopeName; + protected final String scopeName = Config.ENV.name().toLowerCase(); protected final String collectionName; - protected AbstractRepository(String scopeName, String collectionName) { - this.scopeName = scopeName; - this.collectionName = collectionName; + protected AbstractRepository(String collectionName) { + this.collectionName = collectionName.toLowerCase(); } public Collection collection() { diff --git a/src/main/java/com/miti99/storescraperbot/repository/AdminRepository.java b/src/main/java/com/miti99/storescraperbot/repository/AdminRepository.java new file mode 100644 index 0000000..a4dc038 --- /dev/null +++ b/src/main/java/com/miti99/storescraperbot/repository/AdminRepository.java @@ -0,0 +1,26 @@ +package com.miti99.storescraperbot.repository; + +import com.miti99.storescraperbot.model.Admin; + +/** + * Đây là repository chỉ chứa 1 key duy nhất, key là "" (rỗng) + */ +public class AdminRepository extends AbstractRepository { + private static final AdminRepository INSTANCE = new AdminRepository(); + + protected AdminRepository() { + super("admin"); + } + + public void init() { + init(""); + } + + public Admin load() { + return load(""); + } + + public void save(Admin data) { + save("", data); + } +} diff --git a/src/main/java/com/miti99/storescraperbot/repository/AppleAppRepository.java b/src/main/java/com/miti99/storescraperbot/repository/AppleAppRepository.java new file mode 100644 index 0000000..913594b --- /dev/null +++ b/src/main/java/com/miti99/storescraperbot/repository/AppleAppRepository.java @@ -0,0 +1,12 @@ +package com.miti99.storescraperbot.repository; + +import com.miti99.storescraperbot.model.AppleApp; +import com.miti99.storescraperbot.model.Group; + +public class AppleAppRepository extends AbstractRepository { + public static final AppleAppRepository INSTANCE = new AppleAppRepository(); + + protected AppleAppRepository() { + super("apple"); + } +} diff --git a/src/main/java/com/miti99/storescraperbot/repository/GoogleAppRepository.java b/src/main/java/com/miti99/storescraperbot/repository/GoogleAppRepository.java new file mode 100644 index 0000000..2a4eaf4 --- /dev/null +++ b/src/main/java/com/miti99/storescraperbot/repository/GoogleAppRepository.java @@ -0,0 +1,12 @@ +package com.miti99.storescraperbot.repository; + +import com.miti99.storescraperbot.model.GoogleApp; +import com.miti99.storescraperbot.model.Group; + +public class GoogleAppRepository extends AbstractRepository { + private static final GoogleAppRepository INSTANCE = new GoogleAppRepository(); + + protected GoogleAppRepository() { + super("google"); + } +} diff --git a/src/main/java/com/miti99/storescraperbot/repository/GroupRepository.java b/src/main/java/com/miti99/storescraperbot/repository/GroupRepository.java new file mode 100644 index 0000000..d72efde --- /dev/null +++ b/src/main/java/com/miti99/storescraperbot/repository/GroupRepository.java @@ -0,0 +1,11 @@ +package com.miti99.storescraperbot.repository; + +import com.miti99.storescraperbot.model.Group; + +public class GroupRepository extends AbstractRepository { + public static final GroupRepository INSTANCE = new GroupRepository(); + + protected GroupRepository() { + super("group"); + } +} diff --git a/src/main/java/com/miti99/storescraperbot/type/Env.java b/src/main/java/com/miti99/storescraperbot/type/Env.java new file mode 100644 index 0000000..545fd01 --- /dev/null +++ b/src/main/java/com/miti99/storescraperbot/type/Env.java @@ -0,0 +1,6 @@ +package com.miti99.storescraperbot.type; + +public enum Env { + DEVELOPMENT, + PRODUCTION +}