@@ -10,6 +10,7 @@ import Captcha, {CAPTCHA_LIMIT} from "../structures/Captcha";
1010import * as DateFormatter from "../utils/DateFormatter" ;
1111import EliminationRoom from "../structures/EliminationRoom" ;
1212import { Role } from "../structures/Player" ;
13+ import ClanController from "../clans/ClanController" ;
1314
1415// Used for listening to requests that are related to the API
1516export 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