diff --git a/api/index.js b/api/index.js index c7284ca..9363abe 100644 --- a/api/index.js +++ b/api/index.js @@ -9,203 +9,15 @@ const app = express() app.use(cors()) app.use(express.json()) - const port = 3000; -const pool = require('./db') -app.post('/application', async (req, res) => { - try { - const App = req.body?.App || {}; - if (!app) return res.status(400).json({ error: 'Missing App payload' }); +// Mount route modules +const applicationsRouter = require('./routes/applications'); +const ranksRouter = require('./routes/ranks'); - // TODO: replace with current user ID - const memberId = 1; - - const sql = `INSERT INTO applications (member_id, app_version, app_data) VALUES (?, ?, ?);`; - const appVersion = 1; - - const params = [memberId, appVersion, JSON.stringify(App)] - - console.log(params) - - await pool.query(sql, params); - - res.sendStatus(201); - } catch (err) { - console.error('Insert failed:', err); - res.status(500).json({ error: 'Failed to save application' }); - } -}); - -app.get('/application/all', async (req, res) => { - try { - const sql = `SELECT - member.name AS member_name, - app.id, - app.member_id, - app.submitted_at, - app.app_status - FROM applications AS app - LEFT JOIN members AS member - ON member.id = app.member_id;` - - const rows = await pool.query(sql); - - res.status(200).json(rows); - } catch { - console.error(err); - res.status(500); - } -}); - -app.get('/application/:id', async (req, res) => { - let appID = req.params.id; - - //TODO: Replace with real user Authorization and whatnot - // if the application is not "me" and I am not a recruiter, deny access to the application (return 403 or whatever) - if (appID === "me") - appID = 2; - - try { - const conn = await pool.getConnection() - - const application = await conn.query( - `SELECT app.*, - member.name AS member_name - FROM applications AS app - INNER JOIN members AS member ON member.id = app.member_id - WHERE app.id = ?;`, - [appID] - ); - - if (!Array.isArray(application) || application.length === 0) { - conn.release(); - return res.status(204).json("Application Not Found"); - } - - const comments = await conn.query(`SELECT app.id AS comment_id, - app.post_content, - app.poster_id, - app.post_time, - app.last_modified, - member.name AS poster_name - FROM application_comments AS app - INNER JOIN members AS member ON member.id = app.poster_id - WHERE app.application_id = ?;`, - [appID]); - - conn.release() - - const output = { - application: application[0], - comments, - } - return res.status(200).json(output); - } - catch (err) { - console.error('Query failed:', err); - return res.status(500).json({ error: 'Failed to load application' }); - } -}) - -app.post('/application/approve/:id', async (req, res) => { - const appID = req.params.id; - - const sql = ` - UPDATE applications - SET approved_at = NOW() - WHERE id = ? - AND approved_at IS NULL - AND denied_at IS NULL - `; - try { - const result = await pool.execute(sql, appID); - - console.log(result); - - if (result.affectedRows === 0) { - res.status(400).json('Something went wrong approving the application'); - } - - if (result.affectedRows == 1) { - res.sendStatus(200); - } - - } catch (err) { - console.error('Approve failed:', err); - res.status(500).json({ error: 'Failed to approve application' }); - } -}); - -app.post('/application/deny/:id', async (req, res) => { - const appID = req.params.id; - - const sql = ` - UPDATE applications - SET denied_at = NOW() - WHERE id = ? - AND approved_at IS NULL - AND denied_at IS NULL - `; - try { - const result = await pool.execute(sql, appID); - - console.log(result); - - if (result.affectedRows === 0) { - res.status(400).json('Something went wrong denying the application'); - } - - if (result.affectedRows == 1) { - res.sendStatus(200); - } - - } catch (err) { - console.error('Approve failed:', err); - res.status(500).json({ error: 'Failed to deny application' }); - } -}); - -app.post('/application/:id/comment', async (req, res) => { - const appID = req.params.id; - const data = req.body.message; - const user = 1; - - const sql = `INSERT INTO application_comments( - application_id, - poster_id, - post_content - ) -VALUES(?, ?, ?);` - - try { - const conn = await pool.getConnection(); - - const result = await conn.query(sql, [appID, user, data]) - console.log(result) - if (result.affectedRows !== 1) { - conn.release(); - throw new Error("Insert Failure") - } - - const getSQL = `SELECT app.id AS comment_id, - app.post_content, - app.poster_id, - app.post_time, - app.last_modified, - member.name AS poster_name - FROM application_comments AS app - INNER JOIN members AS member ON member.id = app.poster_id - WHERE app.id = ?; `; - const comment = await conn.query(getSQL, [result.insertId]) - res.status(201).json(comment[0]); - - } catch (err) { - console.error('Comment failed:', err); - res.status(500).json({ error: 'Could not post comment' }); - } -}) +app.use('/application', applicationsRouter); +app.use('/ranks', ranksRouter); app.listen(port, () => { console.log(`Example app listening on port ${port} `) -}) \ No newline at end of file +}) diff --git a/api/routes/applications.js b/api/routes/applications.js new file mode 100644 index 0000000..939bbbd --- /dev/null +++ b/api/routes/applications.js @@ -0,0 +1,212 @@ +const express = require('express'); +const router = express.Router(); + +// DB pool (same as used in api/index.js) +const pool = require('../db'); + +// Keep any in-memory structures if needed (preserved from original file) +let applicationData = { + app: null, + messages: [], + status: null, +}; + +// POST /application +router.post('/', async (req, res) => { + try { + const App = req.body?.App || {}; + + // TODO: replace with current user ID + const memberId = 1; + + const sql = `INSERT INTO applications (member_id, app_version, app_data) VALUES (?, ?, ?);`; + const appVersion = 1; + + const params = [memberId, appVersion, JSON.stringify(App)] + + console.log(params) + + await pool.query(sql, params); + + res.sendStatus(201); + } catch (err) { + console.error('Insert failed:', err); + res.status(500).json({ error: 'Failed to save application' }); + } +}); + +// GET /application/all +router.get('/all', async (req, res) => { + try { + const sql = `SELECT + member.name AS member_name, + app.id, + app.member_id, + app.submitted_at, + app.app_status + FROM applications AS app + LEFT JOIN members AS member + ON member.id = app.member_id;` + + const rows = await pool.query(sql); + + res.status(200).json(rows); + } catch (err) { + console.error(err); + res.status(500); + } +}); + +// GET /application/:id +router.get('/:id', async (req, res) => { + let appID = req.params.id; + + //TODO: Replace with real user Authorization and whatnot + // if the application is not "me" and I am not a recruiter, deny access to the application (return 403 or whatever) + if (appID === "me") + appID = 2; + + try { + const conn = await pool.getConnection() + + const application = await conn.query( + `SELECT app.*, + member.name AS member_name + FROM applications AS app + INNER JOIN members AS member ON member.id = app.member_id + WHERE app.id = ?;`, + [appID] + ); + + if (!Array.isArray(application) || application.length === 0) { + conn.release(); + return res.status(204).json("Application Not Found"); + } + + const comments = await conn.query(`SELECT app.id AS comment_id, + app.post_content, + app.poster_id, + app.post_time, + app.last_modified, + member.name AS poster_name + FROM application_comments AS app + INNER JOIN members AS member ON member.id = app.poster_id + WHERE app.application_id = ?;`, + [appID]); + + conn.release() + + const output = { + application: application[0], + comments, + } + return res.status(200).json(output); + } + catch (err) { + console.error('Query failed:', err); + return res.status(500).json({ error: 'Failed to load application' }); + } +}); + +// POST /application/approve/:id +router.post('/approve/:id', async (req, res) => { + const appID = req.params.id; + + const sql = ` + UPDATE applications + SET approved_at = NOW() + WHERE id = ? + AND approved_at IS NULL + AND denied_at IS NULL + `; + try { + const result = await pool.execute(sql, appID); + + console.log(result); + + if (result.affectedRows === 0) { + res.status(400).json('Something went wrong approving the application'); + } + + if (result.affectedRows == 1) { + res.sendStatus(200); + } + + } catch (err) { + console.error('Approve failed:', err); + res.status(500).json({ error: 'Failed to approve application' }); + } +}); + +// POST /application/deny/:id +router.post('/deny/:id', async (req, res) => { + const appID = req.params.id; + + const sql = ` + UPDATE applications + SET denied_at = NOW() + WHERE id = ? + AND approved_at IS NULL + AND denied_at IS NULL + `; + try { + const result = await pool.execute(sql, appID); + + console.log(result); + + if (result.affectedRows === 0) { + res.status(400).json('Something went wrong denying the application'); + } + + if (result.affectedRows == 1) { + res.sendStatus(200); + } + + } catch (err) { + console.error('Approve failed:', err); + res.status(500).json({ error: 'Failed to deny application' }); + } +}); + +// POST /application/:id/comment +router.post('/:id/comment', async (req, res) => { + const appID = req.params.id; + const data = req.body.message; + const user = 1; + + const sql = `INSERT INTO application_comments( + application_id, + poster_id, + post_content + ) +VALUES(?, ?, ?);` + + try { + const conn = await pool.getConnection(); + + const result = await conn.query(sql, [appID, user, data]) + console.log(result) + if (result.affectedRows !== 1) { + conn.release(); + throw new Error("Insert Failure") + } + + const getSQL = `SELECT app.id AS comment_id, + app.post_content, + app.poster_id, + app.post_time, + app.last_modified, + member.name AS poster_name + FROM application_comments AS app + INNER JOIN members AS member ON member.id = app.poster_id + WHERE app.id = ?; `; + const comment = await conn.query(getSQL, [result.insertId]) + res.status(201).json(comment[0]); + + } catch (err) { + console.error('Comment failed:', err); + res.status(500).json({ error: 'Could not post comment' }); + } +}); + +module.exports = router; diff --git a/api/routes/ranks.js b/api/routes/ranks.js new file mode 100644 index 0000000..db30c5d --- /dev/null +++ b/api/routes/ranks.js @@ -0,0 +1,10 @@ +const express = require('express'); +const router = express.Router(); + +// Placeholder router for rank-related routes. +// Implement rank endpoints here, for example: +// router.get('/', async (req, res) => { /* ... */ }); +// router.post('/change', async (req, res) => { /* ... */ }); + +module.exports = router; +