Skip to content

Commit

Permalink
Merge pull request #11257 from hicommonwealth/rotorsoft/11224-refacto…
Browse files Browse the repository at this point in the history
…r-get-user-referrals

Refactors get user referrals
  • Loading branch information
Rotorsoft authored Mar 4, 2025
2 parents 4ed9073 + 44450ec commit f0ab4fb
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 42 deletions.
47 changes: 20 additions & 27 deletions libs/model/src/user/GetUserReferrals.query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,39 +6,32 @@ import { models } from '../database';

const sql = `
WITH
referrer_addresses AS (
SELECT DISTINCT address
FROM "Addresses"
referrer AS (
SELECT DISTINCT address FROM "Addresses"
WHERE user_id = :user_id AND address LIKE '0x%'),
referrals AS (
SELECT
namespace_address,
referrer_address,
referee_address,
eth_chain_id,
transaction_hash,
referrer_received_eth_amount,
created_on_chain_timestamp,
created_at,
updated_at
FROM "Referrals"
WHERE referrer_address IN (SELECT * FROM referrer_addresses)),
referee_addresses AS (
SELECT DISTINCT A.address, A.user_id
FROM "Addresses" A
JOIN referrals ON referee_address = A.address
referee AS (
SELECT DISTINCT A.address, A.user_id, U.referred_by_address
FROM "Users" U
JOIN referrer ON U.referred_by_address = referrer.address
JOIN "Addresses" A ON A.user_id = U.id
)
SELECT
R.*,
U.id as referee_user_id,
referee.referred_by_address as referrer_address,
referee.address as referee_address,
referee.user_id as referee_user_id,
U.profile as referee_profile,
-- when referee creates a community
C.id as community_id,
C.name as community_name,
C.icon_url as community_icon_url
FROM referrals R
JOIN referee_addresses RA ON RA.address = R.referee_address
JOIN "Users" U ON U.id = RA.user_id
LEFT JOIN "Communities" C ON C.namespace_address = R.namespace_address
C.icon_url as community_icon_url,
referrals.namespace_address,
COALESCE(referrals.referrer_received_eth_amount, '0') as referrer_received_eth_amount
FROM referee
JOIN "Users" U ON U.id = referee.user_id
LEFT JOIN "Referrals" referrals
ON referrals.referrer_address = referee.referred_by_address
AND referrals.referee_address = referee.address
LEFT JOIN "Communities" C ON C.namespace_address = referrals.namespace_address
;
`;

Expand Down
6 changes: 0 additions & 6 deletions libs/model/test/referral/referral-lifecycle.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -161,13 +161,7 @@ describe('Referral lifecycle', () => {
namespace_address: namespaceAddress,
referrer_address: admin.address!,
referee_address: nonMember.address!,
eth_chain_id: 1,
transaction_hash: '0x2',
referrer_received_eth_amount: '0',
created_on_chain_timestamp:
chainEvents1[0].event_payload.block.timestamp.toString(),
created_at: expect.any(Date),
updated_at: expect.any(Date),
referee_user_id: nonMember.user.id!,
referee_profile: { name: 'non-member' },
community_id: community!.id,
Expand Down
13 changes: 8 additions & 5 deletions libs/schemas/src/queries/user.schemas.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { ChainBase, Roles } from '@hicommonwealth/shared';
import { ZodType, z } from 'zod';
import { Referral, ReferralFees, User } from '../entities';
import { ReferralFees, User } from '../entities';
import { Tags } from '../entities/tag.schemas';
import { UserProfile } from '../entities/user.schemas';
import { XpLog } from '../entities/xp.schemas';
import { PG_INT } from '../utils';
import { EVM_ADDRESS, PG_INT } from '../utils';
import { PaginatedResultSchema, PaginationParamsSchema } from './pagination';
import {
AddressView,
Expand Down Expand Up @@ -103,14 +103,17 @@ export const GetUserAddresses = {
),
};

export const ReferralView = Referral.extend({
created_on_chain_timestamp: z.string(),
referrer_received_eth_amount: z.string(),
export const ReferralView = z.object({
referrer_address: EVM_ADDRESS,
referee_address: EVM_ADDRESS,
referee_user_id: PG_INT,
referee_profile: UserProfile,
// when referee creates a community
community_id: z.string().nullish(),
community_name: z.string().nullish(),
community_icon_url: z.string().nullish(),
namespace_address: EVM_ADDRESS.nullish(),
referrer_received_eth_amount: z.string(),
});

export const GetUserReferrals = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,8 +208,6 @@ const useUserMenuItems = ({
};
});

console.log('darkMode', darkMode);

const uniqueChainAddressOptions: PopoverMenuItem[] = uniqueChainAddresses.map(
(address) => {
const signed = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ export const ReferralTable = ({ referrals, isLoading }: ReferralTableProps) => {
},
community: {
sortValue: item.community_name || '',
customElement: (
customElement: item.community_name ? (
<div className="table-cell community-cell">
<Link
to={`/${item.community_id}`}
Expand All @@ -104,18 +104,22 @@ export const ReferralTable = ({ referrals, isLoading }: ReferralTableProps) => {
<p>{item.community_name}</p>
</Link>
</div>
) : (
'-'
),
},
namespace: {
sortValue: namespaceAddress || '',
customElement: (
customElement: namespaceAddress ? (
<div className="table-cell namespace-cell">
{withTooltip(
formatAddressShort(namespaceAddress || '', 6, 4),
namespaceAddress || '',
true,
)}
</div>
) : (
'-'
),
},
earnings: {
Expand Down

0 comments on commit f0ab4fb

Please sign in to comment.