@@ -9,8 +9,9 @@ import Jimp = require("jimp");
99import Captcha , { CAPTCHA_LIMIT } from "../structures/Captcha" ;
1010import * as DateFormatter from "../utils/DateFormatter" ;
1111import EliminationRoom from "../structures/EliminationRoom" ;
12- import { Role } from "../structures/Player" ;
12+ import Player , { Role } from "../structures/Player" ;
1313import ClanController from "../clans/ClanController" ;
14+ import Clan , { ClanData } from "../structures/Clan" ;
1415
1516// Used for listening to requests that are related to the API
1617export default class APIController {
@@ -39,9 +40,9 @@ export default class APIController {
3940 "SELECT members, cr, name, joinable, tag FROM clans ORDER BY cr DESC LIMIT 10"
4041 : "SELECT members, cr, leader, joinable, tag FROM clans WHERE name = ?"
4142 this . base . db [ req . params . name !== "list" ? "get" : "all" ] ( query , req . params . name !== "list" ? req . params . name : undefined )
42- . then ( ( v : Array < any > | any ) => {
43+ . then ( ( v : Array < ClanData > | ClanData ) => {
4344 if ( Array . isArray ( v ) ) {
44- res . json ( v . map ( ( r : any ) => ( {
45+ res . json ( v . map ( ( r : ClanData ) => ( {
4546 ...r ,
4647 members : JSON . parse ( r . members )
4748 } ) ) ) ;
@@ -72,6 +73,7 @@ export default class APIController {
7273 // Joins a specific clan by its name
7374 // Returns the joined clan
7475 this . app . post ( "/api/clans/:name/join" , async ( req : express . Request , res : express . Response ) => {
76+ // todo: this fails if :name doesn't exist
7577 const { session } = req . headers ;
7678 if ( ! session ) return res . status ( 400 ) . json ( {
7779 message : "No session header provided"
@@ -82,26 +84,15 @@ export default class APIController {
8284 message : "Invalid session ID provided"
8385 } ) ;
8486
85- const clan : any = await this . base . db . get ( "SELECT members, cr, leader, joinable FROM clans WHERE name = ?" , req . params . name ) ;
87+ const clan : ClanData | undefined = await this . base . db . get ( "SELECT name, members, cr, leader, joinable FROM clans WHERE name = ?" , req . params . name ) ;
8688 if ( ! clan ) return res . status ( 404 ) . json ( {
8789 message : "Clan not found"
8890 } ) ;
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 ) ;
91+ Player . joinClan ( clan , requester . username , this . base )
92+ . then ( v => res . json ( v ) )
93+ . catch ( e => res . status ( 500 ) . json ( {
94+ message : e . message
95+ } ) ) ;
10596 } ) ;
10697
10798 // POST Endpoint: /api/clans/:name/leave
@@ -118,31 +109,90 @@ export default class APIController {
118109 message : "Invalid session ID provided"
119110 } ) ;
120111
121- const clan : any = await this . base . db . get ( "SELECT members FROM clans WHERE name = ?" , req . params . name ) ;
112+ const clan : ClanData | undefined = await this . base . db . get ( "SELECT name, members FROM clans WHERE name = ?" , req . params . name ) ;
122113 if ( ! clan ) return res . status ( 404 ) . json ( {
123114 message : "Clan not found"
124115 } ) ;
125116
126- const members : Array < any > = JSON . parse ( clan . members ) ;
117+ const members : Array < string > = JSON . parse ( clan . members ) ;
127118 if ( ! members . includes ( requester . username ) ) return res . status ( 400 ) . json ( {
128119 message : "Requested user is not a member of this clan"
129120 } ) ;
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 } ) ;
121+
122+ Player . leaveClan ( clan , requester . username , this . base ) . then ( v => res . json ( v ) ) ;
134123 } ) ;
135124
136- // (TODO) DELETE Endpoint: /api/clans/:name
125+ // DELETE Endpoint: /api/clans/:name
137126 // 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 ) => {
127+ this . app . delete ( "/api/clans/:name" , async ( req : express . Request , res : express . Response ) => {
128+ const { session } = req . headers ;
129+ if ( ! session ) return res . status ( 400 ) . json ( {
130+ message : "No session header provided"
131+ } ) ;
132+
133+ const requester : Socket | undefined = this . base . sockets . find ( ( v : Socket ) => v . sessionid === session ) ;
134+ if ( ! requester ) return res . status ( 400 ) . json ( {
135+ message : "Invalid session ID provided"
136+ } ) ;
137+
138+ const clan : ClanData | undefined = await this . base . db . get ( "SELECT name, leader FROM clans WHERE name = ?" , req . params . name ) ;
139+ if ( ! clan ) return res . status ( 404 ) . json ( {
140+ message : "Clan not found"
141+ } ) ;
142+ if ( clan . leader !== requester . username && requester . role !== Role . ADMIN ) return res . status ( 403 ) . json ( {
143+ message : "Only clean leader and administrators can delete this clan"
144+ } ) ;
139145
146+
147+ await Clan . delete ( clan , this . base ) ;
148+ res . json ( clan ) ;
140149 } ) ;
141150
142- // (TODO) POST Endpoint: /api/clans/:name
151+ // POST Endpoint: /api/clans/:name
143152 // Creates a new clan
144- this . app . post ( "/api/clans/:name" , ( req : express . Request , res : express . Response ) => {
153+ this . app . post ( "/api/clans/:name" , async ( req : express . Request , res : express . Response ) => {
154+ const { session, description } = req . headers ;
155+ if ( ! session ) return res . status ( 400 ) . json ( {
156+ message : "No session header provided"
157+ } ) ;
158+ if ( ! description || typeof description !== "string" || description . length >= 1024 ) return res . status ( 400 ) . json ( {
159+ message : "Invalid description length"
160+ } ) ;
161+
162+ const requester : Socket | undefined = this . base . sockets . find ( ( v : Socket ) => v . sessionid === session ) ;
163+ if ( ! requester ) return res . status ( 400 ) . json ( {
164+ message : "Invalid session ID provided"
165+ } ) ;
145166
167+ const clan : ClanData | undefined = await this . base . db . get ( "SELECT 1 FROM clans WHERE name = ?" , req . params . name ) ;
168+ if ( clan ) return res . status ( 400 ) . json ( {
169+ message : "Clan already exists"
170+ } ) ;
171+
172+ const { clan : userClan } = await this . base . db . get ( "SELECT clan FROM accounts WHERE username = ?" , requester . username ) ;
173+ if ( userClan ) return res . status ( 400 ) . json ( {
174+ message : "Requested user is already in a clan"
175+ } ) ;
176+
177+ const newClan : Clan = new Clan ( {
178+ cr : 0 ,
179+ description,
180+ joinable : 1 ,
181+ leader : requester . username ,
182+ members : JSON . stringify ( [ requester . username ] ) ,
183+ name : req . params . name ,
184+ tag : req . params . name . substr ( 0 , 4 )
185+ } ) ;
186+
187+ await this . base . db . run ( "INSERT INTO clans VALUES (?, ?, 0, ?, ?, 1, ?)" ,
188+ newClan . name , // clan name
189+ newClan . leader , // clan leader
190+ JSON . stringify ( newClan . members ) , // members
191+ newClan . description , // clan description
192+ newClan . tag // clan tag
193+ ) ;
194+ await this . base . db . run ( "UPDATE accounts SET clan = ? WHERE username = ?" , newClan . name , requester . username ) ;
195+ res . json ( newClan ) ;
146196 } ) ;
147197
148198 // GET Endpoint: /api/executeSQL/:method
0 commit comments