diff --git a/config/config.ts b/config/config.ts index 70e8e89..f681517 100644 --- a/config/config.ts +++ b/config/config.ts @@ -13,6 +13,9 @@ import { RDS_STAGING_STATUS_SITE_URL, RDS_DASHBOARD_SITE_URL, RDS_STAGING_DASHBOARD_SITE_URL, + RDS_MAIN_SITE_URL, + RDS_STAGING_MAIN_SITE_URL, + RDS_DEVELOPMENT_MAIN_SITE_URL, } from "../src/constants/urls"; import { DISCORD_PROFILE_SERVICE_HELP_GROUP, @@ -74,6 +77,7 @@ const config = (env: env) => { PROFILE_SERVICE_HELP_GROUP_ID: DISCORD_PROFILE_SERVICE_HELP_GROUP, RDS_STATUS_SITE_URL: RDS_STATUS_SITE_URL, DASHBOARD_SITE_URL: RDS_DASHBOARD_SITE_URL, + MAIN_SITE_URL: RDS_MAIN_SITE_URL, }, staging: { RDS_BASE_API_URL: RDS_BASE_STAGING_API_URL, @@ -82,6 +86,7 @@ const config = (env: env) => { PROFILE_SERVICE_HELP_GROUP_ID: DISCORD_PROFILE_SERVICE_STAGING_HELP_GROUP, RDS_STATUS_SITE_URL: RDS_STAGING_STATUS_SITE_URL, DASHBOARD_SITE_URL: RDS_STAGING_DASHBOARD_SITE_URL, + MAIN_SITE_URL: RDS_STAGING_MAIN_SITE_URL, }, default: { RDS_BASE_API_URL: RDS_BASE_DEVELOPMENT_API_URL, @@ -91,6 +96,7 @@ const config = (env: env) => { DISCORD_PROFILE_SERVICE_DEVELOPMENT_HELP_GROUP, RDS_STATUS_SITE_URL: RDS_STATUS_SITE_URL, DASHBOARD_SITE_URL: RDS_DASHBOARD_SITE_URL, + MAIN_SITE_URL: RDS_DEVELOPMENT_MAIN_SITE_URL, }, }; diff --git a/src/constants/commands.ts b/src/constants/commands.ts index 0e3fda7..d1a00d3 100644 --- a/src/constants/commands.ts +++ b/src/constants/commands.ts @@ -11,6 +11,14 @@ export const VERIFY = { name: "verify", description: "Generate a link with user specific token to link with RDS backend.", + options: [ + { + name: "dev", + description: "Use new website for verification.", + type: 5, + required: false, + }, + ], }; export const GROUP_INVITE = { diff --git a/src/constants/urls.ts b/src/constants/urls.ts index 6ebf15e..2779c08 100644 --- a/src/constants/urls.ts +++ b/src/constants/urls.ts @@ -27,3 +27,7 @@ export const RDS_STAGING_STATUS_SITE_URL = export const RDS_DASHBOARD_SITE_URL = "https://dashboard.realdevsquad.com"; export const RDS_STAGING_DASHBOARD_SITE_URL = "https://staging-dashboard.realdevsquad.com"; + +export const RDS_MAIN_SITE_URL = "https://realdevsquad.com"; +export const RDS_STAGING_MAIN_SITE_URL = "https://staging-www.realdevsquad.com"; +export const RDS_DEVELOPMENT_MAIN_SITE_URL = "http://localhost:4200"; diff --git a/src/controllers/baseHandler.ts b/src/controllers/baseHandler.ts index 645be46..6c79bef 100644 --- a/src/controllers/baseHandler.ts +++ b/src/controllers/baseHandler.ts @@ -61,13 +61,23 @@ export async function baseHandler( return helloCommand(message.member.user.id); } case getCommandName(VERIFY): { + const data = message.data?.options as Array; + const devOption = data?.find((item) => item.name === "dev"); + const dev = devOption + ? ({ + name: devOption.name, + type: devOption.type, + value: Boolean(devOption.value), + } as DevFlag) + : undefined; return await verifyCommand( message.member.user.id, message.member.user.avatar, message.member.user.username, message.member.user.discriminator, message.member.joined_at, - env + env, + dev ); } case getCommandName(MENTION_EACH): { diff --git a/src/controllers/verifyCommand.ts b/src/controllers/verifyCommand.ts index f430495..5fde0d8 100644 --- a/src/controllers/verifyCommand.ts +++ b/src/controllers/verifyCommand.ts @@ -8,6 +8,7 @@ import { env } from "../typeDefinitions/default.types"; import { discordEphemeralResponse } from "../utils/discordEphemeralResponse"; import { generateUniqueToken } from "../utils/generateUniqueToken"; import { sendUserDiscordData } from "../utils/sendUserDiscordData"; +import { DevFlag } from "../typeDefinitions/verify.types"; export async function verifyCommand( userId: number, @@ -15,10 +16,10 @@ export async function verifyCommand( userName: string, discriminator: string, discordJoinedAt: string, - env: env + env: env, + dev?: DevFlag ) { const token = await generateUniqueToken(); - const response = await sendUserDiscordData( token, userId, @@ -29,8 +30,15 @@ export async function verifyCommand( env ); if (response?.status === 201 || response?.status === 200) { - const verificationSiteURL = config(env).VERIFICATION_SITE_URL; - const message = `${VERIFICATION_STRING}\n${verificationSiteURL}/discord?token=${token}\n${VERIFICATION_SUBSTRING}`; + let verificationSiteURL = ""; + let message = ""; + if (dev?.value) { + verificationSiteURL = config(env).MAIN_SITE_URL; + message = `${VERIFICATION_STRING}\n${verificationSiteURL}/discord?dev=true&token=${token}\n${VERIFICATION_SUBSTRING}`; + } else { + verificationSiteURL = config(env).VERIFICATION_SITE_URL; + message = `${VERIFICATION_STRING}\n${verificationSiteURL}/discord?token=${token}\n${VERIFICATION_SUBSTRING}`; + } return discordEphemeralResponse(message); } else { return discordEphemeralResponse(RETRY_COMMAND); diff --git a/src/typeDefinitions/default.types.d.ts b/src/typeDefinitions/default.types.d.ts index b1828b2..fac737f 100644 --- a/src/typeDefinitions/default.types.d.ts +++ b/src/typeDefinitions/default.types.d.ts @@ -13,6 +13,7 @@ export interface variables { TRACKING_CHANNEL_URL: string; PROFILE_SERVICE_HELP_GROUP_ID: string; RDS_STATUS_SITE_URL: string; + MAIN_SITE_URL: string; } export interface discordCommand { diff --git a/src/typeDefinitions/verify.types.ts b/src/typeDefinitions/verify.types.ts new file mode 100644 index 0000000..f2de01e --- /dev/null +++ b/src/typeDefinitions/verify.types.ts @@ -0,0 +1,5 @@ +export type DevFlag = { + name: string; + type: number; + value: boolean; +}; diff --git a/tests/unit/handlers/verifyCommand.test.ts b/tests/unit/handlers/verifyCommand.test.ts index 8f56629..78e637c 100644 --- a/tests/unit/handlers/verifyCommand.test.ts +++ b/tests/unit/handlers/verifyCommand.test.ts @@ -10,6 +10,7 @@ import { env, mockDateNow, } from "../../fixtures/fixture"; +import { DevFlag } from "../../../src/typeDefinitions/verify.types"; describe("verifyCommand", () => { beforeEach(() => { @@ -24,6 +25,68 @@ describe("verifyCommand", () => { jest.spyOn(Date, "now").mockRestore(); }); + test("should return message with verification site url when dev is false", async () => { + jest.spyOn(global, "fetch").mockResolvedValueOnce({ + ok: true, + status: 200, + json: jest.fn().mockResolvedValueOnce(discordUserData), + } as unknown as Response); + + const { verifyCommand } = await import( + "../../../src/controllers/verifyCommand" + ); + + const result = await verifyCommand( + 1, + "userAvatarHash", + "userName", + "discriminator", + "2021-07-25T19:25:16.172000+00:00", + env, + { + value: false, + type: 5, + name: "dev", + } as DevFlag + ); + + const resultText = await result.text(); + const resultData = JSON.parse(resultText); + + const verificationSiteURL = config(env).VERIFICATION_SITE_URL; + const message = `${VERIFICATION_STRING}\n${verificationSiteURL}/discord?token=${UNIQUE_TOKEN}\n${VERIFICATION_SUBSTRING}`; + expect(resultData.data.content).toEqual(message); + }); + + test("should return message with verification site url when dev is true", async () => { + jest.spyOn(global, "fetch").mockResolvedValueOnce({ + ok: true, + status: 200, + json: jest.fn().mockResolvedValueOnce(discordUserData), + } as unknown as Response); + + const { verifyCommand } = await import( + "../../../src/controllers/verifyCommand" + ); + + const result = await verifyCommand( + 1, + "userAvatarHash", + "userName", + "discriminator", + "2021-07-25T19:25:16.172000+00:00", + env, + { value: true, type: 5, name: "dev" } as DevFlag + ); + + const resultText = await result.text(); + const resultData = JSON.parse(resultText); + + const verificationSiteURL = config(env).MAIN_SITE_URL; + const message = `${VERIFICATION_STRING}\n${verificationSiteURL}/discord?dev=true&token=${UNIQUE_TOKEN}\n${VERIFICATION_SUBSTRING}`; + expect(resultData.data.content).toEqual(message); + }); + test("should return JSON response when response is ok", async () => { jest.spyOn(global, "fetch").mockResolvedValueOnce({ ok: true,