diff --git a/CTF/CTF-Frontend/src/app/Helper/User-pfp.ts b/CTF/CTF-Frontend/src/app/Helper/User-pfp.ts index d6e1107..e0690e7 100644 --- a/CTF/CTF-Frontend/src/app/Helper/User-pfp.ts +++ b/CTF/CTF-Frontend/src/app/Helper/User-pfp.ts @@ -88,7 +88,8 @@ export async function PopulateUserTables(PCData: Contest[]): Promise { leaderbutton.textContent = 'view'; leaderbutton.setAttribute('id','ViewLeaderboard'); leaderbutton.addEventListener('click', function() { - //Popup('leaderboard.html' ,getEmail(), 'ContestName=' + contest.Name); Uncomment when leaderboard is implemented + sessionStorage.setItem('ContestString', contest.Name); + Popup('/leaderboard'); }); leader.appendChild(leaderbutton); @@ -178,4 +179,21 @@ export async function setNewName(NameInput: string): Promise { }, body: JSON.stringify(data) }); +} + +// get the current username of the user +export async function getUsername(): Promise { + const data = { email: getEmail() }; + const res = await fetch('api/users/getUsername', { + method: 'POST', + headers: { + 'Content-Type' : 'application/json' + }, + body: JSON.stringify(data) + }); + if (res.ok) { + const ret = await res.json(); + return ret; + } + } \ No newline at end of file diff --git a/CTF/CTF-Frontend/src/app/leaderboard/leaderboard.component.css b/CTF/CTF-Frontend/src/app/leaderboard/leaderboard.component.css index 7af241f..5aac49a 100644 --- a/CTF/CTF-Frontend/src/app/leaderboard/leaderboard.component.css +++ b/CTF/CTF-Frontend/src/app/leaderboard/leaderboard.component.css @@ -2,7 +2,7 @@ Alex Miller Jordan Latimer - CSS for Profile Page User Side + CSS for Leaderboard */ body { diff --git a/CTF/CTF-Frontend/src/app/leaderboard/leaderboard.component.html b/CTF/CTF-Frontend/src/app/leaderboard/leaderboard.component.html index d368a0a..72fe8a2 100644 --- a/CTF/CTF-Frontend/src/app/leaderboard/leaderboard.component.html +++ b/CTF/CTF-Frontend/src/app/leaderboard/leaderboard.component.html @@ -23,7 +23,7 @@ - {{ getRank() - 50 }} + {{ getRank() - 12 }} {{ user.Name }} {{ user.Flags }} diff --git a/CTF/CTF-Frontend/src/app/leaderboard/leaderboard.component.ts b/CTF/CTF-Frontend/src/app/leaderboard/leaderboard.component.ts index e35f27e..0f730ab 100644 --- a/CTF/CTF-Frontend/src/app/leaderboard/leaderboard.component.ts +++ b/CTF/CTF-Frontend/src/app/leaderboard/leaderboard.component.ts @@ -43,14 +43,31 @@ export class LeaderboardComponent { // get the user data and sort it for table async PopulateTable() { + // get the admin from the user + let AdminEmail: string = ''; + const data = { email: getEmail() }; + const res = await fetch('api/contests/getAdminEmail', { + method: 'POST', + headers: { + 'Content-Type' : 'application/json' + }, + body: JSON.stringify(data) + }); + if (res.ok) { + const ret = await res.json(); + AdminEmail = ret; + } + + + // get all the users, flags, and submissions - this.users = await this.adminProfileService.getAllUsers(getEmail()); - let result = await this.adminProfileService.getContestFlagsSubs(getEmail(), this.contest); + this.users = await this.adminProfileService.getAllUsers(AdminEmail); + let result = await this.adminProfileService.getContestFlagsSubs(AdminEmail, this.contest); this.subs = result.subs; this.flags = result.flags; // get the contest and contestID - result = await this.adminProfileService.getContests(getEmail()); + result = await this.adminProfileService.getContests(AdminEmail); this.contestObj = result.filter((item : Contest) => item.Name === this.contest)[0]; this.contestID = this.contestObj?.ContestID; @@ -74,7 +91,7 @@ export class LeaderboardComponent { } } } - this.users = this.users.sort((a,b) => a.Flags + b.Flags); + this.users = this.users.sort((a,b) => a.Flags + b.Flags); // sort the users } diff --git a/CTF/CTF-Frontend/src/app/user-menu/user-menu.component.css b/CTF/CTF-Frontend/src/app/user-menu/user-menu.component.css index c322113..09af19f 100644 --- a/CTF/CTF-Frontend/src/app/user-menu/user-menu.component.css +++ b/CTF/CTF-Frontend/src/app/user-menu/user-menu.component.css @@ -1,5 +1,5 @@ .body { - height: 98vh; + height: 96vh; display: grid; /* columns and rows sizes */ @@ -23,6 +23,9 @@ html { margin: 50px; text-align: center; } + #Header * { + margin: 10px; + } #Header input { height: 25px; width: 150px; @@ -40,7 +43,7 @@ html { grid-column: 1/4; grid-row: 2/6; margin: 50px; - height: 500px; + height: 350px; text-align: center; background-color: green; } diff --git a/CTF/CTF-Frontend/src/app/user-profile-ac/user-profile-ac.component.css b/CTF/CTF-Frontend/src/app/user-profile-ac/user-profile-ac.component.css index a234102..512e3a1 100644 --- a/CTF/CTF-Frontend/src/app/user-profile-ac/user-profile-ac.component.css +++ b/CTF/CTF-Frontend/src/app/user-profile-ac/user-profile-ac.component.css @@ -6,7 +6,7 @@ */ body { - height: 98vh; + height: 97vh; display: grid; /* columns and rows sizes */ @@ -27,6 +27,9 @@ html { margin: 50px; text-align: center; } + #Header * { + margin: 10px; + } #Header input { height: 25px; width: 150px; @@ -44,7 +47,7 @@ html { grid-column: 1/4; grid-row: 2/6; margin: 50px; - height: 500px; + height: 350px; text-align: center; background-color: green; } @@ -60,6 +63,7 @@ html { grid-column: 5/7; grid-row: 2/3; margin: 50px; + margin-bottom: 0px; text-align: center; background-color: green; } @@ -69,12 +73,17 @@ html { /* Usernames */ #Username { - grid-row: 3/5; + grid-row: 3/4; grid-column: 5/7; background-color: green; text-align: center; - margin: 50px; + margin-left: 50px; + margin-right: 50px; + margin-top: 25px; } + #Name { + margin: 10px; + } #generate { background-color: blue; color: white; @@ -112,27 +121,4 @@ html { h1 { display: inline; font-weight: bold; -} - - - -/* Leaderboard popup window */ -#Leaderboard { - text-align: center; -} -#Leaderboard h1 { - grid-row: 1/2; - grid-column: 2/5; - text-align: center; -} -#Leaderboard h2 { - grid-row: 2/3; - grid-column: 3/4; - text-align: center; - color: white; -} -#LeaderTable { - grid-column: 2/6; - grid-row: 4/5; - margin: 10px; } \ No newline at end of file diff --git a/CTF/CTF-Frontend/src/app/user-profile-ac/user-profile-ac.component.html b/CTF/CTF-Frontend/src/app/user-profile-ac/user-profile-ac.component.html index 5356c4b..18fb49a 100644 --- a/CTF/CTF-Frontend/src/app/user-profile-ac/user-profile-ac.component.html +++ b/CTF/CTF-Frontend/src/app/user-profile-ac/user-profile-ac.component.html @@ -2,18 +2,18 @@ Alex Miller Jordan Latimer - Profile Page for Users + Profile Page before entering a contest for User --> - NMU CTF Profile Page + NMU CTF User Profile Page - -
-
- +
+

Current Name: {{Username}}



-
+

Record

diff --git a/CTF/CTF-Frontend/src/app/user-profile/user-profile.component.ts b/CTF/CTF-Frontend/src/app/user-profile/user-profile.component.ts index fe2025a..362f9a9 100644 --- a/CTF/CTF-Frontend/src/app/user-profile/user-profile.component.ts +++ b/CTF/CTF-Frontend/src/app/user-profile/user-profile.component.ts @@ -1,9 +1,8 @@ import { Component, OnInit } from '@angular/core'; -import { loadTable } from '../Helper/User-pfp'; -import { gotoPage, logOut } from '../Helper/Helpers'; +import { gotoPage, logOut, getEmail } from '../Helper/Helpers'; import { Router } from '@angular/router'; import { FormsModule } from '@angular/forms'; -import { getNewName, setNewName } from '../Helper/User-pfp'; +import { getNewName, setNewName, getUsername, loadTable } from '../Helper/User-pfp'; @Component({ selector: 'app-user-profile', @@ -16,8 +15,13 @@ export class UserProfileComponent implements OnInit { constructor(private router: Router){} NameInput: string = ''; + + // get the users current username + Username : string = ''; + async ngOnInit(): Promise { this.NameInput = await loadTable(); + this.Username = this.NameInput; } navtoPage(): void { @@ -30,6 +34,7 @@ export class UserProfileComponent implements OnInit { onSetNewName(): void{ setNewName(this.NameInput); + this.Username = this.NameInput; } onLogout(): void{ diff --git a/CTF/CTF-Server/queries/adminQueries.js b/CTF/CTF-Server/queries/adminQueries.js index e43f314..58fbc22 100644 --- a/CTF/CTF-Server/queries/adminQueries.js +++ b/CTF/CTF-Server/queries/adminQueries.js @@ -26,4 +26,18 @@ export async function getAdminID(email) { resolve(rows[0].AdminID); }); }); +} + +// get the email of the Admin with the AdminID +export async function getEmailFromAdminID(AID) { + return new Promise((resolve,reject) => { + const query = 'SELECT Email FROM Admins WHERE AdminID = ?'; + con.query(query, [AID], (err,row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row[0].Email); + }); + }); } \ No newline at end of file diff --git a/CTF/CTF-Server/routes/contestHandler.js b/CTF/CTF-Server/routes/contestHandler.js index d54cb02..f8e018a 100644 --- a/CTF/CTF-Server/routes/contestHandler.js +++ b/CTF/CTF-Server/routes/contestHandler.js @@ -1,6 +1,6 @@ import { getContestsFromAdminID, addContest, getActiveContest, endContest, setContestActive, deleteContest, getContestByID } from "../queries/contestQueries.js"; import { AdminorUser } from "../server.js"; -import {getAdminID, getAdminFromUser} from "../queries/adminQueries.js"; +import {getAdminID, getAdminFromUser, getEmailFromAdminID} from "../queries/adminQueries.js"; import { Router } from "express"; const router = Router(); @@ -137,4 +137,26 @@ router.post('/getActiveContest', async (req, res) => { } }); +// get the Admin email whether Admin or User +router.post('/getAdminEmail', async (req,res) => { + const { email } = req.body; + let AdminEmail = ''; + try { + const table = await AdminorUser(email); + if (table === 'Users') { + let Admin = await getAdminFromUser(email); + const AdminID = Admin.AdminID; + AdminEmail = await getEmailFromAdminID(AdminID); + res.json(AdminEmail); + } + else { + res.json(email); + } + } + catch (err) { + console.error(err.message); + return res.status(500).json({ error: 'error getting email' }); + } +}) + export default router;