This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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);
|
||||
Reference in New Issue
Block a user