Skip to content

Commit 9046395

Browse files
authored
feat: add feature flag on verify command (#309) (#311)
* feat: add feature flag on verify command * feat: add test cases * fix: comments * revert: yml file changes Co-authored-by: Amit Prakash <[email protected]>
2 parents 1b6730f + 60e6cae commit 9046395

File tree

8 files changed

+110
-5
lines changed

8 files changed

+110
-5
lines changed

config/config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import {
1313
RDS_STAGING_STATUS_SITE_URL,
1414
RDS_DASHBOARD_SITE_URL,
1515
RDS_STAGING_DASHBOARD_SITE_URL,
16+
RDS_MAIN_SITE_URL,
17+
RDS_STAGING_MAIN_SITE_URL,
18+
RDS_DEVELOPMENT_MAIN_SITE_URL,
1619
} from "../src/constants/urls";
1720
import {
1821
DISCORD_PROFILE_SERVICE_HELP_GROUP,
@@ -74,6 +77,7 @@ const config = (env: env) => {
7477
PROFILE_SERVICE_HELP_GROUP_ID: DISCORD_PROFILE_SERVICE_HELP_GROUP,
7578
RDS_STATUS_SITE_URL: RDS_STATUS_SITE_URL,
7679
DASHBOARD_SITE_URL: RDS_DASHBOARD_SITE_URL,
80+
MAIN_SITE_URL: RDS_MAIN_SITE_URL,
7781
},
7882
staging: {
7983
RDS_BASE_API_URL: RDS_BASE_STAGING_API_URL,
@@ -82,6 +86,7 @@ const config = (env: env) => {
8286
PROFILE_SERVICE_HELP_GROUP_ID: DISCORD_PROFILE_SERVICE_STAGING_HELP_GROUP,
8387
RDS_STATUS_SITE_URL: RDS_STAGING_STATUS_SITE_URL,
8488
DASHBOARD_SITE_URL: RDS_STAGING_DASHBOARD_SITE_URL,
89+
MAIN_SITE_URL: RDS_STAGING_MAIN_SITE_URL,
8590
},
8691
default: {
8792
RDS_BASE_API_URL: RDS_BASE_DEVELOPMENT_API_URL,
@@ -91,6 +96,7 @@ const config = (env: env) => {
9196
DISCORD_PROFILE_SERVICE_DEVELOPMENT_HELP_GROUP,
9297
RDS_STATUS_SITE_URL: RDS_STATUS_SITE_URL,
9398
DASHBOARD_SITE_URL: RDS_DASHBOARD_SITE_URL,
99+
MAIN_SITE_URL: RDS_DEVELOPMENT_MAIN_SITE_URL,
94100
},
95101
};
96102

src/constants/commands.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ export const VERIFY = {
1111
name: "verify",
1212
description:
1313
"Generate a link with user specific token to link with RDS backend.",
14+
options: [
15+
{
16+
name: "dev",
17+
description: "Use new website for verification.",
18+
type: 5,
19+
required: false,
20+
},
21+
],
1422
};
1523

1624
export const GROUP_INVITE = {

src/constants/urls.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,7 @@ export const RDS_STAGING_STATUS_SITE_URL =
2727
export const RDS_DASHBOARD_SITE_URL = "https://dashboard.realdevsquad.com";
2828
export const RDS_STAGING_DASHBOARD_SITE_URL =
2929
"https://staging-dashboard.realdevsquad.com";
30+
31+
export const RDS_MAIN_SITE_URL = "https://realdevsquad.com";
32+
export const RDS_STAGING_MAIN_SITE_URL = "https://staging-www.realdevsquad.com";
33+
export const RDS_DEVELOPMENT_MAIN_SITE_URL = "http://localhost:4200";

src/controllers/baseHandler.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,23 @@ export async function baseHandler(
6161
return helloCommand(message.member.user.id);
6262
}
6363
case getCommandName(VERIFY): {
64+
const data = message.data?.options as Array<messageRequestDataOptions>;
65+
const devOption = data?.find((item) => item.name === "dev");
66+
const dev = devOption
67+
? ({
68+
name: devOption.name,
69+
type: devOption.type,
70+
value: Boolean(devOption.value),
71+
} as DevFlag)
72+
: undefined;
6473
return await verifyCommand(
6574
message.member.user.id,
6675
message.member.user.avatar,
6776
message.member.user.username,
6877
message.member.user.discriminator,
6978
message.member.joined_at,
70-
env
79+
env,
80+
dev
7181
);
7282
}
7383
case getCommandName(MENTION_EACH): {

src/controllers/verifyCommand.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@ import { env } from "../typeDefinitions/default.types";
88
import { discordEphemeralResponse } from "../utils/discordEphemeralResponse";
99
import { generateUniqueToken } from "../utils/generateUniqueToken";
1010
import { sendUserDiscordData } from "../utils/sendUserDiscordData";
11+
import { DevFlag } from "../typeDefinitions/verify.types";
1112

1213
export async function verifyCommand(
1314
userId: number,
1415
userAvatarHash: string,
1516
userName: string,
1617
discriminator: string,
1718
discordJoinedAt: string,
18-
env: env
19+
env: env,
20+
dev?: DevFlag
1921
) {
2022
const token = await generateUniqueToken();
21-
2223
const response = await sendUserDiscordData(
2324
token,
2425
userId,
@@ -29,8 +30,15 @@ export async function verifyCommand(
2930
env
3031
);
3132
if (response?.status === 201 || response?.status === 200) {
32-
const verificationSiteURL = config(env).VERIFICATION_SITE_URL;
33-
const message = `${VERIFICATION_STRING}\n${verificationSiteURL}/discord?token=${token}\n${VERIFICATION_SUBSTRING}`;
33+
let verificationSiteURL = "";
34+
let message = "";
35+
if (dev?.value) {
36+
verificationSiteURL = config(env).MAIN_SITE_URL;
37+
message = `${VERIFICATION_STRING}\n${verificationSiteURL}/discord?dev=true&token=${token}\n${VERIFICATION_SUBSTRING}`;
38+
} else {
39+
verificationSiteURL = config(env).VERIFICATION_SITE_URL;
40+
message = `${VERIFICATION_STRING}\n${verificationSiteURL}/discord?token=${token}\n${VERIFICATION_SUBSTRING}`;
41+
}
3442
return discordEphemeralResponse(message);
3543
} else {
3644
return discordEphemeralResponse(RETRY_COMMAND);

src/typeDefinitions/default.types.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export interface variables {
1313
TRACKING_CHANNEL_URL: string;
1414
PROFILE_SERVICE_HELP_GROUP_ID: string;
1515
RDS_STATUS_SITE_URL: string;
16+
MAIN_SITE_URL: string;
1617
}
1718

1819
export interface discordCommand {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export type DevFlag = {
2+
name: string;
3+
type: number;
4+
value: boolean;
5+
};

tests/unit/handlers/verifyCommand.test.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
env,
1111
mockDateNow,
1212
} from "../../fixtures/fixture";
13+
import { DevFlag } from "../../../src/typeDefinitions/verify.types";
1314

1415
describe("verifyCommand", () => {
1516
beforeEach(() => {
@@ -24,6 +25,68 @@ describe("verifyCommand", () => {
2425
jest.spyOn(Date, "now").mockRestore();
2526
});
2627

28+
test("should return message with verification site url when dev is false", async () => {
29+
jest.spyOn(global, "fetch").mockResolvedValueOnce({
30+
ok: true,
31+
status: 200,
32+
json: jest.fn().mockResolvedValueOnce(discordUserData),
33+
} as unknown as Response);
34+
35+
const { verifyCommand } = await import(
36+
"../../../src/controllers/verifyCommand"
37+
);
38+
39+
const result = await verifyCommand(
40+
1,
41+
"userAvatarHash",
42+
"userName",
43+
"discriminator",
44+
"2021-07-25T19:25:16.172000+00:00",
45+
env,
46+
{
47+
value: false,
48+
type: 5,
49+
name: "dev",
50+
} as DevFlag
51+
);
52+
53+
const resultText = await result.text();
54+
const resultData = JSON.parse(resultText);
55+
56+
const verificationSiteURL = config(env).VERIFICATION_SITE_URL;
57+
const message = `${VERIFICATION_STRING}\n${verificationSiteURL}/discord?token=${UNIQUE_TOKEN}\n${VERIFICATION_SUBSTRING}`;
58+
expect(resultData.data.content).toEqual(message);
59+
});
60+
61+
test("should return message with verification site url when dev is true", async () => {
62+
jest.spyOn(global, "fetch").mockResolvedValueOnce({
63+
ok: true,
64+
status: 200,
65+
json: jest.fn().mockResolvedValueOnce(discordUserData),
66+
} as unknown as Response);
67+
68+
const { verifyCommand } = await import(
69+
"../../../src/controllers/verifyCommand"
70+
);
71+
72+
const result = await verifyCommand(
73+
1,
74+
"userAvatarHash",
75+
"userName",
76+
"discriminator",
77+
"2021-07-25T19:25:16.172000+00:00",
78+
env,
79+
{ value: true, type: 5, name: "dev" } as DevFlag
80+
);
81+
82+
const resultText = await result.text();
83+
const resultData = JSON.parse(resultText);
84+
85+
const verificationSiteURL = config(env).MAIN_SITE_URL;
86+
const message = `${VERIFICATION_STRING}\n${verificationSiteURL}/discord?dev=true&token=${UNIQUE_TOKEN}\n${VERIFICATION_SUBSTRING}`;
87+
expect(resultData.data.content).toEqual(message);
88+
});
89+
2790
test("should return JSON response when response is ok", async () => {
2891
jest.spyOn(global, "fetch").mockResolvedValueOnce({
2992
ok: true,

0 commit comments

Comments
 (0)