From 5855678447a2a118ebf1ededdbe325ef65d65f5f Mon Sep 17 00:00:00 2001 From: Tihon Date: Thu, 19 Mar 2026 13:36:51 +0200 Subject: [PATCH] admin statistics part1 --- .../controller/AdminStatisticsController.java | 3 ++- .../honey/controller/AdminUserController.java | 6 ++++- .../honey/repository/UserARepository.java | 2 ++ .../honey/honey/service/AdminUserService.java | 27 +++++++++++++++++++ .../V76__users_b_deposit_count_index.sql | 2 ++ 5 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/db/migration/V76__users_b_deposit_count_index.sql diff --git a/src/main/java/com/honey/honey/controller/AdminStatisticsController.java b/src/main/java/com/honey/honey/controller/AdminStatisticsController.java index 0e1df1b..3969311 100644 --- a/src/main/java/com/honey/honey/controller/AdminStatisticsController.java +++ b/src/main/java/com/honey/honey/controller/AdminStatisticsController.java @@ -31,6 +31,7 @@ public class AdminStatisticsController { @GetMapping("/project") public ResponseEntity getProjectStatistics() { long registered = userARepository.count(); + long subscribed = userARepository.countByBotActiveIsTrue(); long blocked = userARepository.countByBotActiveIsFalse(); BigDecimal totalDeposits = paymentRepository.sumUsdAmountByStatus(Payment.PaymentStatus.COMPLETED) .orElse(BigDecimal.ZERO); @@ -47,7 +48,7 @@ public class AdminStatisticsController { AdminProjectStatisticsDto dto = AdminProjectStatisticsDto.builder() .registeredUsers(registered) - .subscribedToBot(registered) + .subscribedToBot(subscribed) .blockedBot(blocked) .totalDepositsUsd(totalDeposits) .totalWithdrawalsUsd(totalWithdrawals) diff --git a/src/main/java/com/honey/honey/controller/AdminUserController.java b/src/main/java/com/honey/honey/controller/AdminUserController.java index 1722a35..0c1eee7 100644 --- a/src/main/java/com/honey/honey/controller/AdminUserController.java +++ b/src/main/java/com/honey/honey/controller/AdminUserController.java @@ -66,7 +66,9 @@ public class AdminUserController { @RequestParam(required = false) Integer referralCountMax, @RequestParam(required = false) Integer referrerId, @RequestParam(required = false) Integer referralLevel, - @RequestParam(required = false) String ip) { + @RequestParam(required = false) String ip, + @RequestParam(required = false) Boolean botActive, + @RequestParam(required = false) Integer depositCountMin) { // Build sort. Fields on UserB/UserD (balanceA, depositTotal, withdrawTotal, referralCount) are handled in service via custom query. Set sortRequiresJoin = Set.of("balanceA", "depositTotal", "withdrawTotal", "referralCount", "profit"); @@ -107,6 +109,8 @@ public class AdminUserController { referrerId, referralLevel, ip, + botActive, + depositCountMin, effectiveSortBy, sortDir, excludeMasters diff --git a/src/main/java/com/honey/honey/repository/UserARepository.java b/src/main/java/com/honey/honey/repository/UserARepository.java index 81dcef9..4406a37 100644 --- a/src/main/java/com/honey/honey/repository/UserARepository.java +++ b/src/main/java/com/honey/honey/repository/UserARepository.java @@ -52,6 +52,8 @@ public interface UserARepository extends JpaRepository, JpaSpeci long countByBotActiveIsFalse(); + long countByBotActiveIsTrue(); + /** * Paged users in id range for broadcast when skipping inactive-bot users. */ diff --git a/src/main/java/com/honey/honey/service/AdminUserService.java b/src/main/java/com/honey/honey/service/AdminUserService.java index e6c0ec4..55d5577 100644 --- a/src/main/java/com/honey/honey/service/AdminUserService.java +++ b/src/main/java/com/honey/honey/service/AdminUserService.java @@ -65,6 +65,8 @@ public class AdminUserService { Integer referrerId, Integer referralLevel, String ipFilter, + Boolean botActive, + Integer depositCountMin, String sortBy, String sortDir, boolean excludeMasters) { @@ -181,6 +183,18 @@ public class AdminUserService { predicates.add(cb.in(root.get("id")).value(subRef)); } + if (botActive != null) { + predicates.add(cb.equal(root.get("botActive"), botActive)); + } + + if (depositCountMin != null && depositCountMin > 0) { + Subquery subDep = query.subquery(Integer.class); + Root depRoot = subDep.from(UserB.class); + subDep.select(depRoot.get("id")); + subDep.where(cb.greaterThanOrEqualTo(depRoot.get("depositCount"), depositCountMin)); + predicates.add(cb.in(root.get("id")).value(subDep)); + } + return cb.and(predicates.toArray(new Predicate[0])); }; @@ -195,6 +209,7 @@ public class AdminUserService { dateRegFrom, dateRegTo, balanceAMin, balanceAMax, balanceBMin, balanceBMax, referralCountMin, referralCountMax, referrerId, referralLevel, ipFilter, + botActive, depositCountMin, sortBy, sortDir != null ? sortDir : "desc", pageable.getPageSize(), (int) pageable.getOffset(), masterIds); @@ -308,6 +323,8 @@ public class AdminUserService { Integer referrerId, Integer referralLevel, String ipFilter, + Boolean botActive, + Integer depositCountMin, String sortBy, String sortDir, int limit, @@ -424,6 +441,16 @@ public class AdminUserService { paramIndex++; } } + if (botActive != null) { + sql.append(" AND a.bot_active = ?"); + params.add(Boolean.TRUE.equals(botActive) ? 1 : 0); + paramIndex++; + } + if (depositCountMin != null && depositCountMin > 0) { + sql.append(" AND b.deposit_count >= ?"); + params.add(depositCountMin); + paramIndex++; + } String orderColumn = switch (sortBy != null ? sortBy : "") { case "balanceA" -> "b.balance_a"; diff --git a/src/main/resources/db/migration/V76__users_b_deposit_count_index.sql b/src/main/resources/db/migration/V76__users_b_deposit_count_index.sql new file mode 100644 index 0000000..60692e4 --- /dev/null +++ b/src/main/resources/db/migration/V76__users_b_deposit_count_index.sql @@ -0,0 +1,2 @@ +-- Admin users list filter: deposit_count >= N (e.g. users with at least one deposit) +CREATE INDEX idx_users_b_deposit_count ON db_users_b(deposit_count);