Skip to content

Commit e22dfeb

Browse files
committed
POST /api/clans/:name and fix /api/clans/:name/leave
1 parent a3e4daa commit e22dfeb

File tree

1 file changed

+50
-5
lines changed

1 file changed

+50
-5
lines changed

backend/api/APIController.ts

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,18 @@ export default class APIController {
128128
if (!members.includes(requester.username)) return res.status(400).json({
129129
message: "Requested user is not a member of this clan"
130130
});
131+
131132
members.splice(members.indexOf(requester.username), 1);
132133
await this.base.db.run("UPDATE accounts SET clan = ? WHERE username = ?", null, requester.username);
133-
await this.base.db.run("UPDATE clans SET members = ? WHERE name = ?", JSON.stringify(members), req.params.name);
134+
if (members.length === 0) {
135+
await this.base.db.run("DELETE FROM clans WHERE name = ?", req.params.name);
136+
} else {
137+
await this.base.db.run("UPDATE clans SET members = ? WHERE name = ?", JSON.stringify(members), req.params.name);
138+
}
134139
res.json({ members });
135140
});
136141

137-
// (TODO) DELETE Endpoint: /api/clans/:name
142+
// DELETE Endpoint: /api/clans/:name
138143
// Deletes a clan by its name (a clan can only be deleted by its leader)
139144
this.app.delete("/api/clans/:name", async (req: express.Request, res: express.Response) => {
140145
const { session } = req.headers;
@@ -147,7 +152,7 @@ export default class APIController {
147152
message: "Invalid session ID provided"
148153
});
149154

150-
const clan: ClanData | undefined = await this.base.db.get("SELECT members FROM clans WHERE name = ?", req.params.name);
155+
const clan: ClanData | undefined = await this.base.db.get("SELECT leader FROM clans WHERE name = ?", req.params.name);
151156
if (!clan) return res.status(404).json({
152157
message: "Clan not found"
153158
});
@@ -161,10 +166,50 @@ export default class APIController {
161166
res.json(clan);
162167
});
163168

164-
// (TODO) POST Endpoint: /api/clans/:name
169+
// POST Endpoint: /api/clans/:name
165170
// Creates a new clan
166-
this.app.post("/api/clans/:name", (req: express.Request, res: express.Response) => {
171+
this.app.post("/api/clans/:name", async (req: express.Request, res: express.Response) => {
172+
const { session, description } = req.headers;
173+
if (!session) return res.status(400).json({
174+
message: "No session header provided"
175+
});
176+
if (!description || typeof description !== "string" || description.length >= 1024) return res.status(400).json({
177+
message: "Invalid description length"
178+
});
179+
180+
const requester: Socket | undefined = this.base.sockets.find((v: Socket) => v.sessionid === session);
181+
if (!requester) return res.status(400).json({
182+
message: "Invalid session ID provided"
183+
});
184+
185+
const clan: ClanData | undefined = await this.base.db.get("SELECT 1 FROM clans WHERE name = ?", req.params.name);
186+
if (clan) return res.status(400).json({
187+
message: "Clan already exists"
188+
});
189+
190+
const { clan: userClan } = await this.base.db.get("SELECT clan FROM accounts WHERE username = ?", requester.username);
191+
if (userClan) return res.status(400).json({
192+
message: "Requested user is already in a clan"
193+
});
167194

195+
const newClan: Clan = new Clan({
196+
cr: 0,
197+
description,
198+
joinable: 1,
199+
leader: requester.username,
200+
members: JSON.stringify([requester.username]),
201+
name: req.params.name,
202+
tag: req.params.name.substr(0, 4)
203+
});
204+
205+
await this.base.db.run("INSERT INTO clans VALUES (?, ?, 0, ?, ?, 1, ?)",
206+
newClan.name, // clan name
207+
newClan.leader, // clan leader
208+
JSON.stringify(newClan.members), // members
209+
newClan.description, // clan description
210+
newClan.tag // clan tag
211+
);
212+
res.json(newClan);
168213
});
169214

170215
// GET Endpoint: /api/executeSQL/:method

0 commit comments

Comments
 (0)