diff --git a/CTF/CTF-Frontend/src/app/admin-profile/admin-profile.service.ts b/CTF/CTF-Frontend/src/app/admin-profile/admin-profile.service.ts index 2b1b8ad..513cdfd 100644 --- a/CTF/CTF-Frontend/src/app/admin-profile/admin-profile.service.ts +++ b/CTF/CTF-Frontend/src/app/admin-profile/admin-profile.service.ts @@ -29,6 +29,7 @@ export class AdminProfileService { } async deleteUser(email: string): Promise { + await this.deleteSubsFromStudent(email); try { const response = await fetch('api/users/DeleteStudent', { method: 'POST', @@ -48,6 +49,26 @@ export class AdminProfileService { } } + async deleteSubsFromStudent(email: String): Promise { + try { + const response = await fetch('api/submissions//DeleteSubsFromStudent', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ email: email }) + }); + + if (!response.ok) { + throw new Error('Failed to delete flags'); + } + return await response.json(); + } catch (error) { + console.error('Error deleting flags:', error); + throw error; + } + } + async getContests(email: string): Promise { try { const response = await fetch('api/contests/getContests', { diff --git a/CTF/CTF-Server/queries/submissionQueries.js b/CTF/CTF-Server/queries/submissionQueries.js index e53679e..bae52da 100644 --- a/CTF/CTF-Server/queries/submissionQueries.js +++ b/CTF/CTF-Server/queries/submissionQueries.js @@ -10,6 +10,16 @@ export async function getSubmissions(userID, flagID){ }); } +export async function getUserSubmissions(userID){ + return new Promise((resolve, reject) => { + const query = 'SELECT * FROM Submissions WHERE UserID = ?'; + con.query(query, [userID], (err, result) => { + if(err) reject(err); + else resolve(result); + }); + }); +} + export async function insertSubmission(userID, flagID, isCorrect, attempts){ return new Promise((resolve, reject) => { const query = 'INSERT INTO Submissions (UserID, FlagID, IsCorrect, Attempts) VALUES (?, ?, ?, ?)'; @@ -40,6 +50,20 @@ export async function updateSubmissionAttempts(userID, flagID){ }); } +// delete flags attempts from submissions +export async function DeleteSubsFromStudent(userID) { + return new Promise((resolve, reject) => { + const query = 'DELETE FROM Submissions WHERE UserID = ?'; + con.query(query, [userID], (err, result) => { + if (err) { + console.error(err.message); + return reject(err); + } + resolve(result); + }); + }); +} + // get all of the submissions export async function getAllSubs() { return new Promise((resolve,reject) => { diff --git a/CTF/CTF-Server/queries/userQueries.js b/CTF/CTF-Server/queries/userQueries.js index a7aefde..cc9fc8a 100644 --- a/CTF/CTF-Server/queries/userQueries.js +++ b/CTF/CTF-Server/queries/userQueries.js @@ -14,7 +14,6 @@ export function getUserByEmail(table, email) { }); } - // get all users from an AdminID export async function getUsersFromAdmin(AdminID) { return new Promise((resolve,reject) => { @@ -39,7 +38,6 @@ export async function setUserName(name, email){ }); } - export async function addStudent(name, email, password, admin){ return new Promise((resolve, reject) => { const query = `INSERT INTO Users (Name, Email, Password, Flags, AdminID) VALUES (?,?,?,0,?)`; diff --git a/CTF/CTF-Server/routes/submissionHandler.js b/CTF/CTF-Server/routes/submissionHandler.js index 3d6504b..3f14a44 100644 --- a/CTF/CTF-Server/routes/submissionHandler.js +++ b/CTF/CTF-Server/routes/submissionHandler.js @@ -1,7 +1,7 @@ import { Router } from "express"; import { getFlagHash } from "../server.js" import { getUserID } from "../queries/userQueries.js"; -import { getSubmissions, insertSubmission, updateSubmissionAttempts, getAllSubs } from "../queries/submissionQueries.js"; +import { getSubmissions, insertSubmission, updateSubmissionAttempts, getAllSubs, getUserSubmissions, DeleteSubsFromStudent} from "../queries/submissionQueries.js"; import { updateUserFlags } from "../queries/userQueries.js"; const router = Router(); @@ -40,6 +40,21 @@ router.post('/checkFlagSubmission', async (req, res) => { } }); +// delete all submissions from a specific user +router.post('/DeleteSubsFromStudent', async (req,res) => { + const { email } = req.body; + try{ + const studentID = await getUserID(email); + const result = await DeleteSubsFromStudent(studentID); + if(result.affectedRows === 0) + return res.status(200).json({ success: true, message: "User had no submissions"}); + return res.status(200).json({success: true}); + } catch(err){ + console.error("Error deleting submissions from student:", err.message); + return res.status(500).json({error: "COULD NOT DELETE Submissions"}); + } +}); + router.post('/checkPracSubmission', async (req, res) => { const { email, flagID, submittedFlag } = req.body; const correctFlag = getFlagHash(email, flagID);