diff --git a/src/constants/responses.ts b/src/constants/responses.ts index 59a04ff9..92dd8e2f 100644 --- a/src/constants/responses.ts +++ b/src/constants/responses.ts @@ -65,7 +65,8 @@ export const FAILED_TO_FETCH_TASKS = `Failed to fetch tasks for **{{assignee}}** export const USER_NOT_FOUND = `User Not Found`; export const USER_STATUS_NOT_FOUND = "No Status Found"; -export const FAILED_TO_FETCH_DISCORD_GROUPS = "Failed to fetch discord groups"; +export const FAILED_TO_FETCH_DISCORD_GUILD_ROLE = + "Failed to fetch discord guild role"; export const OVERDUE_DEFAULT_MESSAGE = "You have overdue tasks."; export const OVERDUE_CUSTOM_MESSAGE = diff --git a/src/controllers/groupInvite.ts b/src/controllers/groupInvite.ts index 65b91f82..fc8fb0dc 100644 --- a/src/controllers/groupInvite.ts +++ b/src/controllers/groupInvite.ts @@ -1,7 +1,7 @@ import config from "../../config/config"; import { env } from "../typeDefinitions/default.types"; import { discordTextResponse } from "../utils/discordResponse"; -import * as DiscordGroups from "../utils/fetchDiscordGroups"; +import * as DiscordGroups from "../utils/fetchDiscordGroupById"; import JSONResponse from "../utils/JsonResponse"; export async function groupInvite( @@ -9,14 +9,13 @@ export async function groupInvite( roleId: string, env: env ): Promise { - const response = await DiscordGroups.fetchDiscordGroups(env); - const group = response.groups.find((group) => group.roleid === roleId); + const group = await DiscordGroups.fetchDiscordGroupById(roleId, env); - if (!group) { + if (!group.name.startsWith("group-")) { return discordTextResponse(`<@&${roleId}> is not a valid group.`); } - const groupName = group.rolename.replace(/^group-/, ""); + const groupName = group.name.replace(/^group-/, ""); return discordTextResponse( `<@${userId}> join the group <@&${roleId}> via the link below:\n ${ diff --git a/src/typeDefinitions/group.types.d.ts b/src/typeDefinitions/group.types.d.ts index a10c92a4..ba52bd91 100644 --- a/src/typeDefinitions/group.types.d.ts +++ b/src/typeDefinitions/group.types.d.ts @@ -1,18 +1,4 @@ -export type GroupType = { +export type DiscordGuildRole = { + name: string; id: string; - date: { - _seconds: number; - _nanoseconds: number; - }; - createdBy: string; - rolename: string; - roleid: string; - description: string; - memberCount: number; - isMember: boolean; -}; - -export type GroupResponseType = { - message: string; - groups: GroupType[]; }; diff --git a/src/utils/fetchDiscordGroupById.ts b/src/utils/fetchDiscordGroupById.ts new file mode 100644 index 00000000..cf681e6c --- /dev/null +++ b/src/utils/fetchDiscordGroupById.ts @@ -0,0 +1,34 @@ +import { FAILED_TO_FETCH_DISCORD_GUILD_ROLE } from "../constants/responses"; +import { DISCORD_BASE_URL } from "../constants/urls"; +import { env } from "../typeDefinitions/default.types"; +import { DiscordGuildRole } from "../typeDefinitions/group.types"; +import createDiscordHeaders from "./createDiscordHeaders"; + +async function fetchDiscordGroupById( + roleId: string, + env: env +): Promise { + try { + const url = `${DISCORD_BASE_URL}/guilds/${env.DISCORD_GUILD_ID}/roles/${roleId}`; + const headers: HeadersInit = createDiscordHeaders({ + token: env.DISCORD_TOKEN, + }); + const options = { + method: "GET", + headers, + }; + const response = await fetch(url, options); + + if (!response.ok) { + throw new Error(FAILED_TO_FETCH_DISCORD_GUILD_ROLE); + } + + const responseData: DiscordGuildRole = await response.json(); + return responseData; + } catch (error) { + console.error("An error occurred while fetching discord groups:", error); + throw error; + } +} + +export { fetchDiscordGroupById }; diff --git a/src/utils/fetchDiscordGroups.ts b/src/utils/fetchDiscordGroups.ts deleted file mode 100644 index 7469bace..00000000 --- a/src/utils/fetchDiscordGroups.ts +++ /dev/null @@ -1,23 +0,0 @@ -import config from "../../config/config"; -import { FAILED_TO_FETCH_DISCORD_GROUPS } from "../constants/responses"; -import { env } from "../typeDefinitions/default.types"; -import { GroupResponseType } from "../typeDefinitions/group.types"; - -async function fetchDiscordGroups(env: env): Promise { - try { - const url = `${config(env).RDS_BASE_API_URL}/discord-actions/groups`; - const response = await fetch(url); - - if (!response.ok) { - throw new Error(FAILED_TO_FETCH_DISCORD_GROUPS); - } - - const responseData: GroupResponseType = await response.json(); - return responseData; - } catch (error) { - console.error("An error occurred while fetching discord groups:", error); - throw error; - } -} - -export { fetchDiscordGroups }; diff --git a/tests/fixtures/groups.ts b/tests/fixtures/groups.ts index 84d560d4..40572528 100644 --- a/tests/fixtures/groups.ts +++ b/tests/fixtures/groups.ts @@ -1,46 +1,11 @@ -import { GroupResponseType } from "../../src/typeDefinitions/group.types"; +import { DiscordGuildRole } from "../../src/typeDefinitions/group.types"; -export const groups: GroupResponseType = { - message: "Roles fetched successfully!", - groups: [ - { - id: "27EdauP9UmxCTgAMDPpl", - date: { - _seconds: 1719334613, - _nanoseconds: 934000000, - }, - createdBy: "zXQpimWaGWOFF2sLyrFt", - rolename: "group-testing 3", - roleid: "1255205109340573782", - description: "for testing", - memberCount: 0, - isMember: false, - }, - { - id: "ELjCeNZxhHupn8qU5pWI", - date: { - _seconds: 1718771669, - _nanoseconds: 27000000, - }, - createdBy: "zXQpimWaGWOFF2sLyrFt", - rolename: "group-testing", - roleid: "1252843931306164298", - description: "for testing", - memberCount: 0, - isMember: false, - }, - { - id: "tO4vZe5CC690yOb9Txlh", - date: { - _seconds: 1718771969, - _nanoseconds: 680000000, - }, - createdBy: "zXQpimWaGWOFF2sLyrFt", - rolename: "group-testinge", - roleid: "1252845191472087050", - description: "", - memberCount: 0, - isMember: false, - }, - ], +export const group: DiscordGuildRole = { + id: "1", + name: "group-frontend", +}; + +export const invalidGroup: DiscordGuildRole = { + id: "2", + name: "invalidRole", }; diff --git a/tests/unit/handlers/groupInvite.test.ts b/tests/unit/handlers/groupInvite.test.ts index 534ecfa9..b9679fc6 100644 --- a/tests/unit/handlers/groupInvite.test.ts +++ b/tests/unit/handlers/groupInvite.test.ts @@ -1,39 +1,36 @@ import { environment } from "../../fixtures/config"; -import * as DiscordGroups from "../../../src/utils/fetchDiscordGroups"; +import * as DiscordGroups from "../../../src/utils/fetchDiscordGroupById"; import JSONResponse from "../../../src/utils/JsonResponse"; import { groupInvite } from "../../../src/controllers/groupInvite"; -import { groups } from "../../fixtures/groups"; +import { group, invalidGroup } from "../../fixtures/groups"; import { discordTextResponse } from "../../../src/utils/discordResponse"; describe("Test /group-invite command", () => { - beforeEach(() => { - jest - .spyOn(DiscordGroups, "fetchDiscordGroups") - .mockImplementation(() => Promise.resolve(groups)); - }); - afterEach(() => { jest.resetAllMocks(); jest.restoreAllMocks(); }); it("Should be an instance of JSONResponse", async () => { - const response = await groupInvite( - "1", - groups.groups[0].roleid, - environment[0] - ); + jest + .spyOn(DiscordGroups, "fetchDiscordGroupById") + .mockImplementation(() => Promise.resolve(group)); + + const response = await groupInvite("1", group.id, environment[0]); expect(response).toBeInstanceOf(JSONResponse); }); it("Should return a discordTextResponse if group is not found", async () => { - const invalidRoleId = "invalidRoleId"; + jest + .spyOn(DiscordGroups, "fetchDiscordGroupById") + .mockImplementation(() => Promise.resolve(invalidGroup)); + const expectedResponse = discordTextResponse( - `<@&${invalidRoleId}> is not a valid group.` + `<@&${invalidGroup.id}> is not a valid group.` ); - const response = await groupInvite("1", invalidRoleId, environment[0]); + const response = await groupInvite("1", invalidGroup.id, environment[0]); expect(await response.json()).toEqual(await expectedResponse.json()); });