Skip to content

Commit 8875d2e

Browse files
authored
Merge pull request kgrgreer#4670 from Mykola97/NP-11985/Create-an-algorithm-to-generate-user-readable-referral-code
[NP-11985] Create an algorithm to generate user readable referral codes
2 parents 1bbb128 + 1cfbfb6 commit 8875d2e

11 files changed

+183
-11
lines changed

src/foam/core/auth/UserRegistrationSanitationDAO.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ foam.CLASS({
5656
DAO referralCodeDAO = (DAO) x.get("referralCodeDAO");
5757
ReferralCode referralCode = (ReferralCode) referralCodeDAO.find(OR(
5858
EQ(ReferralCode.ID, user.getReferralCode()),
59-
EQ(ReferralCode.CUSTOM_REFERRAL_CODE, user.getReferralCode())
59+
EQ(ReferralCode.CODE, user.getReferralCode())
6060
));
6161
if ( referralCode != null ) {
6262
nu.setReferralCode(referralCode.getId());

src/foam/core/referral/BuildReferralCodeURLRuleAction.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@ foam.CLASS({
2626
agency.submit(x, new ContextAgent() {
2727
@Override
2828
public void execute(X x) {
29-
DAO referralCodeDAO = (DAO) ruler.getX().get("referralCodeDAO");
29+
ReferralCodeGeneratorService service = (ReferralCodeGeneratorService) x.get("referralCodeGenerationService");
3030
ReferralCode referralCode = (ReferralCode) obj;
3131
if ( SafetyUtil.isEmpty(referralCode.getId()) ) return;
32-
String code = SafetyUtil.isEmpty(referralCode.getCustomReferralCode()) ? referralCode.getId() : referralCode.getCustomReferralCode();
33-
referralCode.setUrl(referralCode.getWebsite() + "/?" + referralCode.getQuery() + "=" + code + "#" + referralCode.getMenu());
32+
if ( SafetyUtil.isEmpty(referralCode.getCode()) ) {
33+
referralCode.setCode(service.getCode(referralCode.getReferrer()));
34+
}
35+
referralCode.setUrl(referralCode.getWebsite() + "/?" + referralCode.getQuery() + "=" + referralCode.getCode() + "#" + referralCode.getMenu());
3436
}
3537
}, "BuildReferralCodeUrl");
3638
`

src/foam/core/referral/CreateReferralCodeRuleAction.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ foam.CLASS({
3737
referralCode.setReferrer(user.getId());
3838
referralCode.setSpid(user.getSpid());
3939
referralCode.setAutoGenerated(true);
40+
referralCode.setEnabled(true);
4041
referralCodeDAO.put_(ruler.getX(), referralCode);
4142
}
4243
}, "Creating a referral code");
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* @license
3+
* Copyright 2025 The FOAM Authors. All Rights Reserved.
4+
* http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
7+
foam.CLASS({
8+
package: 'foam.core.referral',
9+
name: 'DisableOldReferralCodesRuleAction',
10+
11+
documentation: `Mark old referral codes enabled = false when the new one created`,
12+
13+
implements: ['foam.core.ruler.RuleAction'],
14+
15+
javaImports: [
16+
'foam.lang.ContextAgent',
17+
'foam.lang.X',
18+
'foam.core.referral.ReferralCode',
19+
'foam.dao.ArraySink',
20+
'foam.dao.DAO',
21+
'java.util.List',
22+
'static foam.mlang.MLang.*'
23+
],
24+
25+
methods: [
26+
{
27+
name: 'applyAction',
28+
javaCode: `
29+
agency.submit(x, new ContextAgent() {
30+
@Override
31+
public void execute(X x) {
32+
ReferralCode referralCode = (ReferralCode) obj;
33+
DAO referralCodeDAO = (DAO) x.get("referralCodeDAO");
34+
List<ReferralCode> referralCodes = ((ArraySink) referralCodeDAO.where(
35+
AND(
36+
EQ(ReferralCode.REFERRER, referralCode.getReferrer()),
37+
EQ(ReferralCode.ENABLED, true),
38+
NEQ(ReferralCode.ID, referralCode.getId())
39+
)
40+
).select(new ArraySink())).getArray();
41+
42+
for ( ReferralCode code: referralCodes ) {
43+
if ( code.isFrozen() ) code = (ReferralCode) code.fclone();
44+
code.setEnabled(false);
45+
referralCodeDAO.put(code);
46+
}
47+
}
48+
}, "Disable old referral code rule action");
49+
`
50+
}
51+
]
52+
});
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* @license
3+
* Copyright 2025 The FOAM Authors. All Rights Reserved.
4+
* http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
7+
foam.CLASS({
8+
package: 'foam.core.referral',
9+
name: 'IdReferralCodeGenerationService',
10+
documentation: 'Default referral code generation service that uses referral code ID as the code',
11+
12+
implements: [
13+
'foam.core.referral.ReferralCodeGeneratorService'
14+
],
15+
16+
javaImports: [
17+
'foam.lang.X',
18+
'foam.lang.XLocator',
19+
'foam.core.auth.User',
20+
'foam.dao.DAO',
21+
'foam.mlang.sink.Count',
22+
'static foam.mlang.MLang.*'
23+
],
24+
25+
methods: [
26+
{
27+
name: 'getCode',
28+
synchronized: true,
29+
javaCode: `
30+
X x = XLocator.get();
31+
DAO referralCodeDAO = (DAO) x.get("referralCodeDAO");
32+
ReferralCode code = (ReferralCode) referralCodeDAO.find(
33+
AND(
34+
EQ(ReferralCode.REFERRER, userId),
35+
EQ(ReferralCode.ENABLED, true)
36+
)
37+
);
38+
return code.getId();
39+
`
40+
}
41+
]
42+
});

src/foam/core/referral/ReferralCode.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ foam.CLASS({
99
name: 'ReferralCode',
1010

1111
implements: [
12-
'foam.core.auth.Authorizable'
12+
'foam.core.auth.Authorizable',
13+
'foam.core.auth.EnabledAware'
1314
],
1415

1516
javaImports: [
@@ -74,7 +75,20 @@ foam.CLASS({
7475
},
7576
{
7677
class: 'String',
77-
name: 'customReferralCode'
78+
name: 'code',
79+
documentation: 'Actual referral code for the user'
80+
},
81+
{
82+
// deprecated
83+
class: 'String',
84+
name: 'customReferralCode',
85+
transient: true,
86+
hidden: true,
87+
javaSetter: `
88+
if ( ! codeIsSet_ ) {
89+
setCode(val);
90+
}
91+
`
7892
},
7993
{
8094
class: 'Reference',
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* @license
3+
* Copyright 2025 The FOAM Authors. All Rights Reserved.
4+
* http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
7+
foam.INTERFACE({
8+
package: 'foam.core.referral',
9+
name: 'ReferralCodeGeneratorService',
10+
11+
client: true,
12+
skeleton: true,
13+
14+
documentation: `
15+
A service that generates a referral code on request
16+
`,
17+
18+
javaImports: [
19+
'foam.core.auth.User',
20+
'foam.core.referral.ReferralCode'
21+
],
22+
23+
methods: [
24+
{
25+
name: 'getCode',
26+
type: 'String',
27+
args: 'Long userId'
28+
}
29+
]
30+
});

src/foam/core/referral/pom.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ foam.POM({
99
{ name: "CreateReferralCodeRuleAction", flags: "js|java" },
1010
{ name: "ReferUserView", flags: "web" },
1111
{ name: "ReferralBorder", flags: "web" },
12-
{ name: "Relationships", flags: "js|java" }
12+
{ name: "Relationships", flags: "js|java" },
13+
{ name: "ReferralCodeGeneratorService", flags: "js|java" },
14+
{ name: "IdReferralCodeGenerationService", flags: "js|java" },
15+
{ name: "DisableOldReferralCodesRuleAction", flags: "js|java" }
1316
]
1417
});

src/foam/core/referral/rules.jrl

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ p({
1010
"after": true,
1111
predicate: {
1212
class: "foam.core.ruler.predicate.FScriptRulePredicate",
13-
query: '(o !exists&&n.url !exists)||(o exists&&n.menu exists&&n.website exists&&(n.menu!=o.menu||n.website!=o.website||n.customReferralCode!=o.customReferralCode))'
13+
query: '(o !exists&&n.url !exists)||(o exists&&n.menu exists&&n.website exists&&(n.menu!=o.menu||n.website!=o.website||n.code!=o.code))'
1414
},
1515
"action":{
1616
"class":"foam.core.referral.BuildReferralCodeURLRuleAction"
@@ -41,3 +41,21 @@ p({
4141
"saveHistory": false,
4242
"lifecycleState":1
4343
})
44+
45+
p({
46+
"class": "foam.core.ruler.Rule",
47+
"id":"disable-old-referral-codes",
48+
"name": "Disable old referral codes",
49+
"priority": 100,
50+
"documentation": "When a new referral code is created, mark old referral codes as enabled = false",
51+
"ruleGroup": "Referrals",
52+
"daoKey": "referralCodeDAO",
53+
"operation": 0,
54+
"after": true,
55+
"action":{
56+
"class":"foam.core.referral.DisableOldReferralCodesRuleAction"
57+
},
58+
"enabled": true,
59+
"saveHistory": false,
60+
"lifecycleState":1
61+
})

src/foam/core/referral/services.jrl

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
p({
32
"class": "foam.core.boot.CSpec",
43
"name": "referralCodeDAO",
@@ -19,4 +18,15 @@ p({
1918
"of": "foam.core.referral.ReferralCode"
2019
}
2120
"""
22-
})
21+
})
22+
23+
p({
24+
class:"foam.core.boot.CSpec",
25+
name:"referralCodeGenerationService",
26+
serve:false,
27+
lazy:false,
28+
authenticate:false,
29+
service:{
30+
class:"foam.core.referral.IdReferralCodeGenerationService"
31+
}
32+
})

0 commit comments

Comments
 (0)