Skip to content

Commit 214b121

Browse files
committed
add api endpoints
1 parent b622ad7 commit 214b121

File tree

1 file changed

+80
-2
lines changed

1 file changed

+80
-2
lines changed

backend/api/APIController.ts

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import Captcha, {CAPTCHA_LIMIT} from "../structures/Captcha";
1010
import * as DateFormatter from "../utils/DateFormatter";
1111
import EliminationRoom from "../structures/EliminationRoom";
1212
import { Role } from "../structures/Player";
13+
import ClanController from "../clans/ClanController";
1314

1415
// Used for listening to requests that are related to the API
1516
export default class APIController {
@@ -35,8 +36,8 @@ export default class APIController {
3536
message: "Invalid parameter provided"
3637
});
3738
const query: string = req.params.name === "list" ?
38-
"SELECT members, cr, name FROM clans ORDER BY cr DESC LIMIT 10"
39-
: "SELECT members, cr, leader FROM clans WHERE name = ?"
39+
"SELECT members, cr, name, joinable, tag FROM clans ORDER BY cr DESC LIMIT 10"
40+
: "SELECT members, cr, leader, joinable, tag FROM clans WHERE name = ?"
4041
this.base.db[req.params.name !== "list" ? "get" : "all"](query, req.params.name !== "list" ? req.params.name : undefined)
4142
.then((v: Array<any> | any) => {
4243
if (Array.isArray(v)) {
@@ -66,6 +67,83 @@ export default class APIController {
6667
});
6768
});
6869
});
70+
71+
// (TODO) POST Endpoint: /api/clans/:name/join
72+
// Joins a specific clan by its name
73+
// Returns the joined clan
74+
this.app.post("/api/clans/:name/join", async (req: express.Request, res: express.Response) => {
75+
const { session } = req.headers;
76+
if (!session) return res.status(400).json({
77+
message: "No session header provided"
78+
});
79+
80+
const requester: Socket | undefined = this.base.sockets.find((v: Socket) => v.sessionid === session);
81+
if (!requester) return res.status(400).json({
82+
message: "Invalid session ID provided"
83+
});
84+
85+
const clan: any = await this.base.db.get("SELECT members, cr, leader, joinable FROM clans WHERE name = ?", req.params.name);
86+
if (!clan) return res.status(404).json({
87+
message: "Clan not found"
88+
});
89+
if (!clan.joinable) return res.status(403).json({
90+
message: "This clan is not joinable"
91+
});
92+
93+
const members: Array<any> = JSON.parse(clan.members);
94+
if (members.includes(requester.username)) return res.status(400).json({
95+
message: "Requested user is already in this clan"
96+
});
97+
if (members.length >= ClanController.MemberLimit) return res.status(403).json({
98+
message: `Clan already has ${ClanController.MemberLimit} members`
99+
});
100+
101+
members.push(requester.username);
102+
await this.base.db.run("UPDATE accounts SET clan = ? WHERE username = ?", req.params.name, requester.username);
103+
await this.base.db.run("UPDATE clans SET members = ? WHERE name = ?", JSON.stringify(members), req.params.name);
104+
res.json(clan);
105+
});
106+
107+
// (TODO) POST Endpoint: /api/clans/:name/leave
108+
// Leaves a specific clan by its name
109+
// Returns all members of the clan after leaving
110+
this.app.post("/api/clans/:name/leave", async (req: express.Request, res: express.Response) => {
111+
const { session } = req.headers;
112+
if (!session) return res.status(400).json({
113+
message: "No session header provided"
114+
});
115+
116+
const requester: Socket | undefined = this.base.sockets.find((v: Socket) => v.sessionid === session);
117+
if (!requester) return res.status(400).json({
118+
message: "Invalid session ID provided"
119+
});
120+
121+
const clan: any = await this.base.db.get("SELECT members FROM clans WHERE name = ?", req.params.name);
122+
if (!clan) return res.status(404).json({
123+
message: "Clan not found"
124+
});
125+
126+
const members: Array<any> = JSON.parse(clan.members);
127+
if (!members.includes(requester.username)) return res.status(400).json({
128+
message: "Requested user is not a member of this clan"
129+
});
130+
members.splice(members.indexOf(requester.username), 1);
131+
await this.base.db.run("UPDATE accounts SET clan = ? WHERE username = ?", null, requester.username);
132+
await this.base.db.run("UPDATE clans SET members = ? WHERE name = ?", JSON.stringify(members), req.params.name);
133+
res.json({ members });
134+
});
135+
136+
// (TODO) DELETE Endpoint: /api/clans/:name
137+
// Deletes a clan by its name (a clan can only be deleted by its leader)
138+
this.app.delete("/api/clans/:name", (req: express.Request, res: express.Response) => {
139+
140+
});
141+
142+
// (TODO) POST Endpoint: /api/clans/:name
143+
// Creates a new clan
144+
this.app.post("/api/clans/:name", (req: express.Request, res: express.Response) => {
145+
146+
});
69147

70148
// GET Endpoint: /api/executeSQL/:method
71149
// Executes an SQL query and returns it as body

0 commit comments

Comments
 (0)