admin statistics part1
All checks were successful
Deploy to VPS / deploy (push) Successful in 1m20s

This commit is contained in:
Tihon
2026-03-19 13:36:51 +02:00
parent 83c2757701
commit 5855678447
5 changed files with 38 additions and 2 deletions

View File

@@ -31,6 +31,7 @@ public class AdminStatisticsController {
@GetMapping("/project")
public ResponseEntity<AdminProjectStatisticsDto> 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)

View File

@@ -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<String> sortRequiresJoin = Set.of("balanceA", "depositTotal", "withdrawTotal", "referralCount", "profit");
@@ -107,6 +109,8 @@ public class AdminUserController {
referrerId,
referralLevel,
ip,
botActive,
depositCountMin,
effectiveSortBy,
sortDir,
excludeMasters

View File

@@ -52,6 +52,8 @@ public interface UserARepository extends JpaRepository<UserA, Integer>, JpaSpeci
long countByBotActiveIsFalse();
long countByBotActiveIsTrue();
/**
* Paged users in id range for broadcast when skipping inactive-bot users.
*/

View File

@@ -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<Integer> subDep = query.subquery(Integer.class);
Root<UserB> 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";

View File

@@ -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);