Skip to content

Commit

Permalink
feat: added command and handler
Browse files Browse the repository at this point in the history
  • Loading branch information
pankajjs committed Dec 17, 2024
1 parent 15e41cc commit 40742cd
Show file tree
Hide file tree
Showing 6 changed files with 172 additions and 0 deletions.
31 changes: 31 additions & 0 deletions src/constants/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -217,3 +217,34 @@ export const NOTIFY_ONBOARDING = {
},
],
};

export const ONBOARDING_EXTENSION = {
name: "onboarding-extension",
description: "This command helps to create an onboarding extension request.",
options: [
{
name: "username",
description: "Username of onboarding user",
type: 6,
required: true,
},
{
name: "number-of-days",
description: "Number of days required for the extension request",
type: 4,
required: true,
},
{
name: "reason",
description: "Reason for the extension request",
type: 3,
required: true,
},
{
name: "dev",
description: "Feature flag",
type: 5,
required: true,
},
],
};
17 changes: 17 additions & 0 deletions src/controllers/baseHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import {
REMOVE,
GROUP_INVITE,
GRANT_AWS_ACCESS,
ONBOARDING_EXTENSION,
} from "../constants/commands";
import { updateNickName } from "../utils/updateNickname";
import { discordEphemeralResponse } from "../utils/discordEphemeralResponse";
Expand All @@ -46,6 +47,7 @@ import { DevFlag } from "../typeDefinitions/filterUsersByRole";
import { kickEachUser } from "./kickEachUser";
import { groupInvite } from "./groupInvite";
import { grantAWSAccessCommand } from "./grantAWSAccessCommand";
import { onboardingExtensionCommand } from "./onboardingExtensionCommand";

export async function baseHandler(
message: discordMessageRequest,
Expand Down Expand Up @@ -187,6 +189,21 @@ export async function baseHandler(

return await groupInvite(data[0].value, data[1].value, env);
}

case getCommandName(ONBOARDING_EXTENSION): {
const data = message.data?.options as Array<messageRequestDataOptions>;
const transformedArgument = {
userId: data[0],
numberOfDays: data[1],
reason: data[2],
channelId: message.channel_id,
member: message.member,
dev: data.find((item) => item.name === "dev") as unknown as DevFlag,
};

return await onboardingExtensionCommand(transformedArgument, env, ctx);
}

default: {
return commandNotFound();
}
Expand Down
45 changes: 45 additions & 0 deletions src/controllers/onboardingExtensionCommand.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { env } from "../typeDefinitions/default.types";
import {
messageRequestDataOptions,
messageRequestMember,
} from "../typeDefinitions/discordMessage.types";
import { DevFlag } from "../typeDefinitions/filterUsersByRole";
import { discordTextResponse } from "../utils/discordResponse";
import {
createOnboardingExtension,
CreateOnboardingExtensionArgs,
} from "../utils/onboardingExtension";

export async function onboardingExtensionCommand(
transformedArgument: {
member: messageRequestMember;
userId: messageRequestDataOptions;
numberOfDays: messageRequestDataOptions;
reason: messageRequestDataOptions;
channelId: number;
dev?: DevFlag;
},
env: env,
ctx: ExecutionContext
) {
const dev = transformedArgument.dev?.value || false;
const discordId = transformedArgument.member.user.id.toString();

if (!dev) {
return discordTextResponse(`<@${discordId}> Feature not implemented`);
}

const args: CreateOnboardingExtensionArgs = {
channelId: transformedArgument.channelId,
userId: transformedArgument.userId.value,
numberOfDays: Number(transformedArgument.numberOfDays.value),
reason: transformedArgument.reason.value,
discordId: discordId,
};

const initialResponse = `<@${discordId}> Processing your request for onboarding extension`;

ctx.waitUntil(createOnboardingExtension(args, env));

return discordTextResponse(initialResponse);
}
2 changes: 2 additions & 0 deletions src/register.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
REMOVE,
GROUP_INVITE,
GRANT_AWS_ACCESS,
ONBOARDING_EXTENSION,
} from "./constants/commands";
import { config } from "dotenv";
import { DISCORD_BASE_URL } from "./constants/urls";
Expand Down Expand Up @@ -44,6 +45,7 @@ async function registerGuildCommands(
REMOVE,
GROUP_INVITE,
GRANT_AWS_ACCESS,
ONBOARDING_EXTENSION,
];

try {
Expand Down
59 changes: 59 additions & 0 deletions src/utils/onboardingExtension.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import config from "../../config/config";
import { DISCORD_BASE_URL } from "../constants/urls";
import { env } from "../typeDefinitions/default.types";
import { generateDiscordAuthToken } from "./authTokenGenerator";
import { sendReplyInDiscordChannel } from "./sendReplyInDiscordChannel";

export type CreateOnboardingExtensionArgs = {
userId: string;
channelId: number;
reason: string;
numberOfDays: number;
discordId: string;
};

export const createOnboardingExtension = async (
args: CreateOnboardingExtensionArgs,
env: env
) => {
const { channelId } = args;

const authToken = await generateDiscordAuthToken(
"Cloudflare Worker",
Math.floor(Date.now() / 1000) + 2,
env.BOT_PRIVATE_KEY,
"RS256"
);

const discordReplyUrl = `${DISCORD_BASE_URL}/channels/${channelId}/messages`;
const base_url = config(env).RDS_BASE_API_URL;
const createOnboardingExtensionUrl = `${base_url}/requests?dev=true`;
const requestBody = {
userId: args.userId,
type: "ONBOARDING",
numberOfDays: args.numberOfDays,
requestedBy: args.discordId,
reason: args.reason,
};

let content: string;

try {
const response = await fetch(createOnboardingExtensionUrl, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${authToken}`,
},
body: JSON.stringify(requestBody),
});
const jsonResponse = (await response.json()) as unknown as {
message: string;
};
content = `<@${args.discordId}> ${jsonResponse.message}`;
await sendReplyInDiscordChannel(discordReplyUrl, content, env);
} catch (err) {
content = `<@${args.discordId}> Error occurred while creating onboarding extension request.`;
await sendReplyInDiscordChannel(discordReplyUrl, content, env);
}
};
18 changes: 18 additions & 0 deletions src/utils/sendReplyInDiscordChannel.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { env } from "../typeDefinitions/default.types";

export const sendReplyInDiscordChannel = async (
discordReplyUrl: string,
body: any,
env: env
) => {
await fetch(discordReplyUrl, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bot ${env.DISCORD_TOKEN}`,
},
body: JSON.stringify({
content: body,
}),
});
};

0 comments on commit 40742cd

Please sign in to comment.