From 7d60ebacda3b59fed76e7cb98da6d55bd42dd007 Mon Sep 17 00:00:00 2001 From: Tihon Date: Wed, 11 Mar 2026 18:01:32 +0200 Subject: [PATCH] Referral screen --- .../honey/controller/UserController.java | 4 ++-- .../honey/repository/UserDRepository.java | 22 +++++++++---------- .../com/honey/honey/service/UserService.java | 7 +++--- ...72__referral_commission_indexes_add_id.sql | 10 +++++++++ 4 files changed, 26 insertions(+), 17 deletions(-) create mode 100644 src/main/resources/db/migration/V72__referral_commission_indexes_add_id.sql diff --git a/src/main/java/com/honey/honey/controller/UserController.java b/src/main/java/com/honey/honey/controller/UserController.java index 7e9161a..a9a6ed6 100644 --- a/src/main/java/com/honey/honey/controller/UserController.java +++ b/src/main/java/com/honey/honey/controller/UserController.java @@ -113,8 +113,8 @@ public class UserController { /** * Gets referrals for a specific level with pagination. - * Always returns 50 results per page. - * + * Returns 10 results per page, ordered by commission DESC, then id DESC. + * * @param level The referral level (1, 2, or 3) * @param page Page number (0-indexed, defaults to 0) * @return Page of referrals with name and commission diff --git a/src/main/java/com/honey/honey/repository/UserDRepository.java b/src/main/java/com/honey/honey/repository/UserDRepository.java index cd26f1d..2a1ca0f 100644 --- a/src/main/java/com/honey/honey/repository/UserDRepository.java +++ b/src/main/java/com/honey/honey/repository/UserDRepository.java @@ -53,34 +53,34 @@ public interface UserDRepository extends JpaRepository { /** * Finds referrals for level 1 (where referer_id_1 = userId). * Returns referrals with their screen_name and to_referer_1 commission. + * Ordered by commission DESC, then id DESC. */ - @Query("SELECT new com.honey.honey.dto.ReferralDto(" + - "ud.screenName, ud.toReferer1) " + + @Query("SELECT new com.honey.honey.dto.ReferralDto(ud.screenName, ud.toReferer1) " + "FROM UserD ud " + "WHERE ud.refererId1 = :userId AND ud.refererId1 > 0 " + - "ORDER BY ud.toReferer1 DESC") + "ORDER BY ud.toReferer1 DESC, ud.id DESC") Page findReferralsLevel1(@Param("userId") Integer userId, Pageable pageable); - + /** * Finds referrals for level 2 (where referer_id_2 = userId). * Returns referrals with their screen_name and to_referer_2 commission. + * Ordered by commission DESC, then id DESC. */ - @Query("SELECT new com.honey.honey.dto.ReferralDto(" + - "ud.screenName, ud.toReferer2) " + + @Query("SELECT new com.honey.honey.dto.ReferralDto(ud.screenName, ud.toReferer2) " + "FROM UserD ud " + "WHERE ud.refererId2 = :userId AND ud.refererId2 > 0 " + - "ORDER BY ud.toReferer2 DESC") + "ORDER BY ud.toReferer2 DESC, ud.id DESC") Page findReferralsLevel2(@Param("userId") Integer userId, Pageable pageable); - + /** * Finds referrals for level 3 (where referer_id_3 = userId). * Returns referrals with their screen_name and to_referer_3 commission. + * Ordered by commission DESC, then id DESC. */ - @Query("SELECT new com.honey.honey.dto.ReferralDto(" + - "ud.screenName, ud.toReferer3) " + + @Query("SELECT new com.honey.honey.dto.ReferralDto(ud.screenName, ud.toReferer3) " + "FROM UserD ud " + "WHERE ud.refererId3 = :userId AND ud.refererId3 > 0 " + - "ORDER BY ud.toReferer3 DESC") + "ORDER BY ud.toReferer3 DESC, ud.id DESC") Page findReferralsLevel3(@Param("userId") Integer userId, Pageable pageable); /** diff --git a/src/main/java/com/honey/honey/service/UserService.java b/src/main/java/com/honey/honey/service/UserService.java index 59e2796..c77dd68 100644 --- a/src/main/java/com/honey/honey/service/UserService.java +++ b/src/main/java/com/honey/honey/service/UserService.java @@ -455,16 +455,15 @@ public class UserService { /** * Gets referrals for a specific level with pagination. - * Always returns 50 results per page. - * + * Returns 10 results per page, ordered by commission DESC, then id DESC. + * * @param userId The user ID to get referrals for * @param level The referral level (1, 2, or 3) * @param page Page number (0-indexed) * @return Page of referrals with name and commission */ public Page getReferrals(Integer userId, Integer level, Integer page) { - // Fixed page size of 50 to prevent database overload - Pageable pageable = PageRequest.of(page, 50); + Pageable pageable = PageRequest.of(page, 10); return switch (level) { case 1 -> userDRepository.findReferralsLevel1(userId, pageable); diff --git a/src/main/resources/db/migration/V72__referral_commission_indexes_add_id.sql b/src/main/resources/db/migration/V72__referral_commission_indexes_add_id.sql new file mode 100644 index 0000000..63fcd5b --- /dev/null +++ b/src/main/resources/db/migration/V72__referral_commission_indexes_add_id.sql @@ -0,0 +1,10 @@ +-- Extend referral commission indexes to include id DESC so ORDER BY commission DESC, id DESC +-- is fully satisfied by the index. Avoids expensive filesort when many referrals share the same +-- commission (e.g. 20k with 0 commission). +DROP INDEX idx_users_d_referer1_commission ON db_users_d; +DROP INDEX idx_users_d_referer2_commission ON db_users_d; +DROP INDEX idx_users_d_referer3_commission ON db_users_d; + +CREATE INDEX idx_users_d_referer1_commission ON db_users_d (referer_id_1, to_referer_1 DESC, id DESC); +CREATE INDEX idx_users_d_referer2_commission ON db_users_d (referer_id_2, to_referer_2 DESC, id DESC); +CREATE INDEX idx_users_d_referer3_commission ON db_users_d (referer_id_3, to_referer_3 DESC, id DESC);