Skip to content

Commit 9ab6214

Browse files
Merge pull request #34 from Real-Dev-Squad/fetchcall-to-store-token-in-rds-backend
Store Discord User Data in RDS Backend
2 parents 6848e0a + a1bcf41 commit 9ab6214

File tree

11 files changed

+100
-6
lines changed

11 files changed

+100
-6
lines changed

.github/workflows/register-commands-production.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ jobs:
2929
DISCORD_TOKEN
3030
DISCORD_GUILD_ID
3131
CURRENT_ENVIRONMENT
32+
BOT_PRIVATE_KEY
3233
env:
3334
CURRENT_ENVIRONMENT: production
3435
CLOUDFLARE_API_TOKEN: ${{secrets.CLOUDFLARE_API_TOKEN}}
3536
DISCORD_PUBLIC_KEY: ${{secrets.DISCORD_PUBLIC_KEY}}
3637
DISCORD_TOKEN: ${{secrets.DISCORD_TOKEN}}
38+
BOT_PRIVATE_KEY: ${{secrets.BOT_PRIVATE_KEY}}
3739
DISCORD_GUILD_ID: ${{secrets.DISCORD_GUILD_ID}}

.github/workflows/register-commands-staging.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ jobs:
2929
DISCORD_TOKEN
3030
DISCORD_GUILD_ID
3131
CURRENT_ENVIRONMENT
32+
BOT_PRIVATE_KEY
3233
env:
3334
CURRENT_ENVIRONMENT: staging
3435
CLOUDFLARE_API_TOKEN: ${{secrets.CLOUDFLARE_API_TOKEN}}
3536
DISCORD_PUBLIC_KEY: ${{secrets.DISCORD_PUBLIC_KEY}}
3637
DISCORD_TOKEN: ${{secrets.DISCORD_TOKEN}}
38+
BOT_PRIVATE_KEY: ${{secrets.BOT_PRIVATE_KEY}}
3739
DISCORD_GUILD_ID: ${{secrets.DISCORD_GUILD_ID}}

package-lock.json

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"wrangler": "^2.5.0"
3636
},
3737
"dependencies": {
38+
"@tsndr/cloudflare-worker-jwt": "^2.2.1",
3839
"discord-interactions": "^3.2.0",
3940
"dotenv": "^16.0.3",
4041
"itty-router": "^3.0.11",

src/constants/urls.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ export const RDS_BASE_DEVELOPMENT_API_URL = "http://localhost:3000"; // If neede
44

55
export const DISCORD_BASE_URL = "https://discord.com/api/v10";
66
export const VERIFICATION_SITE_URL = "https://my.realdevsquad.com";
7+
export const STAGING_API_BASE_URL = "https://staging-api.realdevsquad.com";
8+
export const DISCORD_AVATAR_BASE_URL = "https://cdn.discordapp.com/avatars";

src/controllers/baseHandler.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,13 @@ export async function baseHandler(
1818
return helloCommand(message.member.user.id);
1919
}
2020
case getCommandName(VERIFY): {
21-
return await verifyCommand(message.member.user.id, env);
21+
return await verifyCommand(
22+
message.member.user.id,
23+
message.member.user.avatar,
24+
message.member.user.username,
25+
message.member.user.discriminator,
26+
env
27+
);
2228
}
2329
default: {
2430
return commandNotFound();

src/controllers/verifyCommand.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,30 @@ import { env } from "../typeDefinitions/default.types";
33
import { discordTextResponse } from "../utils/discordResponse";
44
import { generateUniqueToken } from "../utils/generateUniqueToken";
55
import { sendDiscordDm } from "../utils/sendDiscordDm";
6+
import { sendUserDiscordData } from "../utils/sendUserDiscordData";
67

7-
export async function verifyCommand(userId: number, env: env) {
8+
export async function verifyCommand(
9+
userId: number,
10+
userAvatarHash: string,
11+
userName: string,
12+
discriminator: string,
13+
env: env
14+
) {
815
const token = await generateUniqueToken();
9-
const message = `${VERIFICATION_SITE_URL}/?token=${token}`;
10-
await sendDiscordDm(userId, env, message);
11-
return discordTextResponse("Please check the DM");
16+
17+
const response = await sendUserDiscordData(
18+
token,
19+
userId,
20+
userAvatarHash,
21+
userName,
22+
discriminator,
23+
env
24+
);
25+
if (response?.status === 201) {
26+
const message = `${VERIFICATION_SITE_URL}/?token=${token}`;
27+
await sendDiscordDm(userId, env, message);
28+
return discordTextResponse("Please check the DM");
29+
} else {
30+
return discordTextResponse("Error, please use the verify command again. ");
31+
}
1232
}

src/typeDefinitions/discordMessage.types.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ export interface messageRequestMember {
2323
export interface messageMember {
2424
id: number;
2525
username: string;
26+
avatar: string;
27+
discriminator: string;
2628
}
2729

2830
export interface createDmChannel {

src/utils/sendUserDiscordData.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { env } from "../typeDefinitions/default.types";
2+
import jwt from "@tsndr/cloudflare-worker-jwt";
3+
import { DISCORD_AVATAR_BASE_URL } from "../constants/urls";
4+
import config from "../../config/config";
5+
6+
export const sendUserDiscordData = async (
7+
token: string,
8+
discordId: number,
9+
userAvatarHash: string,
10+
userName: string,
11+
discriminator: string,
12+
env: env
13+
) => {
14+
const authToken = await jwt.sign(
15+
{ name: "Cloudflare Worker", exp: Math.floor(Date.now() / 1000) + 2 },
16+
env.BOT_PRIVATE_KEY,
17+
{ algorithm: "RS256" }
18+
);
19+
const data = {
20+
type: "discord",
21+
token: token,
22+
attributes: {
23+
discordId: discordId,
24+
userAvatar: `${DISCORD_AVATAR_BASE_URL}/${discordId}/${userAvatarHash}.jpg`,
25+
userName: userName,
26+
discriminator: discriminator,
27+
expiry: Date.now() + 1000 * 60 * 2,
28+
},
29+
};
30+
const base_url = config(env).RDS_BASE_API_URL;
31+
try {
32+
const response = await fetch(`${base_url}/external-accounts`, {
33+
method: "POST",
34+
headers: {
35+
"Content-Type": "application/json",
36+
Authorization: `Bearer ${authToken}`,
37+
},
38+
body: JSON.stringify(data),
39+
});
40+
return response;
41+
} catch (err) {
42+
console.log("Error in sending the discord user data. Error: ", err);
43+
}
44+
};

tests/fixtures/fixture.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export const dummyHelloMessage: discordMessageRequest = {
1010
user: {
1111
id: 123456,
1212
username: "ritik",
13+
avatar: "d1eaa8f8ab5e8235e08e659aef5dfeac",
14+
discriminator: "1234",
1315
},
1416
},
1517
guild_id: 123456,
@@ -24,6 +26,8 @@ export const dummyVerifyMessage: discordMessageRequest = {
2426
user: {
2527
id: 123456,
2628
username: "ritik",
29+
avatar: "d1eaa8f8ab5e8235e08e659aef5dfeac",
30+
discriminator: "1234",
2731
},
2832
},
2933
guild_id: 123456,

0 commit comments

Comments
 (0)