2025-11-12 10:13:24 -05:00
const express = require ( "express" ) ;
2026-01-25 01:36:32 -05:00
const sqlite = require ( "better-sqlite3" ) ;
2025-11-12 10:13:24 -05:00
const bcrypt = require ( "bcrypt" ) ;
const cors = require ( "cors" ) ;
const jwt = require ( "jsonwebtoken" )
2026-01-25 01:36:32 -05:00
const dotenv = require ( "dotenv" ) ;
const Database = require ( "better-sqlite3" ) ;
2025-11-12 10:13:24 -05:00
2025-11-12 10:15:10 -05:00
const serverPort = 3001 ;
2025-11-12 10:13:24 -05:00
const dev = process . argv . length > 2 && process . argv [ 2 ] == "-dev" ;
const app = express ( ) ;
app . use ( express . json ( ) ) ;
2025-11-18 21:16:35 -05:00
app . use ( ( req , res , next ) => {
if ( req . path . endsWith ( ".html" ) ) {
res . redirect ( req . path . replace ( ".html" , "" ) ) ;
return ;
}
next ( ) ;
} )
2025-11-12 10:13:24 -05:00
app . use ( express . static ( "public" ) )
app . use ( cors ( {
origin : [
"https://project.rochesterx.dev" ,
2025-11-12 10:15:10 -05:00
"https://localhost:3001"
2025-11-12 10:13:24 -05:00
]
} ) ) ;
2026-01-25 01:36:32 -05:00
const db = new Database ( "project.db" ) ;
db . pragma ( "journal_mode = WAL" )
2025-11-12 10:13:24 -05:00
dotenv . config ( ) ;
const JWT _SECRET = process . env . JWT _SECRET ;
if ( ! JWT _SECRET ) {
throw new Error ( "JWT_SECRET not set in environment." ) ;
}
app . post ( "/register" , async ( req , res ) => {
const { username , password , role } = req . body ;
try {
const hash = await bcrypt . hash ( password , 10 ) ;
2026-01-25 01:36:32 -05:00
const inputs = {
username : username ,
hash : hash ,
role : role
}
const query = db . prepare ( "INSERT INTO Users (Username, PasswordHash, Role, CreatedAt) VALUES (@username, @hash, @role, datetime('now'))" ) ;
query . run ( inputs ) ;
2025-11-12 10:13:24 -05:00
res . send ( { success : true , message : "User registered" } )
2026-01-25 01:36:32 -05:00
2025-11-12 10:13:24 -05:00
} catch ( err ) {
if ( err . message . includes ( "Violation of UNIQUE KEY constraint" ) ) {
res . status ( 500 ) . send ( { success : false , message : ` Username " ${ username } " is already taken. ` } ) ;
}
res . status ( 500 ) . send ( { success : false , message : err . message } ) ;
}
} ) ;
app . post ( "/login" , async ( req , res ) => {
const { username , password } = req . body ;
try {
2026-01-25 01:36:32 -05:00
const query = db . prepare ( "SELECT * FROM Users WHERE Username = @username" ) ;
const results = query . all ( { username : username } ) ;
2025-11-12 10:13:24 -05:00
2026-01-25 01:36:32 -05:00
if ( results . length == 0 ) return res . status ( 400 ) . send ( { message : "User not found" } ) ;
2025-11-12 10:13:24 -05:00
2026-01-25 01:36:32 -05:00
const hash = results [ 0 ] . PasswordHash ;
const isDeleted = results [ 0 ] . IsDeleted ;
2025-11-12 10:13:24 -05:00
if ( isDeleted === true ) {
return res . status ( 400 ) . json ( { message : "User not found (deleted)" } )
}
const match = await bcrypt . compare ( password , hash ) ;
if ( match ) {
2026-01-25 01:36:32 -05:00
const token = jwt . sign ( results [ 0 ] , JWT _SECRET , { expiresIn : "1h" } ) ;
2025-11-12 10:13:24 -05:00
res . send ( {
success : true ,
message : "Login successful" ,
token
} ) ;
2026-01-25 01:36:32 -05:00
const update = db . prepare ( "UPDATE Users SET LastLogin = datetime('now') WHERE Username = @username" ) ;
update . run ( { username : username } ) ;
2025-11-12 10:13:24 -05:00
console . log ( "Issued token: " + JSON . stringify ( token ) )
}
else res . status ( 401 ) . send ( { success : false , message : "Invalid credentials" } ) ;
} catch ( err ) {
res . status ( 500 ) . send ( { success : false , message : err . message } ) ;
}
} ) ;
2025-11-26 21:10:22 -05:00
app . post ( "/getWatchlist" , authenticate , async ( req , res ) => {
const { id } = req . body ;
2026-01-25 01:36:32 -05:00
const query = db . prepare ( ` SELECT Player.PlayerName, Player.Team, Player.Position, Player.PlayerID FROM Watch JOIN Player ON Watch.PlayerID = Player.PlayerID WHERE UserID = @userID ORDER BY Player.PlayerName ` ) ;
const watchlist = query . all ( {
userID : req . user . Id ,
id : id
} ) ;
2025-11-26 21:10:22 -05:00
2026-01-25 01:36:32 -05:00
res . status ( 200 ) . json ( { watchlist : watchlist } ) ;
2025-11-26 21:10:22 -05:00
} ) ;
app . post ( "/isWatched" , authenticate , async ( req , res ) => {
const { id } = req . body ;
2026-01-25 01:36:32 -05:00
const query = db . prepare ( ` SELECT PlayerID FROM Watch WHERE UserID = @userID ` ) ;
const watchlist = query . all ( { userID : req . user . Id , id : id } ) ;
2025-11-26 21:10:22 -05:00
2026-01-25 01:36:32 -05:00
const isWatched = watchlist . some ( row => row . PlayerID === parseInt ( id ) ) ;
2025-11-26 21:10:22 -05:00
res . status ( 200 ) . json ( { isWatched : isWatched } ) ;
} ) ;
app . post ( "/toggleWatched" , authenticate , async ( req , res ) => {
const { id } = req . body ;
2026-01-25 01:36:32 -05:00
const query = db . prepare ( ` SELECT PlayerID FROM Watch WHERE UserID = @userID ` ) ;
const watchlist = query . all ( { userID : req . user . Id , id : id } ) ;
2025-11-26 21:10:22 -05:00
2026-01-25 01:36:32 -05:00
const isWatched = watchlist . some ( row => row . PlayerID === parseInt ( id ) ) ;
2025-11-26 21:10:22 -05:00
if ( isWatched ) {
2026-01-25 01:36:32 -05:00
const query = db . prepare ( ` DELETE FROM Watch WHERE UserID = @userID AND PlayerID = @id ` ) ;
query . run ( { userID : req . user . Id , id : id } ) ;
2025-11-26 21:10:22 -05:00
res . status ( 200 ) . json ( { message : "No longer watching player" } ) ;
return ;
}
// Otherwise, watch the player
2026-01-25 01:36:32 -05:00
const watchQuery = db . prepare ( ` INSERT INTO Watch (UserID, PlayerID) VALUES (@userID, @id) ` ) ;
watchQuery . run ( { userID : req . user . Id , id : id } ) ;
2025-11-26 21:10:22 -05:00
res . status ( 200 ) . json ( { message : "Watching Player" } ) ;
} ) ;
2025-11-17 18:56:31 -05:00
app . post ( "/getPlayers" , authenticate , async ( req , res ) => {
2025-11-26 22:52:05 -05:00
const { player , positions } = req . body ;
2025-11-12 10:13:24 -05:00
2026-01-25 01:36:32 -05:00
const query = db . prepare ( ` SELECT p.PlayerID, p.PlayerName, c.TotalValue, p.Team, p.Position FROM Player AS p JOIN Contract AS c ON p.PlayerID = c.PlayerID WHERE p.PlayerName LIKE '%' || @query || '%' AND p.Position IN (@one, @two, @three, @four) ORDER BY p.PlayerName; ` ) ;
const matches = query . all ( {
query : player ,
one : positions [ 0 ] ,
two : positions [ 1 ] ,
three : positions [ 2 ] ,
four : positions [ 3 ]
} ) ;
2025-11-12 10:13:24 -05:00
2026-01-25 01:36:32 -05:00
res . status ( 200 ) . json ( { query : player , matches : matches } ) ;
2025-11-12 10:13:24 -05:00
} ) ;
2025-11-26 21:10:22 -05:00
app . post ( "/getHighest" , authenticate , async ( req , res ) => {
const { amount } = req . body ;
2026-01-25 01:36:32 -05:00
const query = db . prepare ( `
SELECT p . PlayerID , p . PlayerName , p . [ Position ] , p . Team , TotalValue , TrueAvgPerYear , Years
2025-11-26 21:10:22 -05:00
FROM Player AS p JOIN Contract AS c ON p . PlayerID = c . PlayerID
2026-01-25 01:36:32 -05:00
ORDER BY TotalValue DESC
LIMIT @ amount ;
2025-11-26 21:10:22 -05:00
` );
2026-01-25 01:36:32 -05:00
const matches = query . all ( { amount : amount } ) ;
2025-11-26 21:10:22 -05:00
2026-01-25 01:36:32 -05:00
res . status ( 200 ) . json ( { matches : matches } ) ;
2025-11-26 21:10:22 -05:00
} ) ;
2025-11-28 11:10:09 -05:00
app . post ( "/getHighestOffense" , authenticate , async ( req , res ) => {
const { amount } = req . body ;
2026-01-25 01:36:32 -05:00
const query = db . prepare ( `
SELECT Player . PlayerID , Player . [ Position ] , Player . PlayerName , Player . Team ,
2025-11-28 11:10:09 -05:00
SUM ( total _yards ) AS TotalYards ,
SUM ( passing _yards ) AS PassingYards ,
SUM ( rushing _yards ) AS RushingYards ,
SUM ( receiving _yards ) AS RecievingYards ,
CASE WHEN Player . Position = 'QB' THEN ( SUM ( pass _touchdown ) ) ELSE 0 END + SUM ( receiving _touchdown ) + SUM ( rush _touchdown ) AS AmendedTotalTDs ,
CASE WHEN Player . Position = 'QB' THEN ( SUM ( pass _touchdown ) ) ELSE 0 END AS PassTDs ,
SUM ( receiving _touchdown ) AS ReceivingTDs ,
SUM ( rush _touchdown ) AS RushTDs ,
SUM ( offense _snaps ) * 1.0 / SUM ( team _offense _snaps ) AS SnapPercentage ,
SUM ( interception ) + sum ( fumble _lost ) AS Turnovers ,
SUM ( tackled _for _loss ) AS TackledForLoss ,
CASE
WHEN Player . Position = 'QB'
THEN SUM ( qb _dropback ) - SUM ( pass _attempts ) - SUM ( qb _scramble )
ELSE 0
END AS Sacks ,
SUM ( safety ) AS Safties ,
SUM ( total _yards )
+ ( ( CASE WHEN Player . Position = 'QB' THEN ( SUM ( pass _touchdown ) ) ELSE 0 END + SUM ( receiving _touchdown ) + SUM ( rush _touchdown ) ) * 50 )
+ ( SUM ( offense _snaps ) * 100.0 / SUM ( team _offense _snaps ) )
- ( ( SUM ( interception ) + sum ( fumble _lost ) ) * 75 )
- (
2025-11-28 13:54:57 -05:00
SUM ( tackled _for _loss ) )
- ( SUM ( safety ) * 100.0 )
AS OffenseScore ,
AvgPerYear ,
( SUM ( total _yards )
+ ( ( CASE WHEN Player . Position = 'QB' THEN ( SUM ( pass _touchdown ) ) ELSE 0 END + SUM ( receiving _touchdown ) + SUM ( rush _touchdown ) ) * 50 )
+ ( SUM ( offense _snaps ) * 100.0 / SUM ( team _offense _snaps ) )
- ( ( SUM ( interception ) + sum ( fumble _lost ) ) * 75 )
- (
SUM ( tackled _for _loss )
)
- ( SUM ( safety ) * 100.0 ) ) / AvgPerYear AS PaydirtScore
FROM Player JOIN DatasetPlayerStats ON Player . PlayerID = DatasetPlayerStats . PlayerID JOIN Contract ON Player . PlayerID = Contract . PlayerID
WHERE season = 2024 AND SeasonType = 'REG'
GROUP BY Player . PlayerID , Player . PlayerName , Player . Team , Player . [ Position ] , Contract . AvgPerYear
2026-01-25 01:36:32 -05:00
ORDER BY OffenseScore DESC
LIMIT @ amount ;
2025-11-28 13:54:57 -05:00
` );
2026-01-25 01:36:32 -05:00
const matches = query . all ( { amount : amount } ) ;
2025-11-28 13:54:57 -05:00
2026-01-25 01:36:32 -05:00
res . status ( 200 ) . json ( { matches : matches } ) ;
2025-11-28 13:54:57 -05:00
} ) ;
app . post ( "/getPlayerStats" , authenticate , async ( req , res ) => {
const { playerID } = req . body ;
2026-01-25 01:36:32 -05:00
const query = db . prepare ( `
2025-11-28 19:25:31 -05:00
SELECT player . playerid , player . playername , season , seasontype , week , pass _attempts , complete _pass , total _yards , total _tds , interception , receptions , receiving _yards , receiving _touchdown , rush _attempts , rushing _yards , rush _touchdown , fumble
fROM Player JOIN DatasetPlayerStats ON Player . PlayerID = DatasetPlayerStats . PlayerID
2025-11-28 13:54:57 -05:00
WHERE Player . PlayerID = @ playerID
ORDER BY Season , week ;
` );
2026-01-25 01:36:32 -05:00
const matches = query . all ( { playerID : playerID } )
2025-11-28 13:54:57 -05:00
2026-01-25 01:36:32 -05:00
res . status ( 200 ) . json ( { matches : matches } ) ;
2025-11-28 13:54:57 -05:00
} ) ;
app . post ( "/getPlayerScores" , authenticate , async ( req , res ) => {
const { playerID } = req . body ;
2026-01-25 01:36:32 -05:00
const query = db . prepare ( `
2025-11-28 13:54:57 -05:00
SELECT Player . PlayerID , Player . [ Position ] , Player . PlayerName , Player . Team ,
2025-11-28 19:25:31 -05:00
c . TotalValue , c . TrueAvgPerYear , c . Years , c . StartYear , c . EndYear , Player . Height , Player . Weight ,
2025-11-28 13:54:57 -05:00
SUM ( total _yards ) AS TotalYards ,
SUM ( passing _yards ) AS PassingYards ,
SUM ( rushing _yards ) AS RushingYards ,
SUM ( receiving _yards ) AS RecievingYards ,
CASE WHEN Player . Position = 'QB' THEN ( SUM ( pass _touchdown ) ) ELSE 0 END + SUM ( receiving _touchdown ) + SUM ( rush _touchdown ) AS AmendedTotalTDs ,
CASE WHEN Player . Position = 'QB' THEN ( SUM ( pass _touchdown ) ) ELSE 0 END AS PassTDs ,
SUM ( receiving _touchdown ) AS ReceivingTDs ,
SUM ( rush _touchdown ) AS RushTDs ,
SUM ( offense _snaps ) * 1.0 / SUM ( team _offense _snaps ) AS SnapPercentage ,
SUM ( interception ) + sum ( fumble _lost ) AS Turnovers ,
SUM ( tackled _for _loss ) AS TackledForLoss ,
2025-11-28 11:10:09 -05:00
CASE
WHEN Player . Position = 'QB'
THEN SUM ( qb _dropback ) - SUM ( pass _attempts ) - SUM ( qb _scramble )
ELSE 0
2025-11-28 13:54:57 -05:00
END AS Sacks ,
SUM ( safety ) AS Safties ,
SUM ( total _yards )
+ ( ( CASE WHEN Player . Position = 'QB' THEN ( SUM ( pass _touchdown ) ) ELSE 0 END + SUM ( receiving _touchdown ) + SUM ( rush _touchdown ) ) * 50 )
+ ( SUM ( offense _snaps ) * 100.0 / SUM ( team _offense _snaps ) )
- ( ( SUM ( interception ) + sum ( fumble _lost ) ) * 75 )
- (
SUM ( tackled _for _loss )
)
2025-11-28 11:10:09 -05:00
- ( SUM ( safety ) * 100.0 )
AS OffenseScore ,
AvgPerYear ,
( SUM ( total _yards )
+ ( ( CASE WHEN Player . Position = 'QB' THEN ( SUM ( pass _touchdown ) ) ELSE 0 END + SUM ( receiving _touchdown ) + SUM ( rush _touchdown ) ) * 50 )
+ ( SUM ( offense _snaps ) * 100.0 / SUM ( team _offense _snaps ) )
- ( ( SUM ( interception ) + sum ( fumble _lost ) ) * 75 )
- (
2025-11-28 13:54:57 -05:00
SUM ( tackled _for _loss )
2025-11-28 11:10:09 -05:00
)
2025-11-28 13:54:57 -05:00
- ( SUM ( safety ) * 100.0 ) ) / AvgPerYear * 1000000 AS PaydirtScore
2025-11-28 11:10:09 -05:00
2025-11-28 19:25:31 -05:00
FROM Player JOIN DatasetPlayerStats ON Player . PlayerID = DatasetPlayerStats . PlayerID JOIN Contract AS c ON Player . PlayerID = c . PlayerID
2025-11-28 13:54:57 -05:00
WHERE season = 2024 AND SeasonType = 'REG' AND Player . PlayerID = @ playerID
2025-11-28 19:25:31 -05:00
GROUP BY c . TotalValue , c . TrueAvgPerYear , c . Years , c . StartYear , Player . Height , Player . Weight , c . EndYear , Player . PlayerID , Player . PlayerName , Player . Team , Player . [ Position ] , c . AvgPerYear
2025-11-28 13:54:57 -05:00
ORDER BY PaydirtScore DESC ;
2025-11-28 11:10:09 -05:00
` );
2026-01-25 01:36:32 -05:00
const matches = query . all ( { playerID : playerID } )
2025-11-28 11:10:09 -05:00
2026-01-25 01:36:32 -05:00
res . status ( 200 ) . json ( { match : matches [ 0 ] } ) ;
2025-11-28 11:10:09 -05:00
} ) ;
2025-11-28 13:54:57 -05:00
2025-11-28 11:10:09 -05:00
app . post ( "/getHighestPaydirt" , authenticate , async ( req , res ) => {
const { amount } = req . body ;
2026-01-25 01:36:32 -05:00
const query = db . prepare ( `
SELECT Player . PlayerID , Player . [ Position ] , Player . PlayerName , Player . Team ,
2025-11-28 11:10:09 -05:00
SUM ( total _yards ) AS TotalYards ,
SUM ( passing _yards ) AS PassingYards ,
SUM ( rushing _yards ) AS RushingYards ,
SUM ( receiving _yards ) AS RecievingYards ,
CASE WHEN Player . Position = 'QB' THEN ( SUM ( pass _touchdown ) ) ELSE 0 END + SUM ( receiving _touchdown ) + SUM ( rush _touchdown ) AS AmendedTotalTDs ,
CASE WHEN Player . Position = 'QB' THEN ( SUM ( pass _touchdown ) ) ELSE 0 END AS PassTDs ,
SUM ( receiving _touchdown ) AS ReceivingTDs ,
SUM ( rush _touchdown ) AS RushTDs ,
SUM ( offense _snaps ) * 1.0 / SUM ( team _offense _snaps ) AS SnapPercentage ,
SUM ( interception ) + sum ( fumble _lost ) AS Turnovers ,
SUM ( tackled _for _loss ) AS TackledForLoss ,
CASE
WHEN Player . Position = 'QB'
THEN SUM ( qb _dropback ) - SUM ( pass _attempts ) - SUM ( qb _scramble )
ELSE 0
END AS Sacks ,
SUM ( safety ) AS Safties ,
SUM ( total _yards )
+ ( ( CASE WHEN Player . Position = 'QB' THEN ( SUM ( pass _touchdown ) ) ELSE 0 END + SUM ( receiving _touchdown ) + SUM ( rush _touchdown ) ) * 50 )
+ ( SUM ( offense _snaps ) * 100.0 / SUM ( team _offense _snaps ) )
- ( ( SUM ( interception ) + sum ( fumble _lost ) ) * 75 )
- (
2025-11-28 13:54:57 -05:00
SUM ( tackled _for _loss ) )
2025-11-28 11:10:09 -05:00
- ( SUM ( safety ) * 100.0 )
AS OffenseScore ,
AvgPerYear ,
( SUM ( total _yards )
+ ( ( CASE WHEN Player . Position = 'QB' THEN ( SUM ( pass _touchdown ) ) ELSE 0 END + SUM ( receiving _touchdown ) + SUM ( rush _touchdown ) ) * 50 )
+ ( SUM ( offense _snaps ) * 100.0 / SUM ( team _offense _snaps ) )
- ( ( SUM ( interception ) + sum ( fumble _lost ) ) * 75 )
- (
2025-11-28 13:54:57 -05:00
SUM ( tackled _for _loss )
2025-11-28 11:10:09 -05:00
)
2025-11-28 13:54:57 -05:00
- ( SUM ( safety ) * 100.0 ) ) / AvgPerYear * 1000000 AS PaydirtScore
2025-11-28 11:10:09 -05:00
FROM Player JOIN DatasetPlayerStats ON Player . PlayerID = DatasetPlayerStats . PlayerID JOIN Contract ON Player . PlayerID = Contract . PlayerID
WHERE season = 2024 AND SeasonType = 'REG'
GROUP BY Player . PlayerID , Player . PlayerName , Player . Team , Player . [ Position ] , Contract . AvgPerYear
2026-01-25 01:36:32 -05:00
ORDER BY PaydirtScore DESC
LIMIT @ amount ;
2025-11-28 11:10:09 -05:00
` );
2026-01-25 01:36:32 -05:00
const matches = query . all ( { amount : amount } ) ;
2025-11-28 11:10:09 -05:00
2026-01-25 01:36:32 -05:00
res . status ( 200 ) . json ( { matches : matches } ) ;
2025-11-28 11:10:09 -05:00
} ) ;
2025-11-18 21:16:35 -05:00
app . post ( "/getPlayer" , authenticate , async ( req , res ) => {
const { id } = req . body ;
2026-01-25 01:36:32 -05:00
const query = db . prepare ( ` SELECT p.PlayerName, p.PlayerID, c.TotalValue, c.TrueAvgPerYear, c.Years, c.StartYear, c.EndYear, p.Team, p.Position FROM Player AS p JOIN Contract AS c ON p.PlayerID = c.PlayerID WHERE p.PlayerID = @query ` ) ;
const matches = query . run ( { query : id } ) ;
2025-11-18 21:16:35 -05:00
2026-01-25 01:36:32 -05:00
if ( matches . length !== 1 ) {
2025-11-18 21:16:35 -05:00
res . status ( 400 ) . json ( { success : false } )
return ;
}
2026-01-25 01:36:32 -05:00
res . status ( 200 ) . json ( { success : true , match : matches [ 0 ] } ) ;
2025-11-18 21:16:35 -05:00
} ) ;
2025-11-12 10:13:24 -05:00
app . post ( "/getInfo" , authenticate , async ( req , res ) => {
const userData = req . user ;
res . status ( 200 ) . json ( userData ) ;
} ) ;
app . post ( "/getCourses" , authenticate , async ( req , res ) => {
2026-01-25 01:36:32 -05:00
const query = db . prepare ( "SELECT * FROM Courses" ) ;
const courses = query . all ( ) ;
2025-11-12 10:13:24 -05:00
res . status ( 200 ) . json ( courses ) ;
} ) ;
app . post ( "/setInfo" , authenticate , async ( req , res ) => {
const { firstName , lastName , dob } = req . body ;
try {
2026-01-25 01:36:32 -05:00
const query = db . prepare ( `
2025-11-12 10:13:24 -05:00
UPDATE Users
SET FirstName = @ firstName ,
LastName = @ lastName ,
DOB = @ dob
WHERE Username = @ username
` );
2026-01-25 01:36:32 -05:00
query . run ( {
username : req . user . Username ,
firstName : firstName ,
lastName : lastName ,
dob : dob || null
} ) ;
2025-11-12 10:13:24 -05:00
} catch ( error ) {
console . log ( error ) ;
2025-11-26 23:25:02 -05:00
if ( error . message . includes ( "failed for parameter 'dob'." ) ) {
res . status ( 500 ) . json ( { message : "Must input date of birth" } )
return ;
}
2025-11-12 10:13:24 -05:00
res . status ( 500 ) . json ( { message : "Update request failed" } )
2025-11-26 23:25:02 -05:00
return ;
2025-11-12 10:13:24 -05:00
}
2025-11-18 21:16:35 -05:00
var updatedUser = req . user ;
updatedUser . FirstName = firstName ;
updatedUser . LastName = lastName ;
updatedUser . DOB = dob ;
const token = jwt . sign ( updatedUser , JWT _SECRET ) ;
console . log ( "Issued token: " + JSON . stringify ( token ) )
res . status ( 200 ) . send ( {
success : true ,
message : "Information updated successfully" ,
token
} ) ;
2025-11-12 10:13:24 -05:00
} ) ;
app . post ( "/delete" , authenticate , async ( req , res ) => {
let { username , actor } = req . body ;
if ( username === true ) {
username = req . user . Username ;
}
if ( actor === true ) {
actor = req . user . Username ;
}
console . log ( ` Deleting user ${ username } ` ) ;
2026-01-25 01:36:32 -05:00
const query = ( "UPDATE Users SET IsDeleted = 1, DeletedAt = datetime('now'), DeletedBy = @actor WHERE Username = @username" ) ;
query . run ( {
username : username ,
actor : actor
} ) ;
2025-11-12 10:13:24 -05:00
console . log ( ` User ${ username } deleted ` ) ;
res . status ( 200 ) . json ( { message : ` User " ${ username } " deleted. ` } ) ;
} ) ;
async function authenticate ( req , res , next ) {
try {
const authenticationHeader = req . headers [ "authorization" ] ;
2025-11-18 21:16:35 -05:00
console . log ( "authenticationheader: " + authenticationHeader ) ;
2025-11-12 10:13:24 -05:00
const token = authenticationHeader . split ( " " ) [ 1 ] ;
console . log ( JSON . stringify ( authenticationHeader ) ) ;
const decoded = jwt . verify ( token , JWT _SECRET ) ;
req . user = decoded ;
console . log ( req . user ) ;
console . log ( decoded . Username + " authenticated" ) ;
} catch ( error ) {
console . log ( "Authentication header missing" ) ;
2025-11-18 21:16:35 -05:00
console . log ( error ) ;
2025-11-12 10:13:24 -05:00
res . status ( 401 ) . json ( { message : "You are not logged in" , error : error , logout : true } ) ;
return ;
}
next ( ) ;
}
2025-11-18 21:16:35 -05:00
app . get ( "/player/:id" , ( req , res ) => {
res . sendFile ( _ _dirname + "/public/player.html" ) ;
} )
app . get ( "/search" , ( req , res ) => {
res . sendFile ( _ _dirname + "/public/search.html" ) ;
} )
app . get ( "/home" , ( req , res ) => {
res . sendFile ( _ _dirname + "/public/home.html" ) ;
} )
app . get ( "/info" , ( req , res ) => {
res . sendFile ( _ _dirname + "/public/info.html" ) ;
} )
app . get ( "/register" , ( req , res ) => {
res . sendFile ( _ _dirname + "/public/register.html" ) ;
} )
app . get ( "/login" , ( req , res ) => {
res . sendFile ( _ _dirname + "/public/login.html" ) ;
} )
2026-01-25 01:36:32 -05:00
2025-11-12 10:13:24 -05:00
app . listen ( serverPort , "0.0.0.0" , ( ) => console . log ( ` Running ${ dev ? "dev " : "" } server on port ${ serverPort } ` ) ) ;
2026-01-25 01:36:32 -05:00