@@ -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