Skip to content

Commit 7e9415e

Browse files
authored
Merge pull request #86 from bksh05/feature/endpoint-to-fetch-role-id
[Feature] Add APIs for fetching role information
2 parents a1903ff + a4a190b commit 7e9415e

File tree

8 files changed

+515
-0
lines changed

8 files changed

+515
-0
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 =
32+
"Oops! We are experiencing an issue fetching roles.";
33+
34+
export const BAD_REQUEST = {
35+
error: "Oops! This is not a proper request.",
36+
};

src/controllers/guildRoleHandler.ts

Lines changed: 73 additions & 0 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,
@@ -68,3 +70,74 @@ export async function removeGuildRoleHandler(request: IRequest, env: env) {
6870
});
6971
}
7072
}
73+
export async function getGuildRolesHandler(request: IRequest, env: env) {
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+
const error =
85+
err?.message === response.ROLE_FETCH_FAILED
86+
? response.ROLE_FETCH_FAILED
87+
: response.INTERNAL_SERVER_ERROR;
88+
return new JSONResponse(
89+
{
90+
error,
91+
},
92+
{
93+
status: 500,
94+
headers: {
95+
"content-type": "application/json;charset=UTF-8",
96+
},
97+
}
98+
);
99+
}
100+
}
101+
102+
export async function getGuildRoleByRoleNameHandler(
103+
request: IRequest,
104+
env: env
105+
) {
106+
const authHeader = request.headers.get("Authorization");
107+
const roleName = decodeURI(request.params?.roleName ?? "");
108+
109+
if (!authHeader) {
110+
return new JSONResponse(response.BAD_SIGNATURE, { status: 401 });
111+
}
112+
113+
if (!roleName) {
114+
return new JSONResponse(response.BAD_REQUEST, { status: 404 });
115+
}
116+
try {
117+
await verifyAuthToken(authHeader, env);
118+
const role = await getGuildRoleByName(roleName, env);
119+
if (!role) {
120+
return new JSONResponse(response.NOT_FOUND, {
121+
status: 404,
122+
headers: {
123+
"content-type": "application/json;charset=UTF-8",
124+
},
125+
});
126+
}
127+
return new JSONResponse(role);
128+
} catch (err: any) {
129+
const error =
130+
err?.message === response.ROLE_FETCH_FAILED
131+
? response.ROLE_FETCH_FAILED
132+
: response.INTERNAL_SERVER_ERROR;
133+
return new JSONResponse(
134+
{ error },
135+
{
136+
status: 500,
137+
headers: {
138+
"content-type": "application/json;charset=UTF-8",
139+
},
140+
}
141+
);
142+
}
143+
}

src/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import {
1010
addGroupRoleHandler,
1111
createGuildRoleHandler,
1212
removeGuildRoleHandler,
13+
getGuildRoleByRoleNameHandler,
14+
getGuildRolesHandler,
1315
} from "./controllers/guildRoleHandler";
1416
import { getMembersInServerHandler } from "./controllers/getMembersInServer";
1517
import { changeNickname } from "./controllers/changeNickname";
@@ -31,6 +33,10 @@ router.put("/roles/add", addGroupRoleHandler);
3133

3234
router.delete("/roles", removeGuildRoleHandler);
3335

36+
router.get("/roles", getGuildRolesHandler);
37+
38+
router.get("/roles/:roleName", getGuildRoleByRoleNameHandler);
39+
3440
router.get("/discord-members", getMembersInServerHandler);
3541

3642
router.get("/member/:id", getGuildMemberDetailsHandler);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export type GuildRole = {
2+
id: string;
3+
name: string;
4+
color: string;
5+
hoist: boolean;
6+
icon?: string;
7+
position?: integer;
8+
managed?: boolean;
9+
mentionable?: boolean;
10+
};
11+
12+
export type Role = Pick<GuildRole, "id" | "name">;

src/utils/guildRole.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
INTERNAL_SERVER_ERROR,
33
ROLE_ADDED,
4+
ROLE_FETCH_FAILED,
45
ROLE_REMOVED,
56
} from "../constants/responses";
67
import { DISCORD_BASE_URL } from "../constants/urls";
@@ -10,6 +11,7 @@ import {
1011
guildRoleResponse,
1112
memberGroupRole,
1213
} from "../typeDefinitions/discordMessage.types";
14+
import { GuildRole, Role } from "../typeDefinitions/role.types";
1315

1416
export async function createGuildRole(
1517
body: createNewRole,
@@ -84,3 +86,38 @@ export async function removeGuildRole(details: memberGroupRole, env: env) {
8486
return INTERNAL_SERVER_ERROR;
8587
}
8688
}
89+
90+
export async function getGuildRoles(env: env): Promise<Array<Role>> {
91+
const guildRolesUrl = `${DISCORD_BASE_URL}/guilds/${env.DISCORD_GUILD_ID}/roles`;
92+
93+
try {
94+
const response = await fetch(guildRolesUrl, {
95+
method: "GET",
96+
headers: {
97+
"Content-Type": "application/json",
98+
Authorization: `Bot ${env.DISCORD_TOKEN}`,
99+
},
100+
});
101+
102+
if (!response.ok) {
103+
throw new Error(ROLE_FETCH_FAILED);
104+
}
105+
106+
const guildRoles: Array<GuildRole> = await response.json();
107+
108+
return guildRoles.map((role) => ({
109+
id: role.id,
110+
name: role.name,
111+
}));
112+
} catch (err) {
113+
throw new Error(ROLE_FETCH_FAILED);
114+
}
115+
}
116+
117+
export async function getGuildRoleByName(
118+
roleName: string,
119+
env: env
120+
): Promise<Role | undefined> {
121+
const roles = await getGuildRoles(env);
122+
return roles?.find((role) => role.name === roleName);
123+
}

tests/fixtures/fixture.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { IRequest } from "itty-router";
12
import {
23
createNewRole,
34
discordMessageRequest,
@@ -95,3 +96,42 @@ export const onlyRoleToBeTagged = {
9596
value: "1118201414078976192",
9697
},
9798
};
99+
100+
export const generateDummyRequestObject = ({
101+
url,
102+
method,
103+
params,
104+
query,
105+
headers, // Object of key value pair
106+
}: Partial<IRequest>): IRequest => {
107+
return {
108+
method: method ?? "GET",
109+
url: url ?? "/roles",
110+
params: params ?? {},
111+
query: query ?? {},
112+
headers: new Map(Object.entries(headers ?? {})),
113+
};
114+
};
115+
116+
export const rolesMock = [
117+
{
118+
id: "1234567889",
119+
name: "@everyone",
120+
permissions: "",
121+
position: 2,
122+
color: 2,
123+
hoist: true,
124+
managed: true,
125+
mentionable: true,
126+
},
127+
{
128+
id: "12344567",
129+
name: "bot one",
130+
permissions: "",
131+
position: 2,
132+
color: 2,
133+
hoist: true,
134+
managed: true,
135+
mentionable: true,
136+
},
137+
];

0 commit comments

Comments
 (0)