Skip to content

Commit 5730062

Browse files
committed
[Feature] Add APIs for fetching role information
1 parent 89d30d0 commit 5730062

File tree

8 files changed

+359
-39
lines changed

8 files changed

+359
-39
lines changed

src/constants/responses.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,10 @@ export const ROLE_ADDED = "Role added successfully";
2727
export const NAME_CHANGED = "User nickname changed successfully";
2828

2929
export const ROLE_REMOVED = "Role Removed successfully";
30+
31+
export const ROLE_FETCH_FAILED_MESSAGE =
32+
"Oops! We are experiencing an issue fetching roles.";
33+
34+
export const ROLE_FETCH_FAILED_ERROR = {
35+
error: ROLE_FETCH_FAILED_MESSAGE,
36+
};

src/controllers/guildRoleHandler.ts

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import {
66
addGroupRole,
77
createGuildRole,
88
removeGuildRole,
9+
getGuildRoleByName,
10+
getGuildRoles,
911
} from "../utils/guildRole";
1012
import {
1113
createNewRole,
@@ -69,14 +71,52 @@ export async function removeGuildRoleHandler(request: IRequest, env: env) {
6971
}
7072
}
7173
export async function getGuildRolesHandler(request: IRequest, env: env) {
72-
// To be implemented
73-
return new JSONResponse(response.NOT_FOUND);
74+
const authHeader = request.headers.get("Authorization");
75+
76+
if (!authHeader) {
77+
return new JSONResponse(response.BAD_SIGNATURE, { status: 401 });
78+
}
79+
try {
80+
await verifyAuthToken(authHeader, env);
81+
const roles = await getGuildRoles(env);
82+
return new JSONResponse({ roles });
83+
} catch (err: any) {
84+
if (err.message === response.ROLE_FETCH_FAILED_MESSAGE) {
85+
return new JSONResponse(response.ROLE_FETCH_FAILED_ERROR, {
86+
status: 500,
87+
});
88+
}
89+
return new JSONResponse(response.INTERNAL_SERVER_ERROR, { status: 500 });
90+
}
7491
}
7592

7693
export async function getGuildRoleByRoleNameHandler(
7794
request: IRequest,
7895
env: env
7996
) {
80-
// To be implemented
81-
return new JSONResponse(response.NOT_FOUND);
97+
const authHeader = request.headers.get("Authorization");
98+
const roleName = decodeURI(request.params?.roleName ?? "");
99+
100+
if (!authHeader) {
101+
return new JSONResponse(response.BAD_SIGNATURE, { status: 401 });
102+
}
103+
104+
if (!roleName) {
105+
return new JSONResponse(response.NOT_FOUND, { status: 404 });
106+
}
107+
try {
108+
await verifyAuthToken(authHeader, env);
109+
const role = await getGuildRoleByName(roleName, env);
110+
if (!role) {
111+
return new JSONResponse(response.NOT_FOUND, { status: 404 });
112+
}
113+
return new JSONResponse(role);
114+
} catch (err: any) {
115+
if (err.message === response.ROLE_FETCH_FAILED_MESSAGE) {
116+
return new JSONResponse(response.ROLE_FETCH_FAILED_ERROR, {
117+
status: 500,
118+
});
119+
}
120+
return new JSONResponse(response.INTERNAL_SERVER_ERROR, { status: 500 });
121+
}
82122
}

src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
addGroupRoleHandler,
1111
createGuildRoleHandler,
1212
removeGuildRoleHandler,
13+
getGuildRoleByRoleNameHandler,
1314
getGuildRolesHandler,
1415
} from "./controllers/guildRoleHandler";
1516
import { getMembersInServerHandler } from "./controllers/getMembersInServer";
@@ -31,8 +32,11 @@ router.put("/roles/create", createGuildRoleHandler);
3132
router.put("/roles/add", addGroupRoleHandler);
3233

3334
router.delete("/roles", removeGuildRoleHandler);
35+
3436
router.get("/roles", getGuildRolesHandler);
3537

38+
router.get("/roles/:roleName", getGuildRoleByRoleNameHandler);
39+
3640
router.get("/discord-members", getMembersInServerHandler);
3741

3842
router.get("/member/:id", getGuildMemberDetailsHandler);

src/typeDefinitions/role.types.d.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,19 @@ export type GuildRole = {
22
id: string;
33
name: string;
44
};
5+
6+
export type GuildDetails = {
7+
// This type defines the partial guild details response that we get from discord
8+
id: string;
9+
name: string;
10+
roles: Array<{
11+
id: string;
12+
name: string;
13+
permissions: string;
14+
position: number;
15+
color: number;
16+
hoist: boolean;
17+
managed: boolean;
18+
mentionable: boolean;
19+
}>;
20+
};

src/utils/guildRole.ts

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
INTERNAL_SERVER_ERROR,
33
ROLE_ADDED,
44
ROLE_REMOVED,
5+
ROLE_FETCH_FAILED_MESSAGE,
56
} from "../constants/responses";
67
import { DISCORD_BASE_URL } from "../constants/urls";
78
import { env } from "../typeDefinitions/default.types";
@@ -10,7 +11,7 @@ import {
1011
guildRoleResponse,
1112
memberGroupRole,
1213
} from "../typeDefinitions/discordMessage.types";
13-
import { GuildRole } from "../typeDefinitions/role.types";
14+
import { GuildDetails, GuildRole } from "../typeDefinitions/role.types";
1415

1516
export async function createGuildRole(
1617
body: createNewRole,
@@ -86,17 +87,33 @@ export async function removeGuildRole(details: memberGroupRole, env: env) {
8687
}
8788
}
8889

89-
9090
export async function getGuildRoles(env: env): Promise<Array<GuildRole>> {
91-
return [];
91+
const guildDetailsUrl = `${DISCORD_BASE_URL}/guilds/${env.DISCORD_GUILD_ID}`;
92+
93+
const response = await fetch(guildDetailsUrl, {
94+
method: "GET",
95+
headers: {
96+
"Content-Type": "application/json",
97+
Authorization: `Bot ${env.DISCORD_TOKEN}`,
98+
},
99+
});
100+
101+
if (!response.ok) {
102+
throw new Error(ROLE_FETCH_FAILED_MESSAGE);
103+
}
104+
105+
const guildDetails: GuildDetails = await response.json();
106+
107+
return guildDetails.roles.map((role) => ({
108+
id: role.id,
109+
name: role.name,
110+
}));
92111
}
93112

94113
export async function getGuildRoleByName(
95114
roleName: string,
96115
env: env
97-
): Promise<GuildRole> {
98-
return {
99-
id: "dummy-id",
100-
name: "dummy-name",
101-
};
116+
): Promise<GuildRole | undefined> {
117+
const roles = await getGuildRoles(env);
118+
return roles.find((role) => role.name === roleName);
102119
}

tests/fixtures/fixture.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,30 @@ export const generateDummyRequestObject = ({
112112
headers: new Map(Object.entries(headers ?? {})),
113113
};
114114
};
115+
116+
export const guildDetailsMock = {
117+
id: "123434232324242424",
118+
name: "test server",
119+
roles: [
120+
{
121+
id: "1234567889",
122+
name: "@everyone",
123+
permissions: "",
124+
position: 2,
125+
color: 2,
126+
hoist: true,
127+
managed: true,
128+
mentionable: true,
129+
},
130+
{
131+
id: "12344567",
132+
name: "bot one",
133+
permissions: "",
134+
position: 2,
135+
color: 2,
136+
hoist: true,
137+
managed: true,
138+
mentionable: true,
139+
},
140+
],
141+
};

0 commit comments

Comments
 (0)