Skip to content

Commit

Permalink
Yippie
Browse files Browse the repository at this point in the history
Adds some good stuff
  • Loading branch information
JTrenerry authored May 1, 2024
2 parents a57ec99 + 11c3816 commit 0192821
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 54 deletions.
50 changes: 24 additions & 26 deletions backend/db/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,43 +15,41 @@ const pool = new Pool({
export const setupTables = () => {
const query = `
CREATE TABLE IF NOT EXISTS courses (
courseCode VARCHAR(8) PRIMARY KEY,
courseName VARCHAR(100),
courseDescription TEXT
"courseCode" VARCHAR(8) PRIMARY KEY,
"courseName" VARCHAR(100),
"courseDescription" TEXT
);
CREATE TABLE IF NOT EXISTS exams (
examId SERIAL PRIMARY KEY,
courseCode VARCHAR(8) REFERENCES courses(courseCode),
examYear INTEGER,
examSemester Integer,
examType VARCHAR(20)
"examId" SERIAL PRIMARY KEY,
"courseCode" VARCHAR(8) REFERENCES courses("courseCode"),
"examYear" INTEGER,
"examSemester" Integer,
"examType" VARCHAR(20)
);
CREATE TABLE IF NOT EXISTS questions (
questionId SERIAL PRIMARY KEY,
examId INTEGER REFERENCES exams(examId),
questionText TEXT,
questionPng BYTEA,
questionType VARCHAR(20)
"questionId" SERIAL PRIMARY KEY,
"examId" INTEGER REFERENCES exams("examId"),
"questionText" TEXT,
"questionPNG" BYTEA,
"questionType" VARCHAR(20)
);
CREATE TABLE IF NOT EXISTS comments (
commentId SERIAL PRIMARY KEY,
questionId INTEGER REFERENCES questions(questionID),
parentCommentId INTEGER,
"commentId" SERIAL PRIMARY KEY,
"questionId" INTEGER REFERENCES questions("questionId"),
"parentCommentId" INTEGER,
commentText TEXT,
commentPNG BYTEA,
isCorrect BOOLEAN NOT NULL DEFAULT FALSE,
isEndorsed BOOLEAN NOT NULL DEFAULT FALSE,
upvotes INTEGER NOT NULL DEFAULT 0,
downvotes INTEGER NOT NULL DEFAULT 0,
"commentText" TEXT,
"commentPNG" BYTEA,
"isCorrect" BOOLEAN NOT NULL DEFAULT FALSE,
"isEndorsed" BOOLEAN NOT NULL DEFAULT FALSE,
"upvotes" INTEGER NOT NULL DEFAULT 0,
"downvotes" INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
"created_at" TIMESTAMP NOT NULL DEFAULT NOW(),
"updated_at" TIMESTAMP NOT NULL DEFAULT NOW()
);`;
pool.query(query);
}
Expand Down
118 changes: 90 additions & 28 deletions backend/routes/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ router.patch('/comments/:commentId/correct', async (req: Request, res: Response)
const commentId = req.params.commentId;
await db.query(`
UPDATE comments
SET iscorrect = true
WHERE commentId = $1
SET "isCorrect" = true
WHERE "commentId" = $1
`, [commentId]);
res.status(200).json('Corrected!');
});
Expand All @@ -69,8 +69,8 @@ router.patch('/comments/:commentId/endorse', async (req: Request, res: Response)
const commentId = req.params.commentId;
await db.query(`
UPDATE comments
SET isendorsed = true
WHERE commentId = $1
SET "isEndorsed" = true
WHERE "commentId" = $1
`, [commentId]);
res.status(200).json('Endorsed!');
});
Expand All @@ -80,8 +80,8 @@ router.patch('/comments/:commentId/downvote', async (req: Request, res: Response
const commentId = req.params.commentId;
await db.query(`
UPDATE comments
SET downvotes = downvotes + 1
WHERE commentId = $1
SET "downvotes" = "downvotes" + 1
WHERE "commentId" = $1
`, [commentId]);
res.status(200).json('Downvoted!');
});
Expand All @@ -91,8 +91,8 @@ router.patch('/comments/:commentId/upvote', async (req: Request, res: Response)
const commentId = req.params.commentId;
await db.query(`
UPDATE comments
SET upvotes = upvotes + 1
WHERE commentId = $1
SET "upvotes" = "upvotes" + 1
WHERE "commentId" = $1
`, [commentId]);
res.status(200).json('Upvoted!');
});
Expand All @@ -109,7 +109,7 @@ router.patch('/comments/:commentId/upvote', async (req: Request, res: Response)
router.post('/comments', async (req: Request, res: Response) => {
const { parentCommentId, commentText, commentPNG, isCorrect, isEndorsed, upvotes, downvotes } = req.body;
await db.query(`
INSERT INTO comments (parentCommentId, commentText, commentPNG, isCorrect, isEndorsed, upvotes, downvotes)
INSERT INTO comments ("parentCommentId", "commentText", "commentPNG", "isCorrect", "isEndorsed", "upvotes", "downvotes")
VALUES ($1, $2, $3, $4, $5, $6, $7)
`, [parentCommentId, commentText, commentPNG, isCorrect, isEndorsed, upvotes, downvotes]);
res.status(201).json('Comment Added!');
Expand All @@ -119,7 +119,7 @@ router.post('/comments', async (req: Request, res: Response) => {
router.post('/questions', async (req: Request, res: Response) => {
const { examId, questionText, questionType, questionPNG } = req.body;
await db.query(`
INSERT INTO questions (examId, questionText, questionType, questionPNG)
INSERT INTO questions ("examId", "questionText", "questionType", "questionPNG")
VALUES ($1, $2, $3, $4)
`, [examId, questionText, questionType, questionPNG]);
res.status(201).json('Question Added!');
Expand All @@ -129,7 +129,7 @@ router.post('/questions', async (req: Request, res: Response) => {
router.post('/exams', async (req: Request, res: Response) => {
const { examYear, examSemester, examType, courseCode } = req.body;
await db.query(`
INSERT INTO exams (examYear, examSemester, examType, courseCode)
INSERT INTO exams ("examYear", "examSemester", "examType", "courseCode")
VALUES ($1, $2, $3, $4)
`, [examYear, examSemester, examType, courseCode]);
res.status(201).json('Exam Added!');
Expand All @@ -139,7 +139,7 @@ router.post('/exams', async (req: Request, res: Response) => {
router.post('/courses', async (req: Request, res: Response) => {
const { courseCode, courseName, courseDescription } = req.body;
await db.query(`
INSERT INTO courses (courseCode, courseName, courseDescription)
INSERT INTO courses ("courseCode", "courseName", "courseDescription")
VALUES ($1, $2, $3)
`, [courseCode, courseName, courseDescription]);
res.status(201).json('Course Added!');
Expand All @@ -157,9 +157,9 @@ router.post('/courses', async (req: Request, res: Response) => {
router.get('/comments/:commentId', async (req: Request, res: Response) => {
const commentId = req.params.commentId;
const comment = await db.query(`
SELECT commentId, parentCommentId, commenttext, commentpng, iscorrect, isendorsed, upvotes, downvotes, created_at, updated_at
SELECT "commentId", "parentCommentId", "commentText", "commentPNG", "isCorrect", "isEndorsed", "upvotes", "downvotes", "created_at", "updated_at"
FROM comments
WHERE comments.commentId = $1
WHERE comments."commentId" = $1
`, [commentId]);
res.status(200).json(comment.rows[0]);
});
Expand All @@ -168,9 +168,9 @@ router.get('/comments/:commentId', async (req: Request, res: Response) => {
router.get('/questions/:questionId/comments', async (req: Request, res: Response) => {
const questionId = req.params.questionId;
const question = await db.query(`
SELECT commentId, parentCommentId, commenttext, commentpng, iscorrect, isendorsed, upvotes, downvotes, created_at, updated_at
SELECT "commentId", "parentCommentId", "commentText", "commentPNG", "isCorrect", "isEndorsed", "upvotes", "downvotes", "created_at", "updated_at"
FROM comments
WHERE comments.questionId = $1
WHERE comments."questionId" = $1
`, [questionId]);
res.status(200).json(nest(question.rows));
});
Expand All @@ -179,9 +179,9 @@ router.get('/questions/:questionId/comments', async (req: Request, res: Response
router.get('/questions/:questionId', async (req: Request, res: Response) => {
const questionId = req.params.questionId;
const question = await db.query(`
SELECT questionId, questionText, questionType, questionPNG
SELECT "questionId", "questionText", "questionType", "questionPNG"
FROM questions
WHERE questions.questionId = $1
WHERE questions."questionId" = $1
`, [questionId]);
res.status(200).json(question.rows[0]);
});
Expand All @@ -190,9 +190,9 @@ router.get('/questions/:questionId', async (req: Request, res: Response) => {
router.get('/exams/:examId/questions', async (req: Request, res: Response) => {
const examId = req.params.examId;
const exam = await db.query(`
SELECT questionId, questionText, questionType, questionPNG
SELECT "questionId", "questionText", "questionType", "questionPNG"
FROM questions
WHERE questions.examId = $1
WHERE questions."examId" = $1
`, [examId]);
res.status(200).json(exam.rows);
});
Expand All @@ -201,9 +201,9 @@ router.get('/exams/:examId/questions', async (req: Request, res: Response) => {
router.get('/exams/:examId', async (req: Request, res: Response) => {
const examId = req.params.examId;
const exams = await db.query(`
SELECT examId, examYear, examSemester, examType
SELECT "examId", "examYear", "examSemester", "examType"
FROM exams
WHERE exams.examId = $1
WHERE exams."examId" = $1
`, [examId]);
res.status(200).json(exams.rows[0]);
});
Expand All @@ -212,9 +212,9 @@ router.get('/exams/:examId', async (req: Request, res: Response) => {
router.get('/courses/:courseCode/exams', async (req: Request, res: Response) => {
const courseCode = req.params.courseCode;
const course = await db.query(`
SELECT examId, examYear, examSemester, examType
SELECT "examId", "examYear", "examSemester", "examType"
FROM exams
WHERE exams.courseCode = $1
WHERE exams."courseCode" = $1
`, [courseCode]);
res.status(200).json(course.rows);
});
Expand All @@ -223,9 +223,9 @@ router.get('/courses/:courseCode/exams', async (req: Request, res: Response) =>
router.get('/courses/:courseCode', async (req: Request, res: Response) => {
const courseCode = req.params.courseCode;
const course = await db.query(`
SELECT courseCode, courseName, courseDescription
SELECT "courseCode", "courseName", "courseDescription"
FROM courses
WHERE courses.courseCode = $1
WHERE courses."courseCode" = $1
`, [courseCode]);
res.status(200).json(course.rows[0]);
});
Expand All @@ -235,7 +235,7 @@ router.get('/courses', async (req: Request, res: Response) => {
const offet = req.query.offset ?? 0;
const limit = req.query.limit ?? 100;
const courses = await db.query(`
SELECT courseCode, courseName, courseDescription
SELECT "courseCode", "courseName", "courseDescription"
FROM courses
LIMIT $1
OFFSET $2
Expand All @@ -258,6 +258,69 @@ router.get('/evan', async (req: Request, res: Response) => {
res.status(200).json('Evan is the best');
});

// The sketch route
router.get('/sketch', async (req: Request, res: Response) => {
const b = await db.query1('SELECT * FROM courses')
if (b.rows.length != 0) {
return
}

await db.query1(`
INSERT INTO courses ("courseCode", "courseName", "courseDescription")
VALUES
('ENGG1001', 'Programming for Engineers', 'An introductory course covering basic concepts of software engineering.'),
('MATH1051', 'Calculus & Linear Algebra', 'A foundational course in calculus covering limits, derivatives, and integrals.'),
('ENGG1100', 'Professional Engineering', 'An introductory course covering fundamental concepts in engineering principles.');
INSERT INTO exams ("courseCode", "examYear", "examSemester", "examType")
VALUES
('ENGG1001', 2021, 1, 'Final'),
('ENGG1001', 2022, 1, 'Final'),
('ENGG1001', 2023, 1, 'Final'),
('MATH1051', 2021, 1, 'Midterm'),
('MATH1051', 2021, 1, 'Final'),
('MATH1051', 2021, 2, 'Midterm'),
('MATH1051', 2021, 2, 'Final'),
('MATH1051', 2021, 3, 'Midterm'),
('MATH1051', 2021, 3, 'Final'),
('MATH1051', 2022, 1, 'Midterm'),
('MATH1051', 2022, 1, 'Final'),
('MATH1051', 2022, 2, 'Midterm'),
('MATH1051', 2022, 2, 'Final'),
('MATH1051', 2022, 3, 'Midterm'),
('MATH1051', 2022, 3, 'Final'),
('MATH1051', 2023, 1, 'Midterm'),
('MATH1051', 2023, 1, 'Final'),
('MATH1051', 2023, 2, 'Midterm'),
('MATH1051', 2023, 2, 'Final'),
('MATH1051', 2023, 3, 'Midterm'),
('MATH1051', 2023, 3, 'Final');
INSERT INTO questions ("examId", "questionText", "questionType")
VALUES
(1, 'Who is the best tutor at UQ?', 'Multiple Choice'),
(2, 'Who is not the best tutor at UQ?', 'Multiple Choice'),
(3, 'Who is the second best tutor at UQ?', 'Multiple Choice');
INSERT INTO comments ("questionId", "parentCommentId", "commentText", "isCorrect", "isEndorsed", "upvotes", "downvotes")
VALUES
(1, NULL, 'Evan Hughes', TRUE, TRUE, 100, 1),
(1, 1, 'Are you stupid it is clearly Liv Ronda', FALSE, FALSE, 0, 100),
(1, 2, 'Bro went to stupid school L', FALSE, TRUE, 999, 1),
(1, 1, 'Fax what a goat', FALSE, FALSE, 80, 1),
(2, NULL, 'Not Evan Hughes cause he is the best', TRUE, TRUE, 100, 1),
(2, 5, 'Facts it is clearly Liv Ronda because she is the worst', TRUE, TRUE, 999, 0),
(2, 6, 'ong', FALSE, TRUE, 9, 1),
(2, 5, 'Fax what a goat', FALSE, FALSE, 80, 1),
(3, NULL, 'Not Evan Hughes cause he is the best', TRUE, TRUE, 100, 1),
(3, 9, 'TRUEEE!!!', TRUE, TRUE, 999, 0),
(3, 10, 'ong', FALSE, TRUE, 9, 1),
(3, 9, 'Fax what a goat', FALSE, FALSE, 80, 1);
`);
res.status(200).json(`THIS SHIT SKETCH ASF AND WAS LIV'S IDEA!!!`);
});
// Interfaces

// Used in nest helper function
Expand Down Expand Up @@ -323,4 +386,3 @@ export function single_nest(jsonData: any[], commentId: number) {
const resultJsonData = jsonData.filter(item => item.commentId === commentId);
return resultJsonData;
}

3 changes: 3 additions & 0 deletions kill.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/bash
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

0 comments on commit 0192821

Please sign in to comment.